From 345e6d5c2ad59549c69f818e3bd0c82b0a81971d Mon Sep 17 00:00:00 2001 From: andyeisenberg Date: Thu, 9 Apr 2026 10:23:50 -0400 Subject: [PATCH] Latest build deployed. --- course/.mapping.json | 2 +- course/Exam-1-Review.html | 9 +- course/Exam-2-Review.html | 9 +- course/_static/._009b407a9881be10.ttf | Bin 163 -> 163 bytes course/_static/._009b407a9881be10.ttf.gz | Bin 163 -> 163 bytes course/_static/._126.a976f62852f30b51.js | Bin 163 -> 163 bytes course/_static/._126.a976f62852f30b51.js.gz | Bin 163 -> 163 bytes course/_static/._126.a976f62852f30b51.js.map | Bin 163 -> 163 bytes .../_static/._126.a976f62852f30b51.js.map.gz | Bin 163 -> 163 bytes course/_static/._128.5bed857c54ac4e8b.js | Bin 163 -> 163 bytes course/_static/._128.5bed857c54ac4e8b.js.gz | Bin 163 -> 163 bytes course/_static/._128.5bed857c54ac4e8b.js.map | Bin 163 -> 163 bytes .../_static/._128.5bed857c54ac4e8b.js.map.gz | Bin 163 -> 163 bytes course/_static/._131.ee437eeefadd750d.js | Bin 163 -> 163 bytes course/_static/._131.ee437eeefadd750d.js.gz | Bin 163 -> 163 bytes course/_static/._131.ee437eeefadd750d.js.map | Bin 163 -> 163 bytes .../_static/._131.ee437eeefadd750d.js.map.gz | Bin 163 -> 163 bytes course/_static/._168.fe63e6dec2d06468.js | Bin 163 -> 163 bytes course/_static/._168.fe63e6dec2d06468.js.gz | Bin 163 -> 163 bytes course/_static/._168.fe63e6dec2d06468.js.map | Bin 163 -> 163 bytes .../_static/._168.fe63e6dec2d06468.js.map.gz | Bin 163 -> 163 bytes course/_static/._186.be52164d57f4b7e4.js | Bin 163 -> 163 bytes course/_static/._186.be52164d57f4b7e4.js.gz | Bin 163 -> 163 bytes course/_static/._186.be52164d57f4b7e4.js.map | Bin 163 -> 163 bytes .../_static/._186.be52164d57f4b7e4.js.map.gz | Bin 163 -> 163 bytes course/_static/._207.3a19748be8bb18ba.js | Bin 0 -> 163 bytes .../._207.3a19748be8bb18ba.js.LICENSE.txt | Bin 0 -> 163 bytes course/_static/._207.3a19748be8bb18ba.js.gz | Bin 0 -> 163 bytes course/_static/._207.3a19748be8bb18ba.js.map | Bin 0 -> 163 bytes .../_static/._207.3a19748be8bb18ba.js.map.gz | Bin 0 -> 163 bytes course/_static/._249.7ec032cf0b3ede9a.js | Bin 163 -> 163 bytes .../._249.7ec032cf0b3ede9a.js.LICENSE.txt | Bin 163 -> 163 bytes .../._249.7ec032cf0b3ede9a.js.LICENSE.txt.gz | Bin 163 -> 163 bytes course/_static/._249.7ec032cf0b3ede9a.js.gz | Bin 163 -> 163 bytes course/_static/._249.7ec032cf0b3ede9a.js.map | Bin 163 -> 163 bytes .../_static/._249.7ec032cf0b3ede9a.js.map.gz | Bin 163 -> 163 bytes course/_static/._268.60719f20e69f885e.js | Bin 163 -> 163 bytes course/_static/._268.60719f20e69f885e.js.gz | Bin 163 -> 163 bytes course/_static/._268.60719f20e69f885e.js.map | Bin 163 -> 163 bytes .../_static/._268.60719f20e69f885e.js.map.gz | Bin 163 -> 163 bytes course/_static/._28.bb005543f41af5fb.js | Bin 163 -> 163 bytes .../._28.bb005543f41af5fb.js.LICENSE.txt | Bin 163 -> 163 bytes course/_static/._28.bb005543f41af5fb.js.gz | Bin 163 -> 163 bytes course/_static/._28.bb005543f41af5fb.js.map | Bin 163 -> 163 bytes .../_static/._28.bb005543f41af5fb.js.map.gz | Bin 163 -> 163 bytes course/_static/._296.37eb8c05642d8ef9.js | Bin 163 -> 163 bytes course/_static/._296.37eb8c05642d8ef9.js.gz | Bin 163 -> 163 bytes course/_static/._296.37eb8c05642d8ef9.js.map | Bin 163 -> 163 bytes .../_static/._296.37eb8c05642d8ef9.js.map.gz | Bin 163 -> 163 bytes course/_static/._340.c525bd899366c5f9.js | Bin 163 -> 163 bytes course/_static/._340.c525bd899366c5f9.js.gz | Bin 163 -> 163 bytes course/_static/._340.c525bd899366c5f9.js.map | Bin 163 -> 163 bytes .../_static/._340.c525bd899366c5f9.js.map.gz | Bin 163 -> 163 bytes course/_static/._357.a6fa55aea0c38a63.js | Bin 163 -> 163 bytes .../._357.a6fa55aea0c38a63.js.LICENSE.txt | Bin 163 -> 163 bytes .../._357.a6fa55aea0c38a63.js.LICENSE.txt.gz | Bin 163 -> 163 bytes course/_static/._357.a6fa55aea0c38a63.js.gz | Bin 163 -> 163 bytes course/_static/._357.a6fa55aea0c38a63.js.map | Bin 163 -> 163 bytes .../_static/._357.a6fa55aea0c38a63.js.map.gz | Bin 163 -> 163 bytes course/_static/._39.15b22d3dac60149d.js | Bin 163 -> 163 bytes .../._39.15b22d3dac60149d.js.LICENSE.txt | Bin 163 -> 163 bytes course/_static/._39.15b22d3dac60149d.js.gz | Bin 163 -> 163 bytes course/_static/._39.15b22d3dac60149d.js.map | Bin 163 -> 163 bytes .../_static/._39.15b22d3dac60149d.js.map.gz | Bin 163 -> 163 bytes course/_static/._412.5965503d81003593.js | Bin 163 -> 163 bytes course/_static/._412.5965503d81003593.js.gz | Bin 163 -> 163 bytes course/_static/._412.5965503d81003593.js.map | Bin 163 -> 163 bytes .../_static/._412.5965503d81003593.js.map.gz | Bin 163 -> 163 bytes course/_static/._420.e197c63136060d40.js | Bin 163 -> 163 bytes .../._420.e197c63136060d40.js.LICENSE.txt | Bin 163 -> 163 bytes course/_static/._420.e197c63136060d40.js.gz | Bin 163 -> 163 bytes course/_static/._420.e197c63136060d40.js.map | Bin 163 -> 163 bytes .../_static/._420.e197c63136060d40.js.map.gz | Bin 163 -> 163 bytes course/_static/._442.f48919e396acaa18.js | Bin 163 -> 163 bytes course/_static/._442.f48919e396acaa18.js.gz | Bin 163 -> 163 bytes course/_static/._442.f48919e396acaa18.js.map | Bin 163 -> 163 bytes .../_static/._442.f48919e396acaa18.js.map.gz | Bin 163 -> 163 bytes course/_static/._460.bae9001422d7a484.js | Bin 163 -> 163 bytes course/_static/._460.bae9001422d7a484.js.gz | Bin 163 -> 163 bytes course/_static/._460.bae9001422d7a484.js.map | Bin 163 -> 163 bytes .../_static/._460.bae9001422d7a484.js.map.gz | Bin 163 -> 163 bytes course/_static/._466.63840a83388af9f2.js | Bin 163 -> 163 bytes course/_static/._466.63840a83388af9f2.js.gz | Bin 163 -> 163 bytes course/_static/._466.63840a83388af9f2.js.map | Bin 163 -> 163 bytes .../_static/._466.63840a83388af9f2.js.map.gz | Bin 163 -> 163 bytes course/_static/._486.b03e25ab1e190440.js | Bin 163 -> 163 bytes course/_static/._486.b03e25ab1e190440.js.gz | Bin 163 -> 163 bytes course/_static/._486.b03e25ab1e190440.js.map | Bin 163 -> 163 bytes .../_static/._486.b03e25ab1e190440.js.map.gz | Bin 163 -> 163 bytes course/_static/._4ba85deaf3670942.woff | Bin 163 -> 163 bytes course/_static/._529.f5fdfcbb88388877.js | Bin 163 -> 163 bytes course/_static/._529.f5fdfcbb88388877.js.gz | Bin 163 -> 163 bytes course/_static/._529.f5fdfcbb88388877.js.map | Bin 163 -> 163 bytes .../_static/._529.f5fdfcbb88388877.js.map.gz | Bin 163 -> 163 bytes course/_static/._566.8345f32fac0929c0.js | Bin 163 -> 163 bytes course/_static/._566.8345f32fac0929c0.js.gz | Bin 163 -> 163 bytes course/_static/._566.8345f32fac0929c0.js.map | Bin 163 -> 163 bytes .../_static/._566.8345f32fac0929c0.js.map.gz | Bin 163 -> 163 bytes course/_static/._576.17e80ff72c52b54b.js | Bin 163 -> 163 bytes course/_static/._576.17e80ff72c52b54b.js.gz | Bin 163 -> 163 bytes course/_static/._576.17e80ff72c52b54b.js.map | Bin 163 -> 163 bytes .../_static/._576.17e80ff72c52b54b.js.map.gz | Bin 163 -> 163 bytes course/_static/._580.28428521d8f13ec7.js | Bin 163 -> 163 bytes course/_static/._580.28428521d8f13ec7.js.gz | Bin 163 -> 163 bytes course/_static/._580.28428521d8f13ec7.js.map | Bin 163 -> 163 bytes .../_static/._580.28428521d8f13ec7.js.map.gz | Bin 163 -> 163 bytes course/_static/._616.89f80a32caf41aef.js | Bin 163 -> 163 bytes course/_static/._616.89f80a32caf41aef.js.gz | Bin 163 -> 163 bytes course/_static/._616.89f80a32caf41aef.js.map | Bin 163 -> 163 bytes .../_static/._616.89f80a32caf41aef.js.map.gz | Bin 163 -> 163 bytes course/_static/._625.120987bdd5293ae3.js | Bin 163 -> 163 bytes .../._625.120987bdd5293ae3.js.LICENSE.txt | Bin 163 -> 163 bytes .../._625.120987bdd5293ae3.js.LICENSE.txt.gz | Bin 163 -> 163 bytes course/_static/._625.120987bdd5293ae3.js.gz | Bin 163 -> 163 bytes course/_static/._625.120987bdd5293ae3.js.map | Bin 163 -> 163 bytes .../_static/._625.120987bdd5293ae3.js.map.gz | Bin 163 -> 163 bytes course/_static/._640.cbc8d3a34deb8837.js | Bin 163 -> 163 bytes course/_static/._640.cbc8d3a34deb8837.js.map | Bin 163 -> 163 bytes .../_static/._640.cbc8d3a34deb8837.js.map.gz | Bin 163 -> 163 bytes course/_static/._662.e77a89c65303c376.js | Bin 163 -> 163 bytes course/_static/._662.e77a89c65303c376.js.gz | Bin 163 -> 163 bytes course/_static/._662.e77a89c65303c376.js.map | Bin 163 -> 163 bytes .../_static/._662.e77a89c65303c376.js.map.gz | Bin 163 -> 163 bytes course/_static/._680.eb99211d1806dba1.js | Bin 163 -> 163 bytes course/_static/._680.eb99211d1806dba1.js.gz | Bin 163 -> 163 bytes course/_static/._680.eb99211d1806dba1.js.map | Bin 163 -> 163 bytes .../_static/._680.eb99211d1806dba1.js.map.gz | Bin 163 -> 163 bytes course/_static/._759.7032c311ffc20fc3.js | Bin 163 -> 163 bytes course/_static/._759.7032c311ffc20fc3.js.gz | Bin 163 -> 163 bytes course/_static/._759.7032c311ffc20fc3.js.map | Bin 163 -> 163 bytes .../_static/._759.7032c311ffc20fc3.js.map.gz | Bin 163 -> 163 bytes course/_static/._764.c33a81cafe63d2b6.js | Bin 163 -> 163 bytes .../._764.c33a81cafe63d2b6.js.LICENSE.txt | Bin 163 -> 163 bytes .../._764.c33a81cafe63d2b6.js.LICENSE.txt.gz | Bin 163 -> 163 bytes course/_static/._764.c33a81cafe63d2b6.js.gz | Bin 163 -> 163 bytes course/_static/._764.c33a81cafe63d2b6.js.map | Bin 163 -> 163 bytes .../_static/._764.c33a81cafe63d2b6.js.map.gz | Bin 163 -> 163 bytes course/_static/._770.7bd6d39128dde910.js | Bin 163 -> 163 bytes .../._770.7bd6d39128dde910.js.LICENSE.txt | Bin 163 -> 163 bytes .../._770.7bd6d39128dde910.js.LICENSE.txt.gz | Bin 163 -> 163 bytes course/_static/._770.7bd6d39128dde910.js.gz | Bin 163 -> 163 bytes course/_static/._770.7bd6d39128dde910.js.map | Bin 163 -> 163 bytes .../_static/._770.7bd6d39128dde910.js.map.gz | Bin 163 -> 163 bytes course/_static/._7a0f4b092e86cb52.eot | Bin 163 -> 163 bytes course/_static/._817.3438cd0f1b0f98bc.js | Bin 163 -> 163 bytes course/_static/._817.3438cd0f1b0f98bc.js.gz | Bin 163 -> 163 bytes course/_static/._817.3438cd0f1b0f98bc.js.map | Bin 163 -> 163 bytes .../_static/._817.3438cd0f1b0f98bc.js.map.gz | Bin 163 -> 163 bytes course/_static/._819.a9dba7a670e07497.js | Bin 163 -> 163 bytes course/_static/._819.a9dba7a670e07497.js.gz | Bin 163 -> 163 bytes course/_static/._819.a9dba7a670e07497.js.map | Bin 163 -> 163 bytes .../_static/._819.a9dba7a670e07497.js.map.gz | Bin 163 -> 163 bytes course/_static/._824.4343b78afc34c12f.js | Bin 163 -> 163 bytes course/_static/._824.4343b78afc34c12f.js.gz | Bin 163 -> 163 bytes course/_static/._824.4343b78afc34c12f.js.map | Bin 163 -> 163 bytes .../_static/._824.4343b78afc34c12f.js.map.gz | Bin 163 -> 163 bytes course/_static/._85f0466cb4ab3a4d.svg | Bin 163 -> 163 bytes course/_static/._85f0466cb4ab3a4d.svg.gz | Bin 163 -> 163 bytes course/_static/._877.c2f5ef32dd94b9b6.js | Bin 0 -> 163 bytes course/_static/._877.c2f5ef32dd94b9b6.js.gz | Bin 0 -> 163 bytes course/_static/._877.c2f5ef32dd94b9b6.js.map | Bin 0 -> 163 bytes .../_static/._877.c2f5ef32dd94b9b6.js.map.gz | Bin 0 -> 163 bytes course/_static/._915.8f500bccc86f901d.js | Bin 163 -> 163 bytes course/_static/._915.8f500bccc86f901d.js.gz | Bin 163 -> 163 bytes course/_static/._915.8f500bccc86f901d.js.map | Bin 163 -> 163 bytes .../_static/._915.8f500bccc86f901d.js.map.gz | Bin 163 -> 163 bytes course/_static/._919.4801fda4dafcc487.js | Bin 163 -> 163 bytes course/_static/._919.4801fda4dafcc487.js.gz | Bin 163 -> 163 bytes course/_static/._919.4801fda4dafcc487.js.map | Bin 163 -> 163 bytes .../_static/._919.4801fda4dafcc487.js.map.gz | Bin 163 -> 163 bytes course/_static/._b70781972ce7320b.woff2 | Bin 163 -> 163 bytes .../_static/._prefix-131.b184379d0dc5871b.css | Bin 163 -> 163 bytes .../._prefix-131.b184379d0dc5871b.css.gz | Bin 163 -> 163 bytes .../._prefix-131.b184379d0dc5871b.css.map | Bin 163 -> 163 bytes .../._prefix-131.b184379d0dc5871b.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-168.1c4deaed00ca1f5e.css | Bin 163 -> 163 bytes .../._prefix-168.1c4deaed00ca1f5e.css.gz | Bin 163 -> 163 bytes .../._prefix-168.1c4deaed00ca1f5e.css.map | Bin 163 -> 163 bytes .../._prefix-168.1c4deaed00ca1f5e.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-186.0d47de180767fda9.css | Bin 163 -> 163 bytes .../._prefix-186.0d47de180767fda9.css.map | Bin 163 -> 163 bytes .../._prefix-186.0d47de180767fda9.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-198.86b6b2a70a576922.css | Bin 163 -> 163 bytes .../._prefix-198.86b6b2a70a576922.css.gz | Bin 163 -> 163 bytes .../._prefix-198.86b6b2a70a576922.css.map | Bin 163 -> 163 bytes .../._prefix-198.86b6b2a70a576922.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-249.6ca19da539a8ed1a.css | Bin 163 -> 163 bytes .../._prefix-249.6ca19da539a8ed1a.css.gz | Bin 163 -> 163 bytes .../._prefix-249.6ca19da539a8ed1a.css.map | Bin 163 -> 163 bytes .../._prefix-249.6ca19da539a8ed1a.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-268.67f2441667bc7c43.css | Bin 163 -> 163 bytes .../._prefix-268.67f2441667bc7c43.css.gz | Bin 163 -> 163 bytes .../._prefix-268.67f2441667bc7c43.css.map | Bin 163 -> 163 bytes .../._prefix-268.67f2441667bc7c43.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-294.986bf74bfa4ccbd4.css | Bin 163 -> 163 bytes .../._prefix-294.986bf74bfa4ccbd4.css.gz | Bin 163 -> 163 bytes .../._prefix-294.986bf74bfa4ccbd4.css.map | Bin 163 -> 163 bytes .../._prefix-294.986bf74bfa4ccbd4.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-350.dbca9271f6e2dfbf.css | Bin 163 -> 163 bytes .../._prefix-350.dbca9271f6e2dfbf.css.gz | Bin 163 -> 163 bytes .../._prefix-350.dbca9271f6e2dfbf.css.map | Bin 163 -> 163 bytes .../._prefix-350.dbca9271f6e2dfbf.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-380.67748940131a4a84.css | Bin 163 -> 163 bytes .../._prefix-380.67748940131a4a84.css.map | Bin 163 -> 163 bytes .../._prefix-380.67748940131a4a84.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-39.ec5d93a85cddac28.css | Bin 163 -> 163 bytes .../._prefix-39.ec5d93a85cddac28.css.gz | Bin 163 -> 163 bytes .../._prefix-39.ec5d93a85cddac28.css.map | Bin 163 -> 163 bytes .../._prefix-39.ec5d93a85cddac28.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-412.25f3c4ff23eb9893.css | Bin 163 -> 163 bytes .../._prefix-412.25f3c4ff23eb9893.css.gz | Bin 163 -> 163 bytes .../._prefix-412.25f3c4ff23eb9893.css.map | Bin 163 -> 163 bytes .../._prefix-412.25f3c4ff23eb9893.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-442.6ae0ea584f8e75c5.css | Bin 163 -> 163 bytes .../._prefix-442.6ae0ea584f8e75c5.css.gz | Bin 163 -> 163 bytes .../._prefix-442.6ae0ea584f8e75c5.css.map | Bin 163 -> 163 bytes .../._prefix-442.6ae0ea584f8e75c5.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-460.7c0b70502d117f7d.css | Bin 163 -> 163 bytes .../._prefix-460.7c0b70502d117f7d.css.map | Bin 163 -> 163 bytes .../_static/._prefix-486.958d128f4cca3039.css | Bin 0 -> 163 bytes .../._prefix-486.958d128f4cca3039.css.gz | Bin 0 -> 163 bytes .../._prefix-486.958d128f4cca3039.css.map | Bin 0 -> 163 bytes .../._prefix-486.958d128f4cca3039.css.map.gz | Bin 0 -> 163 bytes .../_static/._prefix-576.9b1852878840651d.css | Bin 163 -> 163 bytes .../._prefix-576.9b1852878840651d.css.gz | Bin 163 -> 163 bytes .../._prefix-576.9b1852878840651d.css.map | Bin 163 -> 163 bytes .../._prefix-576.9b1852878840651d.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-580.22958d4327b0425a.css | Bin 163 -> 163 bytes .../._prefix-580.22958d4327b0425a.css.gz | Bin 163 -> 163 bytes .../._prefix-580.22958d4327b0425a.css.map | Bin 163 -> 163 bytes .../._prefix-580.22958d4327b0425a.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-616.5c78f604ddad1ec0.css | Bin 163 -> 163 bytes .../._prefix-616.5c78f604ddad1ec0.css.gz | Bin 163 -> 163 bytes .../._prefix-616.5c78f604ddad1ec0.css.map | Bin 163 -> 163 bytes .../._prefix-616.5c78f604ddad1ec0.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-621.8c109e297bdd8ce7.css | Bin 163 -> 163 bytes .../._prefix-621.8c109e297bdd8ce7.css.gz | Bin 163 -> 163 bytes .../._prefix-621.8c109e297bdd8ce7.css.map | Bin 163 -> 163 bytes .../._prefix-621.8c109e297bdd8ce7.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-723.3bccd435914aa0ff.css | Bin 163 -> 163 bytes .../._prefix-723.3bccd435914aa0ff.css.gz | Bin 163 -> 163 bytes .../._prefix-723.3bccd435914aa0ff.css.map | Bin 163 -> 163 bytes .../._prefix-723.3bccd435914aa0ff.css.map.gz | Bin 163 -> 163 bytes .../._prefix-723.3e6434f80549315a.bundle.js | Bin 163 -> 163 bytes ...723.3e6434f80549315a.bundle.js.LICENSE.txt | Bin 163 -> 163 bytes ....3e6434f80549315a.bundle.js.LICENSE.txt.gz | Bin 163 -> 163 bytes ...._prefix-723.3e6434f80549315a.bundle.js.gz | Bin 163 -> 163 bytes ..._prefix-723.3e6434f80549315a.bundle.js.map | Bin 163 -> 163 bytes ...efix-723.3e6434f80549315a.bundle.js.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-737.cf869b6ea8bfad2f.css | Bin 163 -> 163 bytes .../._prefix-737.cf869b6ea8bfad2f.css.gz | Bin 163 -> 163 bytes .../._prefix-737.cf869b6ea8bfad2f.css.map | Bin 163 -> 163 bytes .../._prefix-737.cf869b6ea8bfad2f.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-824.271ae6cff6401ed5.css | Bin 163 -> 163 bytes .../._prefix-824.271ae6cff6401ed5.css.gz | Bin 163 -> 163 bytes .../._prefix-824.271ae6cff6401ed5.css.map | Bin 163 -> 163 bytes .../._prefix-824.271ae6cff6401ed5.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-850.e86d03c2cec75438.css | Bin 163 -> 163 bytes .../._prefix-850.e86d03c2cec75438.css.gz | Bin 163 -> 163 bytes .../._prefix-850.e86d03c2cec75438.css.map | Bin 163 -> 163 bytes .../._prefix-850.e86d03c2cec75438.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-877.5cc60d2dc82dc67b.css | Bin 163 -> 163 bytes .../._prefix-877.5cc60d2dc82dc67b.css.gz | Bin 163 -> 163 bytes .../._prefix-877.5cc60d2dc82dc67b.css.map | Bin 163 -> 163 bytes .../._prefix-877.5cc60d2dc82dc67b.css.map.gz | Bin 163 -> 163 bytes .../_static/._prefix-915.882512b642b7fffa.css | Bin 163 -> 163 bytes .../._prefix-915.882512b642b7fffa.css.gz | Bin 163 -> 163 bytes .../._prefix-915.882512b642b7fffa.css.map | Bin 163 -> 163 bytes .../._prefix-915.882512b642b7fffa.css.map.gz | Bin 163 -> 163 bytes .../._prefix-runestone.b12a7b3f0773ebcd.css | Bin 163 -> 163 bytes ...._prefix-runestone.b12a7b3f0773ebcd.css.gz | Bin 163 -> 163 bytes ..._prefix-runestone.b12a7b3f0773ebcd.css.map | Bin 163 -> 163 bytes ...efix-runestone.b12a7b3f0773ebcd.css.map.gz | Bin 163 -> 163 bytes ...refix-runestone.bbf2283c5c1d4f99.bundle.js | Bin 0 -> 163 bytes ...one.bbf2283c5c1d4f99.bundle.js.LICENSE.txt | Bin 0 -> 163 bytes ....bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz | Bin 0 -> 163 bytes ...ix-runestone.bbf2283c5c1d4f99.bundle.js.gz | Bin 0 -> 163 bytes ...x-runestone.bbf2283c5c1d4f99.bundle.js.map | Bin 0 -> 163 bytes ...unestone.bbf2283c5c1d4f99.bundle.js.map.gz | Bin 0 -> 163 bytes ..._prefix-runtime.b76b8eace4405b9e.bundle.js | Bin 0 -> 163 bytes ...efix-runtime.b76b8eace4405b9e.bundle.js.gz | Bin 0 -> 163 bytes ...fix-runtime.b76b8eace4405b9e.bundle.js.map | Bin 0 -> 163 bytes ...-runtime.b76b8eace4405b9e.bundle.js.map.gz | Bin 0 -> 163 bytes course/_static/._sql-wasm.wasm | Bin 163 -> 163 bytes course/_static/._sql-wasm.wasm.gz | Bin 163 -> 163 bytes course/_static/._webpack_static_imports.json | Bin 163 -> 163 bytes .../_static/._webpack_static_imports.json.gz | Bin 163 -> 163 bytes course/_static/._webpack_static_imports.xml | Bin 163 -> 163 bytes course/_static/207.3a19748be8bb18ba.js | 3 + .../207.3a19748be8bb18ba.js.LICENSE.txt | 6 + course/_static/207.3a19748be8bb18ba.js.gz | Bin 0 -> 29558 bytes course/_static/207.3a19748be8bb18ba.js.map | 1 + course/_static/207.3a19748be8bb18ba.js.map.gz | Bin 0 -> 60588 bytes course/_static/877.c2f5ef32dd94b9b6.js | 2 + course/_static/877.c2f5ef32dd94b9b6.js.gz | Bin 0 -> 351323 bytes course/_static/877.c2f5ef32dd94b9b6.js.map | 1 + course/_static/877.c2f5ef32dd94b9b6.js.map.gz | Bin 0 -> 590089 bytes course/_static/_runestone-services.xml | 6 +- .../_static/prefix-486.958d128f4cca3039.css | 2 + .../prefix-486.958d128f4cca3039.css.gz | Bin 0 -> 1146 bytes .../prefix-486.958d128f4cca3039.css.map | 1 + .../prefix-486.958d128f4cca3039.css.map.gz | Bin 0 -> 1972 bytes ...refix-runestone.bbf2283c5c1d4f99.bundle.js | 3 + ...one.bbf2283c5c1d4f99.bundle.js.LICENSE.txt | 83 +++ ....bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz | Bin 0 -> 594 bytes ...ix-runestone.bbf2283c5c1d4f99.bundle.js.gz | Bin 0 -> 25114 bytes ...x-runestone.bbf2283c5c1d4f99.bundle.js.map | 1 + ...unestone.bbf2283c5c1d4f99.bundle.js.map.gz | Bin 0 -> 75192 bytes .../prefix-runtime.b76b8eace4405b9e.bundle.js | 2 + ...efix-runtime.b76b8eace4405b9e.bundle.js.gz | Bin 0 -> 3108 bytes ...fix-runtime.b76b8eace4405b9e.bundle.js.map | 1 + ...-runtime.b76b8eace4405b9e.bundle.js.map.gz | Bin 0 -> 8468 bytes course/_static/webpack_static_imports.json | 2 +- course/_static/webpack_static_imports.json.gz | Bin 154 -> 155 bytes course/_static/webpack_static_imports.xml | 6 +- course/boxes.html | 9 +- course/ch-notes.html | 9 +- course/course-documents.html | 9 +- course/exam-01.html | 13 +- course/exam-02.html | 587 ++++++++++++++++++ course/exams.html | 14 +- course/frontmatter.html | 9 +- course/fun.html | 9 +- course/index.html | 2 +- course/lunr-pretext-search-index.js | 72 +++ course/notes-01-13.html | 9 +- course/notes-01-15.html | 9 +- course/notes-01-20.html | 9 +- course/notes-01-22.html | 9 +- course/notes-01-27.html | 9 +- course/notes-01-29.html | 9 +- course/notes-02-03.html | 9 +- course/notes-02-05.html | 9 +- course/notes-02-10.html | 9 +- course/notes-02-19.html | 9 +- course/notes-02-24.html | 9 +- course/quiz-01.html | 9 +- course/quiz-02.html | 9 +- course/quiz-03.html | 9 +- course/quiz-04.html | 9 +- course/quizzes.html | 9 +- course/recitation-calculus-review.html | 9 +- course/recitations.html | 13 +- course/review.html | 9 +- course/root-1-2.html | 9 +- course/syllabus.html | 9 +- 346 files changed, 962 insertions(+), 104 deletions(-) create mode 100755 course/_static/._207.3a19748be8bb18ba.js create mode 100755 course/_static/._207.3a19748be8bb18ba.js.LICENSE.txt create mode 100755 course/_static/._207.3a19748be8bb18ba.js.gz create mode 100755 course/_static/._207.3a19748be8bb18ba.js.map create mode 100755 course/_static/._207.3a19748be8bb18ba.js.map.gz create mode 100755 course/_static/._877.c2f5ef32dd94b9b6.js create mode 100755 course/_static/._877.c2f5ef32dd94b9b6.js.gz create mode 100755 course/_static/._877.c2f5ef32dd94b9b6.js.map create mode 100755 course/_static/._877.c2f5ef32dd94b9b6.js.map.gz create mode 100755 course/_static/._prefix-486.958d128f4cca3039.css create mode 100755 course/_static/._prefix-486.958d128f4cca3039.css.gz create mode 100755 course/_static/._prefix-486.958d128f4cca3039.css.map create mode 100755 course/_static/._prefix-486.958d128f4cca3039.css.map.gz create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js.gz create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js.map create mode 100755 course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js.map.gz create mode 100755 course/_static/._prefix-runtime.b76b8eace4405b9e.bundle.js create mode 100755 course/_static/._prefix-runtime.b76b8eace4405b9e.bundle.js.gz create mode 100755 course/_static/._prefix-runtime.b76b8eace4405b9e.bundle.js.map create mode 100755 course/_static/._prefix-runtime.b76b8eace4405b9e.bundle.js.map.gz create mode 100755 course/_static/207.3a19748be8bb18ba.js create mode 100755 course/_static/207.3a19748be8bb18ba.js.LICENSE.txt create mode 100755 course/_static/207.3a19748be8bb18ba.js.gz create mode 100755 course/_static/207.3a19748be8bb18ba.js.map create mode 100755 course/_static/207.3a19748be8bb18ba.js.map.gz create mode 100755 course/_static/877.c2f5ef32dd94b9b6.js create mode 100755 course/_static/877.c2f5ef32dd94b9b6.js.gz create mode 100755 course/_static/877.c2f5ef32dd94b9b6.js.map create mode 100755 course/_static/877.c2f5ef32dd94b9b6.js.map.gz create mode 100755 course/_static/prefix-486.958d128f4cca3039.css create mode 100755 course/_static/prefix-486.958d128f4cca3039.css.gz create mode 100755 course/_static/prefix-486.958d128f4cca3039.css.map create mode 100755 course/_static/prefix-486.958d128f4cca3039.css.map.gz create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.gz create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.map create mode 100755 course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.map.gz create mode 100755 course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js create mode 100755 course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.gz create mode 100755 course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map create mode 100755 course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map.gz create mode 100755 course/exam-02.html diff --git a/course/.mapping.json b/course/.mapping.json index 0d42eaf..a5e6d15 100755 --- a/course/.mapping.json +++ b/course/.mapping.json @@ -1 +1 @@ -{"source/main.ptx": ["frontmatter", "course-documents", "ch-notes", "quizzes", "exams", "recitations", "review", "fun"], "source/syllabus/syllabus.ptx": ["syllabus"], "source/notes/1-13.ptx": ["notes-01-13"], "source/notes/1-15.ptx": ["notes-01-15"], "source/notes/1-20.ptx": ["notes-01-20"], "source/notes/1-22.ptx": ["notes-01-22"], "source/notes/1-27.ptx": ["notes-01-27"], "source/notes/1-29.ptx": ["notes-01-29"], "source/notes/2-3.ptx": ["notes-02-03"], "source/notes/2-5.ptx": ["notes-02-05"], "source/notes/2-10.ptx": ["notes-02-10"], "source/notes/2-19.ptx": ["notes-02-19"], "source/notes/2-24.ptx": ["notes-02-24"], "source/quizzes/quiz-01.ptx": ["quiz-01"], "source/quizzes/quiz-02.ptx": ["quiz-02"], "source/quizzes/quiz-03.ptx": ["quiz-03"], "source/quizzes/quiz-04.ptx": ["quiz-04"], "source/exams/exam-01.ptx": ["exam-01"], "source/recitations/calculus-review.ptx": ["recitation-calculus-review"], "source/review/Exam-1-Review.ptx": ["Exam-1-Review"], "source/review/Exam-2-Review.ptx": ["Exam-2-Review"], "source/fun/boxes.ptx": ["boxes"]} \ No newline at end of file +{"source/main.ptx": ["frontmatter", "course-documents", "ch-notes", "quizzes", "exams", "recitations", "review", "fun"], "source/syllabus/syllabus.ptx": ["syllabus"], "source/notes/1-13.ptx": ["notes-01-13"], "source/notes/1-15.ptx": ["notes-01-15"], "source/notes/1-20.ptx": ["notes-01-20"], "source/notes/1-22.ptx": ["notes-01-22"], "source/notes/1-27.ptx": ["notes-01-27"], "source/notes/1-29.ptx": ["notes-01-29"], "source/notes/2-3.ptx": ["notes-02-03"], "source/notes/2-5.ptx": ["notes-02-05"], "source/notes/2-10.ptx": ["notes-02-10"], "source/notes/2-19.ptx": ["notes-02-19"], "source/notes/2-24.ptx": ["notes-02-24"], "source/quizzes/quiz-01.ptx": ["quiz-01"], "source/quizzes/quiz-02.ptx": ["quiz-02"], "source/quizzes/quiz-03.ptx": ["quiz-03"], "source/quizzes/quiz-04.ptx": ["quiz-04"], "source/exams/exam-01.ptx": ["exam-01"], "source/exams/exam-02.ptx": ["exam-02"], "source/recitations/calculus-review.ptx": ["recitation-calculus-review"], "source/review/Exam-1-Review.ptx": ["Exam-1-Review"], "source/review/Exam-2-Review.ptx": ["Exam-2-Review"], "source/fun/boxes.ptx": ["boxes"]} \ No newline at end of file diff --git a/course/Exam-1-Review.html b/course/Exam-1-Review.html index 0d1f5f8..0ccd846 100755 --- a/course/Exam-1-Review.html +++ b/course/Exam-1-Review.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/Exam-2-Review.html b/course/Exam-2-Review.html index e2f5464..df2c86d 100755 --- a/course/Exam-2-Review.html +++ b/course/Exam-2-Review.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/_static/._009b407a9881be10.ttf b/course/_static/._009b407a9881be10.ttf index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._009b407a9881be10.ttf.gz b/course/_static/._009b407a9881be10.ttf.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._126.a976f62852f30b51.js b/course/_static/._126.a976f62852f30b51.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._126.a976f62852f30b51.js.gz b/course/_static/._126.a976f62852f30b51.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._126.a976f62852f30b51.js.map b/course/_static/._126.a976f62852f30b51.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._126.a976f62852f30b51.js.map.gz b/course/_static/._126.a976f62852f30b51.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._128.5bed857c54ac4e8b.js b/course/_static/._128.5bed857c54ac4e8b.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._128.5bed857c54ac4e8b.js.gz b/course/_static/._128.5bed857c54ac4e8b.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._128.5bed857c54ac4e8b.js.map b/course/_static/._128.5bed857c54ac4e8b.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._128.5bed857c54ac4e8b.js.map.gz b/course/_static/._128.5bed857c54ac4e8b.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._131.ee437eeefadd750d.js b/course/_static/._131.ee437eeefadd750d.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._131.ee437eeefadd750d.js.gz b/course/_static/._131.ee437eeefadd750d.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._131.ee437eeefadd750d.js.map b/course/_static/._131.ee437eeefadd750d.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._131.ee437eeefadd750d.js.map.gz b/course/_static/._131.ee437eeefadd750d.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._168.fe63e6dec2d06468.js b/course/_static/._168.fe63e6dec2d06468.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._168.fe63e6dec2d06468.js.gz b/course/_static/._168.fe63e6dec2d06468.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._168.fe63e6dec2d06468.js.map b/course/_static/._168.fe63e6dec2d06468.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._168.fe63e6dec2d06468.js.map.gz b/course/_static/._168.fe63e6dec2d06468.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._186.be52164d57f4b7e4.js b/course/_static/._186.be52164d57f4b7e4.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._186.be52164d57f4b7e4.js.gz b/course/_static/._186.be52164d57f4b7e4.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._186.be52164d57f4b7e4.js.map b/course/_static/._186.be52164d57f4b7e4.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._186.be52164d57f4b7e4.js.map.gz b/course/_static/._186.be52164d57f4b7e4.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._207.3a19748be8bb18ba.js b/course/_static/._207.3a19748be8bb18ba.js new file mode 100755 index 0000000000000000000000000000000000000000..db416aae984cf7fa82671bbc2629f5ecde5421f8 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^KvcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._249.7ec032cf0b3ede9a.js.LICENSE.txt b/course/_static/._249.7ec032cf0b3ede9a.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._249.7ec032cf0b3ede9a.js.LICENSE.txt.gz b/course/_static/._249.7ec032cf0b3ede9a.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._249.7ec032cf0b3ede9a.js.gz b/course/_static/._249.7ec032cf0b3ede9a.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._249.7ec032cf0b3ede9a.js.map b/course/_static/._249.7ec032cf0b3ede9a.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._249.7ec032cf0b3ede9a.js.map.gz b/course/_static/._249.7ec032cf0b3ede9a.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._268.60719f20e69f885e.js b/course/_static/._268.60719f20e69f885e.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._268.60719f20e69f885e.js.gz b/course/_static/._268.60719f20e69f885e.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._268.60719f20e69f885e.js.map b/course/_static/._268.60719f20e69f885e.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._268.60719f20e69f885e.js.map.gz b/course/_static/._268.60719f20e69f885e.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._28.bb005543f41af5fb.js b/course/_static/._28.bb005543f41af5fb.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._28.bb005543f41af5fb.js.LICENSE.txt b/course/_static/._28.bb005543f41af5fb.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._28.bb005543f41af5fb.js.gz b/course/_static/._28.bb005543f41af5fb.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._28.bb005543f41af5fb.js.map b/course/_static/._28.bb005543f41af5fb.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._28.bb005543f41af5fb.js.map.gz b/course/_static/._28.bb005543f41af5fb.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._296.37eb8c05642d8ef9.js b/course/_static/._296.37eb8c05642d8ef9.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._296.37eb8c05642d8ef9.js.gz b/course/_static/._296.37eb8c05642d8ef9.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._296.37eb8c05642d8ef9.js.map b/course/_static/._296.37eb8c05642d8ef9.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._296.37eb8c05642d8ef9.js.map.gz b/course/_static/._296.37eb8c05642d8ef9.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._340.c525bd899366c5f9.js b/course/_static/._340.c525bd899366c5f9.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._340.c525bd899366c5f9.js.gz b/course/_static/._340.c525bd899366c5f9.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._340.c525bd899366c5f9.js.map b/course/_static/._340.c525bd899366c5f9.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._340.c525bd899366c5f9.js.map.gz b/course/_static/._340.c525bd899366c5f9.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js b/course/_static/._357.a6fa55aea0c38a63.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js.LICENSE.txt b/course/_static/._357.a6fa55aea0c38a63.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js.LICENSE.txt.gz b/course/_static/._357.a6fa55aea0c38a63.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js.gz b/course/_static/._357.a6fa55aea0c38a63.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js.map b/course/_static/._357.a6fa55aea0c38a63.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._357.a6fa55aea0c38a63.js.map.gz b/course/_static/._357.a6fa55aea0c38a63.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._39.15b22d3dac60149d.js b/course/_static/._39.15b22d3dac60149d.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._39.15b22d3dac60149d.js.LICENSE.txt b/course/_static/._39.15b22d3dac60149d.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._39.15b22d3dac60149d.js.gz b/course/_static/._39.15b22d3dac60149d.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._39.15b22d3dac60149d.js.map b/course/_static/._39.15b22d3dac60149d.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._39.15b22d3dac60149d.js.map.gz b/course/_static/._39.15b22d3dac60149d.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._412.5965503d81003593.js b/course/_static/._412.5965503d81003593.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._412.5965503d81003593.js.gz b/course/_static/._412.5965503d81003593.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._412.5965503d81003593.js.map b/course/_static/._412.5965503d81003593.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._412.5965503d81003593.js.map.gz b/course/_static/._412.5965503d81003593.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._420.e197c63136060d40.js b/course/_static/._420.e197c63136060d40.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._420.e197c63136060d40.js.LICENSE.txt b/course/_static/._420.e197c63136060d40.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._420.e197c63136060d40.js.gz b/course/_static/._420.e197c63136060d40.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._420.e197c63136060d40.js.map b/course/_static/._420.e197c63136060d40.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._420.e197c63136060d40.js.map.gz b/course/_static/._420.e197c63136060d40.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._442.f48919e396acaa18.js b/course/_static/._442.f48919e396acaa18.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._442.f48919e396acaa18.js.gz b/course/_static/._442.f48919e396acaa18.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._442.f48919e396acaa18.js.map b/course/_static/._442.f48919e396acaa18.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._442.f48919e396acaa18.js.map.gz b/course/_static/._442.f48919e396acaa18.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._460.bae9001422d7a484.js b/course/_static/._460.bae9001422d7a484.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._460.bae9001422d7a484.js.gz b/course/_static/._460.bae9001422d7a484.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._460.bae9001422d7a484.js.map b/course/_static/._460.bae9001422d7a484.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._460.bae9001422d7a484.js.map.gz b/course/_static/._460.bae9001422d7a484.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._466.63840a83388af9f2.js b/course/_static/._466.63840a83388af9f2.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._466.63840a83388af9f2.js.gz b/course/_static/._466.63840a83388af9f2.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._466.63840a83388af9f2.js.map b/course/_static/._466.63840a83388af9f2.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._466.63840a83388af9f2.js.map.gz b/course/_static/._466.63840a83388af9f2.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._486.b03e25ab1e190440.js b/course/_static/._486.b03e25ab1e190440.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._486.b03e25ab1e190440.js.gz b/course/_static/._486.b03e25ab1e190440.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._486.b03e25ab1e190440.js.map b/course/_static/._486.b03e25ab1e190440.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._486.b03e25ab1e190440.js.map.gz b/course/_static/._486.b03e25ab1e190440.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._4ba85deaf3670942.woff b/course/_static/._4ba85deaf3670942.woff index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._529.f5fdfcbb88388877.js b/course/_static/._529.f5fdfcbb88388877.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._529.f5fdfcbb88388877.js.gz b/course/_static/._529.f5fdfcbb88388877.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._529.f5fdfcbb88388877.js.map b/course/_static/._529.f5fdfcbb88388877.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._529.f5fdfcbb88388877.js.map.gz b/course/_static/._529.f5fdfcbb88388877.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._566.8345f32fac0929c0.js b/course/_static/._566.8345f32fac0929c0.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._566.8345f32fac0929c0.js.gz b/course/_static/._566.8345f32fac0929c0.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._566.8345f32fac0929c0.js.map b/course/_static/._566.8345f32fac0929c0.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._566.8345f32fac0929c0.js.map.gz b/course/_static/._566.8345f32fac0929c0.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._576.17e80ff72c52b54b.js b/course/_static/._576.17e80ff72c52b54b.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._576.17e80ff72c52b54b.js.gz b/course/_static/._576.17e80ff72c52b54b.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._576.17e80ff72c52b54b.js.map b/course/_static/._576.17e80ff72c52b54b.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._576.17e80ff72c52b54b.js.map.gz b/course/_static/._576.17e80ff72c52b54b.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._580.28428521d8f13ec7.js b/course/_static/._580.28428521d8f13ec7.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._580.28428521d8f13ec7.js.gz b/course/_static/._580.28428521d8f13ec7.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._580.28428521d8f13ec7.js.map b/course/_static/._580.28428521d8f13ec7.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._580.28428521d8f13ec7.js.map.gz b/course/_static/._580.28428521d8f13ec7.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._616.89f80a32caf41aef.js b/course/_static/._616.89f80a32caf41aef.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._616.89f80a32caf41aef.js.gz b/course/_static/._616.89f80a32caf41aef.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._616.89f80a32caf41aef.js.map b/course/_static/._616.89f80a32caf41aef.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._616.89f80a32caf41aef.js.map.gz b/course/_static/._616.89f80a32caf41aef.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js b/course/_static/._625.120987bdd5293ae3.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js.LICENSE.txt b/course/_static/._625.120987bdd5293ae3.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js.LICENSE.txt.gz b/course/_static/._625.120987bdd5293ae3.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js.gz b/course/_static/._625.120987bdd5293ae3.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js.map b/course/_static/._625.120987bdd5293ae3.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._625.120987bdd5293ae3.js.map.gz b/course/_static/._625.120987bdd5293ae3.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._640.cbc8d3a34deb8837.js b/course/_static/._640.cbc8d3a34deb8837.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._640.cbc8d3a34deb8837.js.map b/course/_static/._640.cbc8d3a34deb8837.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._640.cbc8d3a34deb8837.js.map.gz b/course/_static/._640.cbc8d3a34deb8837.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._662.e77a89c65303c376.js b/course/_static/._662.e77a89c65303c376.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._662.e77a89c65303c376.js.gz b/course/_static/._662.e77a89c65303c376.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._662.e77a89c65303c376.js.map b/course/_static/._662.e77a89c65303c376.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._662.e77a89c65303c376.js.map.gz b/course/_static/._662.e77a89c65303c376.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._680.eb99211d1806dba1.js b/course/_static/._680.eb99211d1806dba1.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._680.eb99211d1806dba1.js.gz b/course/_static/._680.eb99211d1806dba1.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._680.eb99211d1806dba1.js.map b/course/_static/._680.eb99211d1806dba1.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._680.eb99211d1806dba1.js.map.gz b/course/_static/._680.eb99211d1806dba1.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._759.7032c311ffc20fc3.js b/course/_static/._759.7032c311ffc20fc3.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._759.7032c311ffc20fc3.js.gz b/course/_static/._759.7032c311ffc20fc3.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._759.7032c311ffc20fc3.js.map b/course/_static/._759.7032c311ffc20fc3.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._759.7032c311ffc20fc3.js.map.gz b/course/_static/._759.7032c311ffc20fc3.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js b/course/_static/._764.c33a81cafe63d2b6.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js.LICENSE.txt b/course/_static/._764.c33a81cafe63d2b6.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js.LICENSE.txt.gz b/course/_static/._764.c33a81cafe63d2b6.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js.gz b/course/_static/._764.c33a81cafe63d2b6.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js.map b/course/_static/._764.c33a81cafe63d2b6.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._764.c33a81cafe63d2b6.js.map.gz b/course/_static/._764.c33a81cafe63d2b6.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js b/course/_static/._770.7bd6d39128dde910.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js.LICENSE.txt b/course/_static/._770.7bd6d39128dde910.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js.LICENSE.txt.gz b/course/_static/._770.7bd6d39128dde910.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js.gz b/course/_static/._770.7bd6d39128dde910.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js.map b/course/_static/._770.7bd6d39128dde910.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._770.7bd6d39128dde910.js.map.gz b/course/_static/._770.7bd6d39128dde910.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._7a0f4b092e86cb52.eot b/course/_static/._7a0f4b092e86cb52.eot index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._817.3438cd0f1b0f98bc.js b/course/_static/._817.3438cd0f1b0f98bc.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._817.3438cd0f1b0f98bc.js.gz b/course/_static/._817.3438cd0f1b0f98bc.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._817.3438cd0f1b0f98bc.js.map b/course/_static/._817.3438cd0f1b0f98bc.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._817.3438cd0f1b0f98bc.js.map.gz b/course/_static/._817.3438cd0f1b0f98bc.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._819.a9dba7a670e07497.js b/course/_static/._819.a9dba7a670e07497.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._819.a9dba7a670e07497.js.gz b/course/_static/._819.a9dba7a670e07497.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._819.a9dba7a670e07497.js.map b/course/_static/._819.a9dba7a670e07497.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._819.a9dba7a670e07497.js.map.gz b/course/_static/._819.a9dba7a670e07497.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._824.4343b78afc34c12f.js b/course/_static/._824.4343b78afc34c12f.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._824.4343b78afc34c12f.js.gz b/course/_static/._824.4343b78afc34c12f.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._824.4343b78afc34c12f.js.map b/course/_static/._824.4343b78afc34c12f.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._824.4343b78afc34c12f.js.map.gz b/course/_static/._824.4343b78afc34c12f.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._85f0466cb4ab3a4d.svg b/course/_static/._85f0466cb4ab3a4d.svg index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._85f0466cb4ab3a4d.svg.gz b/course/_static/._85f0466cb4ab3a4d.svg.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._877.c2f5ef32dd94b9b6.js b/course/_static/._877.c2f5ef32dd94b9b6.js new file mode 100755 index 0000000000000000000000000000000000000000..db416aae984cf7fa82671bbc2629f5ecde5421f8 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^KvcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._915.8f500bccc86f901d.js.gz b/course/_static/._915.8f500bccc86f901d.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._915.8f500bccc86f901d.js.map b/course/_static/._915.8f500bccc86f901d.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._915.8f500bccc86f901d.js.map.gz b/course/_static/._915.8f500bccc86f901d.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._919.4801fda4dafcc487.js b/course/_static/._919.4801fda4dafcc487.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._919.4801fda4dafcc487.js.gz b/course/_static/._919.4801fda4dafcc487.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._919.4801fda4dafcc487.js.map b/course/_static/._919.4801fda4dafcc487.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._919.4801fda4dafcc487.js.map.gz b/course/_static/._919.4801fda4dafcc487.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._b70781972ce7320b.woff2 b/course/_static/._b70781972ce7320b.woff2 index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-131.b184379d0dc5871b.css b/course/_static/._prefix-131.b184379d0dc5871b.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-131.b184379d0dc5871b.css.gz b/course/_static/._prefix-131.b184379d0dc5871b.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-131.b184379d0dc5871b.css.map b/course/_static/._prefix-131.b184379d0dc5871b.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-131.b184379d0dc5871b.css.map.gz b/course/_static/._prefix-131.b184379d0dc5871b.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-168.1c4deaed00ca1f5e.css b/course/_static/._prefix-168.1c4deaed00ca1f5e.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-168.1c4deaed00ca1f5e.css.gz b/course/_static/._prefix-168.1c4deaed00ca1f5e.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-168.1c4deaed00ca1f5e.css.map b/course/_static/._prefix-168.1c4deaed00ca1f5e.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-168.1c4deaed00ca1f5e.css.map.gz b/course/_static/._prefix-168.1c4deaed00ca1f5e.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-186.0d47de180767fda9.css b/course/_static/._prefix-186.0d47de180767fda9.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-186.0d47de180767fda9.css.map b/course/_static/._prefix-186.0d47de180767fda9.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-186.0d47de180767fda9.css.map.gz b/course/_static/._prefix-186.0d47de180767fda9.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-198.86b6b2a70a576922.css b/course/_static/._prefix-198.86b6b2a70a576922.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-198.86b6b2a70a576922.css.gz b/course/_static/._prefix-198.86b6b2a70a576922.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-198.86b6b2a70a576922.css.map b/course/_static/._prefix-198.86b6b2a70a576922.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-198.86b6b2a70a576922.css.map.gz b/course/_static/._prefix-198.86b6b2a70a576922.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-249.6ca19da539a8ed1a.css b/course/_static/._prefix-249.6ca19da539a8ed1a.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-249.6ca19da539a8ed1a.css.gz b/course/_static/._prefix-249.6ca19da539a8ed1a.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-249.6ca19da539a8ed1a.css.map b/course/_static/._prefix-249.6ca19da539a8ed1a.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-249.6ca19da539a8ed1a.css.map.gz b/course/_static/._prefix-249.6ca19da539a8ed1a.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-268.67f2441667bc7c43.css b/course/_static/._prefix-268.67f2441667bc7c43.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-268.67f2441667bc7c43.css.gz b/course/_static/._prefix-268.67f2441667bc7c43.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-268.67f2441667bc7c43.css.map b/course/_static/._prefix-268.67f2441667bc7c43.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-268.67f2441667bc7c43.css.map.gz b/course/_static/._prefix-268.67f2441667bc7c43.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-294.986bf74bfa4ccbd4.css b/course/_static/._prefix-294.986bf74bfa4ccbd4.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-294.986bf74bfa4ccbd4.css.gz b/course/_static/._prefix-294.986bf74bfa4ccbd4.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-294.986bf74bfa4ccbd4.css.map b/course/_static/._prefix-294.986bf74bfa4ccbd4.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-294.986bf74bfa4ccbd4.css.map.gz b/course/_static/._prefix-294.986bf74bfa4ccbd4.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-350.dbca9271f6e2dfbf.css b/course/_static/._prefix-350.dbca9271f6e2dfbf.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-350.dbca9271f6e2dfbf.css.gz b/course/_static/._prefix-350.dbca9271f6e2dfbf.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-350.dbca9271f6e2dfbf.css.map b/course/_static/._prefix-350.dbca9271f6e2dfbf.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-350.dbca9271f6e2dfbf.css.map.gz b/course/_static/._prefix-350.dbca9271f6e2dfbf.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-380.67748940131a4a84.css b/course/_static/._prefix-380.67748940131a4a84.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-380.67748940131a4a84.css.map b/course/_static/._prefix-380.67748940131a4a84.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-380.67748940131a4a84.css.map.gz b/course/_static/._prefix-380.67748940131a4a84.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-39.ec5d93a85cddac28.css b/course/_static/._prefix-39.ec5d93a85cddac28.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-39.ec5d93a85cddac28.css.gz b/course/_static/._prefix-39.ec5d93a85cddac28.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-39.ec5d93a85cddac28.css.map b/course/_static/._prefix-39.ec5d93a85cddac28.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-39.ec5d93a85cddac28.css.map.gz b/course/_static/._prefix-39.ec5d93a85cddac28.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-412.25f3c4ff23eb9893.css b/course/_static/._prefix-412.25f3c4ff23eb9893.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-412.25f3c4ff23eb9893.css.gz b/course/_static/._prefix-412.25f3c4ff23eb9893.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-412.25f3c4ff23eb9893.css.map b/course/_static/._prefix-412.25f3c4ff23eb9893.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-412.25f3c4ff23eb9893.css.map.gz b/course/_static/._prefix-412.25f3c4ff23eb9893.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-442.6ae0ea584f8e75c5.css b/course/_static/._prefix-442.6ae0ea584f8e75c5.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-442.6ae0ea584f8e75c5.css.gz b/course/_static/._prefix-442.6ae0ea584f8e75c5.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-442.6ae0ea584f8e75c5.css.map b/course/_static/._prefix-442.6ae0ea584f8e75c5.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-442.6ae0ea584f8e75c5.css.map.gz b/course/_static/._prefix-442.6ae0ea584f8e75c5.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-460.7c0b70502d117f7d.css b/course/_static/._prefix-460.7c0b70502d117f7d.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-460.7c0b70502d117f7d.css.map b/course/_static/._prefix-460.7c0b70502d117f7d.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-486.958d128f4cca3039.css b/course/_static/._prefix-486.958d128f4cca3039.css new file mode 100755 index 0000000000000000000000000000000000000000..db416aae984cf7fa82671bbc2629f5ecde5421f8 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^KvcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-576.9b1852878840651d.css.gz b/course/_static/._prefix-576.9b1852878840651d.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-576.9b1852878840651d.css.map b/course/_static/._prefix-576.9b1852878840651d.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-576.9b1852878840651d.css.map.gz b/course/_static/._prefix-576.9b1852878840651d.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-580.22958d4327b0425a.css b/course/_static/._prefix-580.22958d4327b0425a.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-580.22958d4327b0425a.css.gz b/course/_static/._prefix-580.22958d4327b0425a.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-580.22958d4327b0425a.css.map b/course/_static/._prefix-580.22958d4327b0425a.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-580.22958d4327b0425a.css.map.gz b/course/_static/._prefix-580.22958d4327b0425a.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-616.5c78f604ddad1ec0.css b/course/_static/._prefix-616.5c78f604ddad1ec0.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-616.5c78f604ddad1ec0.css.gz b/course/_static/._prefix-616.5c78f604ddad1ec0.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-616.5c78f604ddad1ec0.css.map b/course/_static/._prefix-616.5c78f604ddad1ec0.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-616.5c78f604ddad1ec0.css.map.gz b/course/_static/._prefix-616.5c78f604ddad1ec0.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-621.8c109e297bdd8ce7.css b/course/_static/._prefix-621.8c109e297bdd8ce7.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-621.8c109e297bdd8ce7.css.gz b/course/_static/._prefix-621.8c109e297bdd8ce7.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-621.8c109e297bdd8ce7.css.map b/course/_static/._prefix-621.8c109e297bdd8ce7.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-621.8c109e297bdd8ce7.css.map.gz b/course/_static/._prefix-621.8c109e297bdd8ce7.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3bccd435914aa0ff.css b/course/_static/._prefix-723.3bccd435914aa0ff.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3bccd435914aa0ff.css.gz b/course/_static/._prefix-723.3bccd435914aa0ff.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3bccd435914aa0ff.css.map b/course/_static/._prefix-723.3bccd435914aa0ff.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3bccd435914aa0ff.css.map.gz b/course/_static/._prefix-723.3bccd435914aa0ff.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js b/course/_static/._prefix-723.3e6434f80549315a.bundle.js index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js.LICENSE.txt b/course/_static/._prefix-723.3e6434f80549315a.bundle.js.LICENSE.txt index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js.LICENSE.txt.gz b/course/_static/._prefix-723.3e6434f80549315a.bundle.js.LICENSE.txt.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js.gz b/course/_static/._prefix-723.3e6434f80549315a.bundle.js.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js.map b/course/_static/._prefix-723.3e6434f80549315a.bundle.js.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-723.3e6434f80549315a.bundle.js.map.gz b/course/_static/._prefix-723.3e6434f80549315a.bundle.js.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-737.cf869b6ea8bfad2f.css b/course/_static/._prefix-737.cf869b6ea8bfad2f.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-737.cf869b6ea8bfad2f.css.gz b/course/_static/._prefix-737.cf869b6ea8bfad2f.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-737.cf869b6ea8bfad2f.css.map b/course/_static/._prefix-737.cf869b6ea8bfad2f.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-737.cf869b6ea8bfad2f.css.map.gz b/course/_static/._prefix-737.cf869b6ea8bfad2f.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-824.271ae6cff6401ed5.css b/course/_static/._prefix-824.271ae6cff6401ed5.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-824.271ae6cff6401ed5.css.gz b/course/_static/._prefix-824.271ae6cff6401ed5.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-824.271ae6cff6401ed5.css.map b/course/_static/._prefix-824.271ae6cff6401ed5.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-824.271ae6cff6401ed5.css.map.gz b/course/_static/._prefix-824.271ae6cff6401ed5.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-850.e86d03c2cec75438.css b/course/_static/._prefix-850.e86d03c2cec75438.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-850.e86d03c2cec75438.css.gz b/course/_static/._prefix-850.e86d03c2cec75438.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-850.e86d03c2cec75438.css.map b/course/_static/._prefix-850.e86d03c2cec75438.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-850.e86d03c2cec75438.css.map.gz b/course/_static/._prefix-850.e86d03c2cec75438.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-877.5cc60d2dc82dc67b.css b/course/_static/._prefix-877.5cc60d2dc82dc67b.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-877.5cc60d2dc82dc67b.css.gz b/course/_static/._prefix-877.5cc60d2dc82dc67b.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-877.5cc60d2dc82dc67b.css.map b/course/_static/._prefix-877.5cc60d2dc82dc67b.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-877.5cc60d2dc82dc67b.css.map.gz b/course/_static/._prefix-877.5cc60d2dc82dc67b.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-915.882512b642b7fffa.css b/course/_static/._prefix-915.882512b642b7fffa.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-915.882512b642b7fffa.css.gz b/course/_static/._prefix-915.882512b642b7fffa.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-915.882512b642b7fffa.css.map b/course/_static/._prefix-915.882512b642b7fffa.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-915.882512b642b7fffa.css.map.gz b/course/_static/._prefix-915.882512b642b7fffa.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css b/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.gz b/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.map b/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.map index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.map.gz b/course/_static/._prefix-runestone.b12a7b3f0773ebcd.css.map.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js b/course/_static/._prefix-runestone.bbf2283c5c1d4f99.bundle.js new file mode 100755 index 0000000000000000000000000000000000000000..db416aae984cf7fa82671bbc2629f5ecde5421f8 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^K$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S oBE&_L^KvcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._sql-wasm.wasm.gz b/course/_static/._sql-wasm.wasm.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._webpack_static_imports.json b/course/_static/._webpack_static_imports.json index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._webpack_static_imports.json.gz b/course/_static/._webpack_static_imports.json.gz index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/._webpack_static_imports.xml b/course/_static/._webpack_static_imports.xml index d4c638481f3a3a657f36d188ef835324080a1acd..db416aae984cf7fa82671bbc2629f5ecde5421f8 100755 GIT binary patch delta 15 WcmZ3?xR`OmY>vcRMRrlr>Sq8hHU-ZB delta 15 WcmZ3?xR`OmYz~Vsrr^MIL5b diff --git a/course/_static/207.3a19748be8bb18ba.js b/course/_static/207.3a19748be8bb18ba.js new file mode 100755 index 0000000..d20dec8 --- /dev/null +++ b/course/_static/207.3a19748be8bb18ba.js @@ -0,0 +1,3 @@ +/*! For license information please see 207.3a19748be8bb18ba.js.LICENSE.txt */ +"use strict";(self.webpackChunkWebComponents=self.webpackChunkWebComponents||[]).push([[207],{78207:(e,t,n)=>{function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;tMn});var c=l(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),d=l(/Edge/i),u=l(/firefox/i),h=l(/safari/i)&&!l(/chrome/i)&&!l(/android/i),g=l(/iP(ad|od|hone)/i),p=l(/chrome/i)&&l(/android/i),f={capture:!1,passive:!1};function m(e,t,n){e.addEventListener(t,n,!c&&f)}function b(e,t,n){e.removeEventListener(t,n,!c&&f)}function v(e,t){if(t){if(">"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function _(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function y(e,t,n,r){if(e){n=n||document;do{if(null!=t&&(">"===t[0]?e.parentNode===n&&v(e,t):v(e,t))||r&&e===n)return e;if(e===n)break}while(e=_(e))}return null}var E,w=/\s+/g;function A(e,t,n){if(e&&t)if(e.classList)e.classList[n?"add":"remove"](t);else{var r=(" "+e.className+" ").replace(w," ").replace(" "+t+" "," ");e.className=(r+(n?" "+t:"")).replace(w," ")}}function x(e,t,n){var r=e&&e.style;if(r){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(n=e.currentStyle),void 0===t?n:n[t];t in r||-1!==t.indexOf("webkit")||(t="-webkit-"+t),r[t]=n+("string"==typeof n?"":"px")}}function S(e,t){var n="";if("string"==typeof e)n=e;else do{var r=x(e,"transform");r&&"none"!==r&&(n=r+" "+n)}while(!t&&(e=e.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(n)}function k(e,t,n){if(e){var r=e.getElementsByTagName(t),o=0,i=r.length;if(n)for(;o=i:o<=i))return r;if(r===N())break;r=B(r,!1)}return!1}function T(e,t,n,r){for(var o=0,i=0,a=e.children;i2&&void 0!==arguments[2]?arguments[2]:{},r=n.evt,i=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(n,U);X.pluginEvent.bind(Pe)(e,t,o({dragEl:W,parentEl:q,ghostEl:G,rootEl:Z,nextEl:V,lastDownEl:J,cloneEl:Q,cloneHidden:ee,dragStarted:ge,putSortable:ae,activeSortable:Pe.active,originalEvent:r,oldIndex:te,oldDraggableIndex:re,newIndex:ne,newDraggableIndex:oe,hideGhostForTarget:Ie,unhideGhostForTarget:Be,cloneNowHidden:function(){ee=!0},cloneNowShown:function(){ee=!1},dispatchSortableEvent:function(e){K({sortable:t,name:e,originalEvent:r})}},i))};function K(e){!function(e){var t=e.sortable,n=e.rootEl,r=e.name,i=e.targetEl,a=e.cloneEl,s=e.toEl,l=e.fromEl,u=e.oldIndex,h=e.newIndex,g=e.oldDraggableIndex,p=e.newDraggableIndex,f=e.originalEvent,m=e.putSortable,b=e.extraEventProperties;if(t=t||n&&n[$]){var v,_=t.options,y="on"+r.charAt(0).toUpperCase()+r.substr(1);!window.CustomEvent||c||d?(v=document.createEvent("Event")).initEvent(r,!0,!0):v=new CustomEvent(r,{bubbles:!0,cancelable:!0}),v.to=s||n,v.from=l||n,v.item=i||n,v.clone=a,v.oldIndex=u,v.newIndex=h,v.oldDraggableIndex=g,v.newDraggableIndex=p,v.originalEvent=f,v.pullMode=m?m.lastPutMode:void 0;var E=o(o({},b),X.getEventProperties(r,t));for(var w in E)v[w]=E[w];n&&n.dispatchEvent(v),_[y]&&_[y].call(t,v)}}(o({putSortable:ae,cloneEl:Q,targetEl:W,rootEl:Z,oldIndex:te,oldDraggableIndex:re,newIndex:ne,newDraggableIndex:oe},e))}var W,q,G,Z,V,J,Q,ee,te,ne,re,oe,ie,ae,se,le,ce,de,ue,he,ge,pe,fe,me,be,ve=!1,_e=!1,ye=[],Ee=!1,we=!1,Ae=[],xe=!1,Se=[],ke="undefined"!=typeof document,Ne=g,Ce=d||c?"cssFloat":"float",Oe=ke&&!p&&!g&&"draggable"in document.createElement("div"),Te=function(){if(ke){if(c)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto","auto"===e.style.pointerEvents}}(),De=function(e,t){var n=x(e),r=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=T(e,0,t),i=T(e,1,t),a=o&&x(o),s=i&&x(i),l=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+C(o).width,c=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+C(i).width;if("flex"===n.display)return"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal";if("grid"===n.display)return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(o&&a.float&&"none"!==a.float){var d="left"===a.float?"left":"right";return!i||"both"!==s.clear&&s.clear!==d?"horizontal":"vertical"}return o&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||l>=r&&"none"===n[Ce]||i&&"none"===n[Ce]&&l+c>r)?"vertical":"horizontal"},Me=function(e){function t(e,n){return function(r,o,i,a){var s=r.options.group.name&&o.options.group.name&&r.options.group.name===o.options.group.name;if(null==e&&(n||s))return!0;if(null==e||!1===e)return!1;if(n&&"clone"===e)return e;if("function"==typeof e)return t(e(r,o,i,a),n)(r,o,i,a);var l=(n?r:o).options.group.name;return!0===e||"string"==typeof e&&e===l||e.join&&e.indexOf(l)>-1}}var n={},r=e.group;r&&"object"==i(r)||(r={name:r}),n.name=r.name,n.checkPull=t(r.pull,!0),n.checkPut=t(r.put),n.revertClone=r.revertClone,e.group=n},Ie=function(){!Te&&G&&x(G,"display","none")},Be=function(){!Te&&G&&x(G,"display","")};ke&&document.addEventListener("click",(function(e){if(_e)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),_e=!1,!1}),!0);var Re=function(e){if(W){e=e.touches?e.touches[0]:e;var t=(o=e.clientX,i=e.clientY,ye.some((function(e){var t=e[$].options.emptyInsertThreshold;if(t&&!D(e)){var n=C(e),r=o>=n.left-t&&o<=n.right+t,s=i>=n.top-t&&i<=n.bottom+t;return r&&s?a=e:void 0}})),a);if(t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[$]._onDragOver(n)}}var o,i,a},Le=function(e){W&&W.parentNode[$]._isOutsideThisEl(e.target)};function Pe(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=s({},t),e[$]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return De(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData("Text",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Pe.supportPointer&&"PointerEvent"in window&&!h,emptyInsertThreshold:5};for(var r in X.initializePlugins(this,e,n),n)!(r in t)&&(t[r]=n[r]);for(var o in Me(t),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!t.forceFallback&&Oe,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?m(e,"pointerdown",this._onTapStart):(m(e,"mousedown",this._onTapStart),m(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(m(e,"dragover",this),m(e,"dragenter",this)),ye.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),s(this,z())}function je(e,t,n,r,o,i,a,s){var l,u,h=e[$],g=h.options.onMove;return!window.CustomEvent||c||d?(l=document.createEvent("Event")).initEvent("move",!0,!0):l=new CustomEvent("move",{bubbles:!0,cancelable:!0}),l.to=t,l.from=e,l.dragged=n,l.draggedRect=r,l.related=o||t,l.relatedRect=i||C(t),l.willInsertAfter=s,l.originalEvent=a,e.dispatchEvent(l),g&&(u=g.call(h,l,a)),u}function $e(e){e.draggable=!1}function ze(){xe=!1}function Fe(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function He(e){return setTimeout(e,0)}function Xe(e){return clearTimeout(e)}Pe.prototype={constructor:Pe,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(pe=null)},_getDirection:function(e,t){return"function"==typeof this.options.direction?this.options.direction.call(this,e,t,W):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,r=this.options,o=r.preventOnFilter,i=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,s=(a||e).target,l=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,c=r.filter;if(function(e){Se.length=0;for(var t=e.getElementsByTagName("input"),n=t.length;n--;){var r=t[n];r.checked&&Se.push(r)}}(n),!W&&!(/mousedown|pointerdown/.test(i)&&0!==e.button||r.disabled)&&!l.isContentEditable&&(this.nativeDraggable||!h||!s||"SELECT"!==s.tagName.toUpperCase())&&!((s=y(s,r.draggable,n,!1))&&s.animated||J===s)){if(te=M(s),re=M(s,r.draggable),"function"==typeof c){if(c.call(this,e,s,this))return K({sortable:t,rootEl:l,name:"filter",targetEl:s,toEl:n,fromEl:n}),Y("filter",t,{evt:e}),void(o&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some((function(r){if(r=y(l,r.trim(),n,!1))return K({sortable:t,rootEl:r,name:"filter",targetEl:s,fromEl:n,toEl:n}),Y("filter",t,{evt:e}),!0}))))return void(o&&e.cancelable&&e.preventDefault());r.handle&&!y(l,r.handle,n,!1)||this._prepareDragStart(e,a,s)}}},_prepareDragStart:function(e,t,n){var r,o=this,i=o.el,a=o.options,s=i.ownerDocument;if(n&&!W&&n.parentNode===i){var l=C(n);if(Z=i,q=(W=n).parentNode,V=W.nextSibling,J=n,ie=a.group,Pe.dragged=W,se={target:W,clientX:(t||e).clientX,clientY:(t||e).clientY},ue=se.clientX-l.left,he=se.clientY-l.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,W.style["will-change"]="all",r=function(){Y("delayEnded",o,{evt:e}),Pe.eventCanceled?o._onDrop():(o._disableDelayedDragEvents(),!u&&o.nativeDraggable&&(W.draggable=!0),o._triggerDragStart(e,t),K({sortable:o,name:"choose",originalEvent:e}),A(W,a.chosenClass,!0))},a.ignore.split(",").forEach((function(e){k(W,e.trim(),$e)})),m(s,"dragover",Re),m(s,"mousemove",Re),m(s,"touchmove",Re),m(s,"mouseup",o._onDrop),m(s,"touchend",o._onDrop),m(s,"touchcancel",o._onDrop),u&&this.nativeDraggable&&(this.options.touchStartThreshold=4,W.draggable=!0),Y("delayStart",this,{evt:e}),!a.delay||a.delayOnTouchOnly&&!t||this.nativeDraggable&&(d||c))r();else{if(Pe.eventCanceled)return void this._onDrop();m(s,"mouseup",o._disableDelayedDrag),m(s,"touchend",o._disableDelayedDrag),m(s,"touchcancel",o._disableDelayedDrag),m(s,"mousemove",o._delayedDragTouchMoveHandler),m(s,"touchmove",o._delayedDragTouchMoveHandler),a.supportPointer&&m(s,"pointermove",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(r,a.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){W&&$e(W),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;b(e,"mouseup",this._disableDelayedDrag),b(e,"touchend",this._disableDelayedDrag),b(e,"touchcancel",this._disableDelayedDrag),b(e,"mousemove",this._delayedDragTouchMoveHandler),b(e,"touchmove",this._delayedDragTouchMoveHandler),b(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||"touch"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?m(document,"pointermove",this._onTouchMove):m(document,t?"touchmove":"mousemove",this._onTouchMove):(m(W,"dragend",this),m(Z,"dragstart",this._onDragStart));try{document.selection?He((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(ve=!1,Z&&W){Y("dragStarted",this,{evt:t}),this.nativeDraggable&&m(document,"dragover",Le);var n=this.options;!e&&A(W,n.dragClass,!1),A(W,n.ghostClass,!0),Pe.active=this,e&&this._appendGhost(),K({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(le){this._lastX=le.clientX,this._lastY=le.clientY,Ie();for(var e=document.elementFromPoint(le.clientX,le.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(le.clientX,le.clientY))!==t;)t=e;if(W.parentNode[$]._isOutsideThisEl(e),t)do{if(t[$]&&t[$]._onDragOver({clientX:le.clientX,clientY:le.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break;e=t}while(t=t.parentNode);Be()}},_onTouchMove:function(e){if(se){var t=this.options,n=t.fallbackTolerance,r=t.fallbackOffset,o=e.touches?e.touches[0]:e,i=G&&S(G,!0),a=G&&i&&i.a,s=G&&i&&i.d,l=Ne&&be&&I(be),c=(o.clientX-se.clientX+r.x)/(a||1)+(l?l[0]-Ae[0]:0)/(a||1),d=(o.clientY-se.clientY+r.y)/(s||1)+(l?l[1]-Ae[1]:0)/(s||1);if(!Pe.active&&!ve){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))r.right+10||e.clientX<=r.right&&e.clientY>r.bottom&&e.clientX>=r.left:e.clientX>r.right&&e.clientY>r.top||e.clientX<=r.right&&e.clientY>r.bottom+10}(e,i,this)&&!m.animated){if(m===W)return H(!1);if(m&&a===e.target&&(s=m),s&&(n=C(s)),!1!==je(Z,a,W,t,s,n,e,!!s))return F(),a.appendChild(W),q=a,X(),H(!0)}else if(m&&function(e,t,n){var r=C(T(n.el,0,n.options,!0));return t?e.clientXd+c*i/2:lu-me)return-fe}else if(l>d+c*(1-o)/2&&lu-c*i/2)?l>d+c/2?1:-1:0}(e,s,n,i,S?1:l.swapThreshold,null==l.invertedSwapThreshold?l.swapThreshold:l.invertedSwapThreshold,we,pe===s),0!==v){var B=M(W);do{B-=v,E=q.children[B]}while(E&&("none"===x(E,"display")||E===G))}if(0===v||E===s)return H(!1);pe=s,fe=v;var R=s.nextElementSibling,L=!1,j=je(Z,a,W,t,s,n,e,L=1===v);if(!1!==j)return 1!==j&&-1!==j||(L=1===j),xe=!0,setTimeout(ze,30),F(),L&&!R?a.appendChild(W):s.parentNode.insertBefore(W,L?R:s),N&&P(N,0,I-N.scrollTop),q=W.parentNode,void 0===_||we||(me=Math.abs(_-C(s)[k])),X(),H(!0)}if(a.contains(W))return H(!1)}return!1}function z(l,c){Y(l,p,o({evt:e,isOwner:u,axis:i?"vertical":"horizontal",revert:r,dragRect:t,targetRect:n,canSort:h,fromSortable:g,target:s,completed:H,onMove:function(n,r){return je(Z,a,W,t,n,C(n),e,r)},changed:X},c))}function F(){z("dragOverAnimationCapture"),p.captureAnimationState(),p!==g&&g.captureAnimationState()}function H(t){return z("dragOverCompleted",{insertion:t}),t&&(u?d._hideClone():d._showClone(p),p!==g&&(A(W,ae?ae.options.ghostClass:d.options.ghostClass,!1),A(W,l.ghostClass,!0)),ae!==p&&p!==Pe.active?ae=p:p===Pe.active&&ae&&(ae=null),g===p&&(p._ignoreWhileAnimating=s),p.animateAll((function(){z("dragOverAnimationComplete"),p._ignoreWhileAnimating=null})),p!==g&&(g.animateAll(),g._ignoreWhileAnimating=null)),(s===W&&!W.animated||s===a&&!s.animated)&&(pe=null),l.dragoverBubble||e.rootEl||s===document||(W.parentNode[$]._isOutsideThisEl(e.target),!t&&Re(e)),!l.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),f=!0}function X(){ne=M(W),oe=M(W,l.draggable),K({sortable:p,name:"change",toEl:a,newIndex:ne,newDraggableIndex:oe,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){b(document,"mousemove",this._onTouchMove),b(document,"touchmove",this._onTouchMove),b(document,"pointermove",this._onTouchMove),b(document,"dragover",Re),b(document,"mousemove",Re),b(document,"touchmove",Re)},_offUpEvents:function(){var e=this.el.ownerDocument;b(e,"mouseup",this._onDrop),b(e,"touchend",this._onDrop),b(e,"pointerup",this._onDrop),b(e,"touchcancel",this._onDrop),b(document,"selectstart",this)},_onDrop:function(e){var t=this.el,n=this.options;ne=M(W),oe=M(W,n.draggable),Y("drop",this,{evt:e}),q=W&&W.parentNode,ne=M(W),oe=M(W,n.draggable),Pe.eventCanceled||(ve=!1,we=!1,Ee=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Xe(this.cloneId),Xe(this._dragStartId),this.nativeDraggable&&(b(document,"drop",this),b(t,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),h&&x(document.body,"user-select",""),x(W,"transform",""),e&&(ge&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),G&&G.parentNode&&G.parentNode.removeChild(G),(Z===q||ae&&"clone"!==ae.lastPutMode)&&Q&&Q.parentNode&&Q.parentNode.removeChild(Q),W&&(this.nativeDraggable&&b(W,"dragend",this),$e(W),W.style["will-change"]="",ge&&!ve&&A(W,ae?ae.options.ghostClass:this.options.ghostClass,!1),A(W,this.options.chosenClass,!1),K({sortable:this,name:"unchoose",toEl:q,newIndex:null,newDraggableIndex:null,originalEvent:e}),Z!==q?(ne>=0&&(K({rootEl:q,name:"add",toEl:q,fromEl:Z,originalEvent:e}),K({sortable:this,name:"remove",toEl:q,originalEvent:e}),K({rootEl:q,name:"sort",toEl:q,fromEl:Z,originalEvent:e}),K({sortable:this,name:"sort",toEl:q,originalEvent:e})),ae&&ae.save()):ne!==te&&ne>=0&&(K({sortable:this,name:"update",toEl:q,originalEvent:e}),K({sortable:this,name:"sort",toEl:q,originalEvent:e})),Pe.active&&(null!=ne&&-1!==ne||(ne=te,oe=re),K({sortable:this,name:"end",toEl:q,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){Y("nulling",this),Z=W=q=G=V=Q=J=ee=se=le=ge=ne=oe=te=re=pe=fe=ae=ie=Pe.dragged=Pe.ghost=Pe.clone=Pe.active=null,Se.forEach((function(e){e.checked=!0})),Se.length=ce=de=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":W&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="move"),e.cancelable&&e.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var e,t=[],n=this.el.children,r=0,o=n.length,i=this.options;r/g,">").replace(/"/g,""").replace(/'/g,"'")}function ct(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t];return t.forEach((function(e){for(const t in e)n[t]=e[t]})),n}const dt=e=>!!e.scope||e.sublanguage&&e.language;class ut{constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=lt(e)}openNode(e){if(!dt(e))return;let t="";t=e.sublanguage?`language-${e.language}`:((e,{prefix:t})=>{if(e.includes(".")){const n=e.split(".");return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ")}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)}closeNode(e){dt(e)&&(this.buffer+="")}value(){return this.buffer}span(e){this.buffer+=``}}const ht=(e={})=>{const t={children:[]};return Object.assign(t,e),t};class gt{constructor(){this.rootNode=ht(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const t=ht({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t),t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{gt._collapse(e)})))}}class pt extends gt{constructor(e){super(),this.options=e}addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){return new ut(this,this.options).value()}finalize(){return!0}}function ft(e){return e?"string"==typeof e?e:e.source:null}function mt(e){return _t("(?=",e,")")}function bt(e){return _t("(?:",e,")*")}function vt(e){return _t("(?:",e,")?")}function _t(...e){return e.map((e=>ft(e))).join("")}function yt(...e){const t=function(e){const t=e[e.length-1];return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}(e);return"("+(t.capture?"":"?:")+e.map((e=>ft(e))).join("|")+")"}function Et(e){return new RegExp(e.toString()+"|").exec("").length-1}const wt=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function At(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n;let r=ft(e),o="";for(;r.length>0;){const e=wt.exec(r);if(!e){o+=r;break}o+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?o+="\\"+String(Number(e[1])+t):(o+=e[0],"("===e[0]&&n++)}return o})).map((e=>`(${e})`)).join(t)}const xt="[a-zA-Z]\\w*",St="[a-zA-Z_]\\w*",kt="\\b\\d+(\\.\\d+)?",Nt="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Ct="\\b(0b[01]+)",Ot={begin:"\\\\[\\s\\S]",relevance:0},Tt={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[Ot]},Dt={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[Ot]},Mt=function(e,t,n={}){const r=ct({scope:"comment",begin:e,end:t,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const o=yt("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_t(/[ ]+/,"(",o,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},It=Mt("//","$"),Bt=Mt("/\\*","\\*/"),Rt=Mt("#","$"),Lt={scope:"number",begin:kt,relevance:0},Pt={scope:"number",begin:Nt,relevance:0},jt={scope:"number",begin:Ct,relevance:0},$t={begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[Ot,{begin:/\[/,end:/\]/,relevance:0,contains:[Ot]}]}]},zt={scope:"title",begin:xt,relevance:0},Ft={scope:"title",begin:St,relevance:0},Ht={begin:"\\.\\s*"+St,relevance:0};var Xt=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:xt,UNDERSCORE_IDENT_RE:St,NUMBER_RE:kt,C_NUMBER_RE:Nt,BINARY_NUMBER_RE:Ct,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const t=/^#![ ]*\//;return e.binary&&(e.begin=_t(t,/.*\b/,e.binary,/\b.*/)),ct({scope:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:Ot,APOS_STRING_MODE:Tt,QUOTE_STRING_MODE:Dt,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT:Mt,C_LINE_COMMENT_MODE:It,C_BLOCK_COMMENT_MODE:Bt,HASH_COMMENT_MODE:Rt,NUMBER_MODE:Lt,C_NUMBER_MODE:Pt,BINARY_NUMBER_MODE:jt,REGEXP_MODE:$t,TITLE_MODE:zt,UNDERSCORE_TITLE_MODE:Ft,METHOD_GUARD:Ht,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})}});function Ut(e,t){"."===e.input[e.index-1]&&t.ignoreMatch()}function Yt(e,t){void 0!==e.className&&(e.scope=e.className,delete e.className)}function Kt(e,t){t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=Ut,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,void 0===e.relevance&&(e.relevance=0))}function Wt(e,t){Array.isArray(e.illegal)&&(e.illegal=yt(...e.illegal))}function qt(e,t){if(e.match){if(e.begin||e.end)throw new Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function Gt(e,t){void 0===e.relevance&&(e.relevance=1)}const Zt=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw new Error("beforeMatch cannot be used with starts");const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t]})),e.keywords=n.keywords,e.begin=_t(n.beforeMatch,mt(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},Vt=["of","and","for","in","not","or","if","then","parent","list","value"];function Jt(e,t,n="keyword"){const r=Object.create(null);return"string"==typeof e?o(n,e.split(" ")):Array.isArray(e)?o(n,e):Object.keys(e).forEach((function(n){Object.assign(r,Jt(e[n],t,n))})),r;function o(e,n){t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((function(t){const n=t.split("|");r[n[0]]=[e,Qt(n[0],n[1])]}))}}function Qt(e,t){return t?Number(t):function(e){return Vt.includes(e.toLowerCase())}(e)?0:1}const en={},tn=e=>{console.error(e)},nn=(e,...t)=>{console.log(`WARN: ${e}`,...t)},rn=(e,t)=>{en[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),en[`${e}/${t}`]=!0)},on=new Error;function an(e,t,{key:n}){let r=0;const o=e[n],i={},a={};for(let e=1;e<=t.length;e++)a[e+r]=o[e],i[e+r]=!0,r+=Et(t[e-1]);e[n]=a,e[n]._emit=i,e[n]._multi=!0}function sn(e){!function(e){e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,delete e.scope)}(e),"string"==typeof e.beginScope&&(e.beginScope={_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope}),function(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw tn("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),on;if("object"!=typeof e.beginScope||null===e.beginScope)throw tn("beginScope must be object"),on;an(e,e.begin,{key:"beginScope"}),e.begin=At(e.begin,{joinWith:""})}}(e),function(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw tn("skip, excludeEnd, returnEnd not compatible with endScope: {}"),on;if("object"!=typeof e.endScope||null===e.endScope)throw tn("endScope must be object"),on;an(e,e.end,{key:"endScope"}),e.end=At(e.end,{joinWith:""})}}(e)}function ln(e){function t(t,n){return new RegExp(ft(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=Et(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map((e=>e[1]));this.matcherRe=t(At(e,{joinWith:"|"}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e);if(!t)return null;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}if(e.compilerExtensions||(e.compilerExtensions=[]),e.contains&&e.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=ct(e.classNameAliases||{}),function n(o,i){const a=o;if(o.isCompiled)return a;[Yt,qt,sn,Zt].forEach((e=>e(o,i))),e.compilerExtensions.forEach((e=>e(o,i))),o.__beforeBegin=null,[Kt,Wt,Gt].forEach((e=>e(o,i))),o.isCompiled=!0;let s=null;return"object"==typeof o.keywords&&o.keywords.$pattern&&(o.keywords=Object.assign({},o.keywords),s=o.keywords.$pattern,delete o.keywords.$pattern),s=s||/\w+/,o.keywords&&(o.keywords=Jt(o.keywords,e.case_insensitive)),a.keywordPatternRe=t(s,!0),i&&(o.begin||(o.begin=/\B|\b/),a.beginRe=t(a.begin),o.end||o.endsWithParent||(o.end=/\B|\b/),o.end&&(a.endRe=t(a.end)),a.terminatorEnd=ft(a.end)||"",o.endsWithParent&&i.terminatorEnd&&(a.terminatorEnd+=(o.end?"|":"")+i.terminatorEnd)),o.illegal&&(a.illegalRe=t(o.illegal)),o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((function(e){return function(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((function(t){return ct(e,{variants:null},t)}))),e.cachedVariants?e.cachedVariants:cn(e)?ct(e,{starts:e.starts?ct(e.starts):null}):Object.isFrozen(e)?ct(e):e}("self"===e?o:e)}))),o.contains.forEach((function(e){n(e,a)})),o.starts&&n(o.starts,i),a.matcher=function(e){const t=new r;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin"}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end"}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t}(a),a}(e)}function cn(e){return!!e&&(e.endsWithParent||cn(e.starts))}class dn extends Error{constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}}const un=lt,hn=ct,gn=Symbol("nomatch");var pn=function(e){const t=Object.create(null),n=Object.create(null),r=[];let o=!0;const i="Could not find the language '{}', did you forget to load/include a language module?",a={disableAutodetect:!0,name:"Plain text",contains:[]};let s={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:pt};function l(e){return s.noHighlightRe.test(e)}function c(e,t,n){let r="",o="";"object"==typeof t?(r=e,n=t.ignoreIllegals,o=t.language):(rn("10.7.0","highlight(lang, code, ...args) has been deprecated."),rn("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),o=e,r=t),void 0===n&&(n=!0);const i={code:r,language:o};v("before:highlight",i);const a=i.result?i.result:d(i.language,i.code,n);return a.code=i.code,v("after:highlight",a),a}function d(e,n,r,a){const l=Object.create(null);function c(){if(!x.keywords)return void k.addText(N);let e=0;x.keywordPatternRe.lastIndex=0;let t=x.keywordPatternRe.exec(N),n="";for(;t;){n+=N.substring(e,t.index);const o=E.case_insensitive?t[0].toLowerCase():t[0],i=(r=o,x.keywords[r]);if(i){const[e,r]=i;if(k.addText(n),n="",l[o]=(l[o]||0)+1,l[o]<=7&&(C+=r),e.startsWith("_"))n+=t[0];else{const n=E.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0];e=x.keywordPatternRe.lastIndex,t=x.keywordPatternRe.exec(N)}var r;n+=N.substring(e),k.addText(n)}function h(){null!=x.subLanguage?function(){if(""===N)return;let e=null;if("string"==typeof x.subLanguage){if(!t[x.subLanguage])return void k.addText(N);e=d(x.subLanguage,N,!0,S[x.subLanguage]),S[x.subLanguage]=e._top}else e=u(N,x.subLanguage.length?x.subLanguage:null);x.relevance>0&&(C+=e.relevance),k.addSublanguage(e._emitter,e.language)}():c(),N=""}function g(e,t){let n=1;const r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}const r=E.classNameAliases[e[n]]||e[n],o=t[n];r?k.addKeyword(o,r):(N=o,c(),N=""),n++}}function p(e,t){return e.scope&&"string"==typeof e.scope&&k.openNode(E.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(k.addKeyword(N,E.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),N=""):e.beginScope._multi&&(g(e.beginScope,t),N="")),x=Object.create(e,{parent:{value:x}}),x}function m(e,t,n){let r=function(e,t){const n=e&&e.exec(t);return n&&0===n.index}(e.endRe,n);if(r){if(e["on:end"]){const n=new st(e);e["on:end"](t,n),n.isMatchIgnored&&(r=!1)}if(r){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return m(e.parent,t,n)}function b(e){return 0===x.matcher.regexIndex?(N+=e[0],1):(D=!0,0)}function v(e){const t=e[0],r=n.substring(e.index),o=m(x,e,r);if(!o)return gn;const i=x;x.endScope&&x.endScope._wrap?(h(),k.addKeyword(t,x.endScope._wrap)):x.endScope&&x.endScope._multi?(h(),g(x.endScope,e)):i.skip?N+=t:(i.returnEnd||i.excludeEnd||(N+=t),h(),i.excludeEnd&&(N=t));do{x.scope&&k.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent}while(x!==o.parent);return o.starts&&p(o.starts,e),i.returnEnd?0:t.length}let _={};function y(t,i){const a=i&&i[0];if(N+=t,null==a)return h(),0;if("begin"===_.type&&"end"===i.type&&_.index===i.index&&""===a){if(N+=n.slice(i.index,i.index+1),!o){const t=new Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=_.rule,t}return 1}if(_=i,"begin"===i.type)return function(e){const t=e[0],n=e.rule,r=new st(n),o=[n.__beforeBegin,n["on:begin"]];for(const n of o)if(n&&(n(e,r),r.isMatchIgnored))return b(t);return n.skip?N+=t:(n.excludeBegin&&(N+=t),h(),n.returnBegin||n.excludeBegin||(N=t)),p(n,e),n.returnBegin?0:t.length}(i);if("illegal"===i.type&&!r){const e=new Error('Illegal lexeme "'+a+'" for mode "'+(x.scope||"")+'"');throw e.mode=x,e}if("end"===i.type){const e=v(i);if(e!==gn)return e}if("illegal"===i.type&&""===a)return 1;if(T>1e5&&T>3*i.index)throw new Error("potential infinite loop, way more iterations than matches");return N+=a,a.length}const E=f(e);if(!E)throw tn(i.replace("{}",e)),new Error('Unknown language: "'+e+'"');const w=ln(E);let A="",x=a||w;const S={},k=new s.__emitter(s);!function(){const e=[];for(let t=x;t!==E;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach((e=>k.openNode(e)))}();let N="",C=0,O=0,T=0,D=!1;try{for(x.matcher.considerAll();;){T++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=O;const e=x.matcher.exec(n);if(!e)break;const t=y(n.substring(O,e.index),e);O=e.index+t}return y(n.substring(O)),k.closeAllNodes(),k.finalize(),A=k.toHTML(),{language:e,value:A,relevance:C,illegal:!1,_emitter:k,_top:x}}catch(t){if(t.message&&t.message.includes("Illegal"))return{language:e,value:un(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:O,context:n.slice(O-100,O+100),mode:t.mode,resultSoFar:A},_emitter:k};if(o)return{language:e,value:un(n),illegal:!1,relevance:0,errorRaised:t,_emitter:k,_top:x};throw t}}function u(e,n){n=n||s.languages||Object.keys(t);const r=function(e){const t={value:un(e),illegal:!1,relevance:0,_top:a,_emitter:new s.__emitter(s)};return t._emitter.addText(e),t}(e),o=n.filter(f).filter(b).map((t=>d(t,e,!1)));o.unshift(r);const i=o.sort(((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(f(e.language).supersetOf===t.language)return 1;if(f(t.language).supersetOf===e.language)return-1}return 0})),[l,c]=i,u=l;return u.secondBest=c,u}function h(e){let t=null;const r=function(e){let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"";const n=s.languageDetectRe.exec(t);if(n){const t=f(n[1]);return t||(nn(i.replace("{}",n[1])),nn("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"}return t.split(/\s+/).find((e=>l(e)||f(e)))}(e);if(l(r))return;if(v("before:highlightElement",{el:e,language:r}),e.children.length>0&&(s.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(e)),s.throwUnescapedHTML))throw new dn("One of your code blocks includes unescaped HTML.",e.innerHTML);t=e;const o=t.textContent,a=r?c(o,{language:r,ignoreIllegals:!0}):u(o);e.innerHTML=a.value,function(e,t,r){const o=t&&n[t]||r;e.classList.add("hljs"),e.classList.add(`language-${o}`)}(e,r,a.language),e.result={language:a.language,re:a.relevance,relevance:a.relevance},a.secondBest&&(e.secondBest={language:a.secondBest.language,relevance:a.secondBest.relevance}),v("after:highlightElement",{el:e,result:a,text:o})}let g=!1;function p(){"loading"!==document.readyState?document.querySelectorAll(s.cssSelector).forEach(h):g=!0}function f(e){return e=(e||"").toLowerCase(),t[e]||t[n[e]]}function m(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{n[e.toLowerCase()]=t}))}function b(e){const t=f(e);return t&&!t.disableAutodetect}function v(e,t){const n=e;r.forEach((function(e){e[n]&&e[n](t)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function(){g&&p()}),!1),Object.assign(e,{highlight:c,highlightAuto:u,highlightAll:p,highlightElement:h,highlightBlock:function(e){return rn("10.7.0","highlightBlock will be removed entirely in v12.0"),rn("10.7.0","Please use highlightElement now."),h(e)},configure:function(e){s=hn(s,e)},initHighlighting:()=>{p(),rn("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){p(),rn("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(n,r){let i=null;try{i=r(e)}catch(e){if(tn("Language definition for '{}' could not be registered.".replace("{}",n)),!o)throw e;tn(e),i=a}i.name||(i.name=n),t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&m(i.aliases,{languageName:n})},unregisterLanguage:function(e){delete t[e];for(const t of Object.keys(n))n[t]===e&&delete n[t]},listLanguages:function(){return Object.keys(t)},getLanguage:f,registerAliases:m,autoDetection:b,inherit:hn,addPlugin:function(e){!function(e){e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{e["before:highlightBlock"](Object.assign({block:t.el},t))}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{e["after:highlightBlock"](Object.assign({block:t.el},t))})}(e),r.push(e)}}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString="11.7.0",e.regex={concat:_t,lookahead:mt,either:yt,optional:vt,anyNumberOfTimes:bt};for(const e in Xt)"object"==typeof Xt[e]&&it.exports(Xt[e]);return Object.assign(e,Xt),e}({}),fn=pn;pn.HighlightJS=pn,pn.default=pn;var mn=fn;class bn{el;_dropArea;_dragArea;_dropSortable;_dragSortable;parentElement;_prevPosition;reusable;randomize;storedSourceBlocks;storedSourceBlockExplanations;blockOrder;hljsLanguage;_liveRegion;initialized;constructor(e,t,n){this.el=document.createElement("div"),this.el.classList.add("hparsons-input"),this.parentElement=e,this.el.id="hparsonstool-"+this.parentElement.toolNumber+"-parsons-input";const r=document.createElement("div");r.innerText="Drag or click the blocks below to form your code:",r.classList.add("hparsons-tip"),this.el.append(r),this._dragArea=document.createElement("div"),this.el.appendChild(this._dragArea),this._dragArea.classList.add("drag-area"),this._dragArea.setAttribute("role","listbox"),this._dragArea.setAttribute("aria-label","Available blocks");const o=document.createElement("div");o.innerText="Your code (click on a block to remove it):",o.classList.add("hparsons-tip"),this.el.append(o),this._dropArea=document.createElement("div"),this.el.appendChild(this._dropArea),this._dropArea.classList.add("drop-area"),this._dropArea.setAttribute("role","listbox"),this._dropArea.setAttribute("aria-label","Answer area"),this._prevPosition=-1,this._liveRegion=document.createElement("div"),this._liveRegion.setAttribute("aria-live","polite"),this._liveRegion.setAttribute("aria-atomic","true"),this._liveRegion.classList.add("sr-only"),this.el.appendChild(this._liveRegion),this.storedSourceBlocks=[],this.blockOrder=[],this.storedSourceBlockExplanations=null,this.reusable=t,this.randomize=n,this._dragSortable=null,this._dropSortable=null,this._initSortable(),this._setupKeyboardNav(),this.initialized=!1}getText=e=>{let t="";if(this._dropArea.hasChildNodes()){let n=this._dropArea.firstChild;for(t+=this._getTextFromBlock(n);n.nextSibling;)n=n.nextSibling,t+=e?" ":"",t+=this._getTextFromBlock(n);return t}return t};getBlockIndices=()=>{const e=this._dropArea.querySelectorAll(".parsons-block");return Array.from(e).map((e=>parseInt(e.dataset.index||"-1")))};_getTextFromBlock=e=>{if("raw"==this.parentElement.language)return e.innerHTML;if(!e.lastChild||e.lastChild.nodeType!=Node.ELEMENT_NODE)return e.textContent||"";const t=e.lastChild.classList.contains("parsons-tooltip")&&e.lastChild.textContent?.length||0;return t>0?(e.textContent||"").slice(0,-t):e.textContent||""};shuffleArray(e){for(let t=e.length-1;t>0;t--){let n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}}setSourceBlocks=(e,t)=>{this.blockOrder=[];for(let t=0;t{for(;this._dragArea.firstChild;)this._dragArea.removeChild(this._dragArea.firstChild);for(;this._dropArea.firstChild;)this._dropArea.removeChild(this._dropArea.firstChild);for(let e=0;e{this._onBlockClicked(t,e)},this.storedSourceBlockExplanations&&this.storedSourceBlockExplanations[this.blockOrder[e]]){const n=document.createElement("div");n.innerText=this.storedSourceBlockExplanations[this.blockOrder[e]],n.classList.add("parsons-tooltip"),t.appendChild(n)}}this._updateBlockAria()};_onBlockClicked=(e,t)=>{const n=this._getTextFromBlock(e).trim();if(e.parentElement==this._dragArea){let r;if(this.reusable){const t=e.cloneNode(!0);t.onclick=e=>this._onBlockClicked(t,e),this._dropArea.appendChild(t),r=this._getBlockPosition(t)}else this._dropArea.appendChild(e),r=this._getBlockPosition(e);const o={type:"input",action:et.InputAction.ADD,position:[-1,r],answer:this._getTextArray()};t.isTrusted&&this.parentElement.logEvent(o),this._updateBlockAria(),this._announce(`${n} moved to answer area`)}else{const t=this._getBlockPosition(e);this.reusable?this._dropArea.removeChild(e):this._dragArea.appendChild(e);const r={type:"input",action:et.InputAction.REMOVE,position:[t,-1],answer:this._getTextArray()};this.parentElement.logEvent(r),this._updateBlockAria(),this._announce(`${n} moved to available blocks`)}};_initSortable=()=>{this.reusable?(this._dragSortable=new Pe(this._dragArea,{group:{name:"shared",pull:"clone",put:!1},sort:!1,direction:"horizontal",animation:150,draggable:".parsons-block",onClone:e=>{const t=e.clone;t.onclick=e=>this._onBlockClicked(t,e)}}),this._dropSortable=new Pe(this._dropArea,{group:"shared",direction:"horizontal",animation:150,draggable:".parsons-block",onAdd:e=>{const t={type:"input",action:et.InputAction.ADD,position:[-1,this._getBlockPosition(e.item)],answer:this._getTextArray()};this.parentElement.logEvent(t),this._updateBlockAria()},onStart:e=>{this._prevPosition=this._getBlockPosition(e.item)},onEnd:e=>{let t,n=et.InputAction.MOVE;const r=this._dropArea.getBoundingClientRect().top,o=this._dropArea.getBoundingClientRect().bottom;if(e.originalEvent.clientY>o||e.originalEvent.clientY{const t={type:"input",action:et.InputAction.ADD,position:[-1,this._getBlockPosition(e.item)],answer:this._getTextArray()};this.parentElement.logEvent(t),this._updateBlockAria()},onStart:e=>{this._prevPosition=this._getBlockPosition(e.item)},onEnd:e=>{let t=this._getBlockPosition(e.item);const n={type:"input",action:-1==t?et.InputAction.REMOVE:et.InputAction.MOVE,position:[this._prevPosition,t],answer:this._getTextArray()};this.parentElement.logEvent(n),this._updateBlockAria()}}))};updateTestStatus=e=>{this._dropArea.classList.contains(e)||(this._dropArea.classList.contains("Pass")?this._dropArea.classList.remove("Pass"):this._dropArea.classList.contains("Fail")?this._dropArea.classList.remove("Fail"):this._dropArea.classList.contains("Error")&&this._dropArea.classList.remove("Error"),this._dropArea.classList.add(e))};_updateBlockAria=()=>{const e=(e,t)=>{e.querySelectorAll(".parsons-block").forEach(((e,n)=>{e.setAttribute("role","option"),e.setAttribute("aria-selected",t?"true":"false"),e.setAttribute("tabindex",0===n?"0":"-1")}))};e(this._dragArea,!1),e(this._dropArea,!0)};_focusBlock=(e,t)=>{t.querySelectorAll(".parsons-block").forEach((e=>{e.setAttribute("tabindex","-1")})),e.setAttribute("tabindex","0"),e.focus()};_announce=e=>{this._liveRegion.textContent="",setTimeout((()=>{this._liveRegion.textContent=e}),10)};_setupKeyboardNav=()=>{this.el.addEventListener("keydown",(e=>{const t=e.target.closest(".parsons-block");if(!t)return;const n=t.parentElement;if(n!==this._dragArea&&n!==this._dropArea)return;const r=Array.from(n.querySelectorAll(".parsons-block")),o=r.indexOf(t);switch(e.key){case"ArrowRight":case"ArrowDown":e.preventDefault(),o0&&this._focusBlock(r[o-1],n);break;case" ":case"Enter":{e.preventDefault();const r=n===this._dragArea;this._onBlockClicked(t,e);let o=null;o=r?this.reusable?this._dropArea.lastElementChild:t:this.reusable?this._dropArea.firstElementChild||this._dragArea.firstElementChild:t,o&&this._focusBlock(o,o.parentElement);break}}}))};_getBlockPosition=e=>{let t=-1;const n=this._dropArea;if(n)for(t=0;t{let e=[];if(this._dropArea.hasChildNodes()){let t=this._dropArea.firstChild;for(e.push(this._getTextFromBlock(t));t.nextSibling;)t=t.nextSibling,e.push(this._getTextFromBlock(t))}return e};removeFormat=()=>{if(this._dropArea.hasChildNodes()){let e=this._dropArea.firstChild;for(e.style.removeProperty("background-color");e.nextSibling;)e=e.nextSibling,e.style.removeProperty("background-color")}};resetInput=()=>{if(this.reusable){for(;this._dropArea.firstChild;)this._dropArea.removeChild(this._dropArea.firstChild);this._updateBlockAria()}else this._resetInput()};restoreAnswer(e){this.resetInput();const t=/^\s+$/;for(let n=0;nTn(e,t,n-1)))}mn.registerLanguage("javascript",(function(e){const t=e.regex,n=vn,r={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];if("<"===r||","===r)return void t.ignoreMatch();let o;">"===r&&(((e,{after:t})=>{const n="",k={match:[/const|var|let/,/\s+/,n,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(S)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[b]};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:o,exports:{PARAMS_CONTAINS:m,CLASS_REFERENCE:_},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,u,h,g,{match:/\$\d+/},l,_,{className:"attr",begin:n+t.lookahead(":"),relevance:0},k,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[g,e.REGEXP_MODE,{className:"function",begin:S,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:m}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:r.begin,"on:begin":r.isTrulyOpeningTag,end:r.end}],subLanguage:"xml",contains:[{begin:r.begin,end:r.end,skip:!0,contains:["self"]}]}]},y,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[b,e.inherit(e.TITLE_MODE,{begin:n,className:"title.function"})]},{match:/\.\.\./,relevance:0},A,{match:"\\$"+n,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[b]},E,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},v,x,{match:/\$[(.]/}]}})),mn.registerLanguage("sql",(function(e){const t=e.regex,n=e.COMMENT("--","$"),r=["true","false","unknown"],o=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],i=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],a=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],s=i,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!i.includes(e))),c={begin:t.concat(/\b/,t.either(...s),/\s*\(/),relevance:0,keywords:{built_in:s}};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:function(e,{exceptions:t,when:n}={}){const r=n;return t=t||[],e.map((e=>e.match(/\|\d+$/)||t.includes(e)?e:r(e)?`${e}|0`:e))}(l,{when:e=>e.length<3}),literal:r,type:o,built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]},contains:[{begin:t.either(...a),relevance:0,keywords:{$pattern:/[\w\.]+/,keyword:l.concat(a),literal:r,type:o}},{className:"type",begin:t.either("double precision","large object","with timezone","without timezone")},c,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}})),mn.registerLanguage("java",(function(e){const t=e.regex,n="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=n+Tn("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),o={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},i={className:"meta",begin:"@"+n,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},a={className:"params",begin:/\(/,end:/\)/,keywords:o,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:o,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[t.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",3:"title.class"},contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:o,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:o,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,On,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},On,i]}})),mn.registerLanguage("xml",(function(e){const t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},o={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=e.inherit(o,{begin:/\(/,end:/\)/}),a=e.inherit(e.APOS_STRING_MODE,{className:"string"}),s=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[o,s,a,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[o,i,s,a]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},r,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[s]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:t.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:l}]},{className:"tag",begin:t.concat(/<\//,t.lookahead(t.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}})),mn.registerLanguage("python",(function(e){const t=e.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],o={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},i={className:"meta",begin:/^(>>>|\.\.\.) /},a={className:"subst",begin:/\{/,end:/\}/,keywords:o,illegal:/#/},s={begin:/\{\{/,relevance:0},l={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,i,s,a]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,s,a]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,a]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,a]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,u=`\\b|${r.join("|")}`,h={className:"number",relevance:0,variants:[{begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${u})`},{begin:`(${d})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${u})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${u})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${u})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${u})`},{begin:`\\b(${c})[jJ](?=${u})`}]},g={className:"comment",begin:t.lookahead(/# type:/),end:/$/,keywords:o,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},p={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:["self",i,h,l,e.HASH_COMMENT_MODE]}]};return a.contains=[l,h,i],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:o,illegal:/(<\/|->|\?)|=>/,contains:[i,h,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},l,g,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[p]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[h,p,l]}]}}));class Dn extends HTMLElement{root;_parsonsData;parsonsExplanation;hparsonsInput;inputType;static toolCount=0;toolNumber;temporaryInputEvent;language;hljsLanguage;codeBefore;codeAfter;constructor(){super(),Dn.toolCount+=1,this.toolNumber=Dn.toolCount,this.root=this;const e=!!this.getAttribute("reuse"),t=!!this.getAttribute("randomize");this.hparsonsInput=new bn(this,e,t),this._parsonsData=new Array,this.parsonsExplanation=null,this.inputType="parsons",this.language=this.getAttribute("language")||"none";let n=new Map(Object.entries({html:"xml",python:"python",javascript:"javascript",java:"java",sql:"sql"}));this.hljsLanguage=n.get(this.language),this.initInput(),this.temporaryInputEvent=null,this.codeBefore=null,this.codeAfter=null}set parsonsData(e){this._parsonsData=e,"parsons"==this.inputType&&this.hparsonsInput.setSourceBlocks(e,this.parsonsExplanation)}get parsonsData(){return this._parsonsData}logEvent=e=>{const t=new CustomEvent("micro-parsons",{bubbles:!0,detail:{...e}});this.dispatchEvent(t)};initInput(){this.inputType="parsons",this._parsonsData=new Array,this.parsonsExplanation=null;const e=null!=this.getAttribute("reuse"),t=null!=this.getAttribute("randomize");this.hparsonsInput=new bn(this,e,t),this.root.appendChild(this.hparsonsInput.el)}resetInput(){this.hparsonsInput.resetInput(),this.logEvent({type:"reset"})}restoreAnswer(e){this.hparsonsInput.restoreAnswer(e)}restoreAnswerByIndices(e){this.hparsonsInput.restoreAnswerByIndices(e)}getCurrentInput(e){return this.hparsonsInput.getText(e)}getParsonsTextArray(){return this.hparsonsInput._getTextArray()}getBlockIndices(){return this.hparsonsInput.getBlockIndices()}setCodeContext(e){if(e.before){let t;this.codeBefore=e.before,this.querySelector(".context.before")?t=this.querySelector(".context.before"):(t=document.createElement("pre"),t.className="context before",this.querySelector(".hparsons-input").insertBefore(t,this.querySelector(".drop-area"))),t.innerHTML=this.codeBefore,this.hljsLanguage&&(t.className="context before",t.classList.add(this.hljsLanguage),mn.highlightElement(t))}if(e.after){let t;this.codeAfter=e.after,this.querySelector(".context.after")?t=this.querySelector(".context.after"):(t=document.createElement("pre"),t.className="context after",this.querySelector(".hparsons-input").appendChild(t)),t.innerHTML=this.codeAfter,this.hljsLanguage&&(t.className="context after",t.classList.add(this.hljsLanguage),mn.highlightElement(t))}}}const Mn=e=>{let t;try{t=document.querySelector(e.selector)}catch{throw"micro-parsons: init: selector error"}if(null==t||"DIV"!=t.tagName)throw"micro-parsons: element not a div";const n=-1==["javascript","sql","java","html","python","raw"].indexOf(e.language||"")?"":`language='${e.language}'`,r=e.id?`id='${e.id}'`:"",o=``;t.innerHTML=o;const i=t.firstChild;i.parsonsExplanation=e.parsonsTooltips,i.parsonsData=e.parsonsBlocks,e.context&&i.setCodeContext(e.context)};customElements.define("micro-parsons",Dn)}}]); +//# sourceMappingURL=207.3a19748be8bb18ba.js.map \ No newline at end of file diff --git a/course/_static/207.3a19748be8bb18ba.js.LICENSE.txt b/course/_static/207.3a19748be8bb18ba.js.LICENSE.txt new file mode 100755 index 0000000..843b4fd --- /dev/null +++ b/course/_static/207.3a19748be8bb18ba.js.LICENSE.txt @@ -0,0 +1,6 @@ +/**! + * Sortable 1.14.0 + * @author RubaXa + * @author owenm + * @license MIT + */ diff --git a/course/_static/207.3a19748be8bb18ba.js.gz b/course/_static/207.3a19748be8bb18ba.js.gz new file mode 100755 index 0000000000000000000000000000000000000000..9b196ef0cd9f9ad836baffcaba559b324ee8455c GIT binary patch literal 29558 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

    `{Pr9`3X+#yW@ky@T_9L{stt^Nj#|7``0IX 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\n * @author\towenm \n * @license MIT\n */\nfunction e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function a(e){if(\"undefined\"!=typeof window&&window.navigator)return!!navigator.userAgent.match(e)}var s=a(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),l=a(/Edge/i),c=a(/firefox/i),d=a(/safari/i)&&!a(/chrome/i)&&!a(/android/i),u=a(/iP(ad|od|hone)/i),h=a(/chrome/i)&&a(/android/i),g={capture:!1,passive:!1};function p(e,t,n){e.addEventListener(t,n,!s&&g)}function f(e,t,n){e.removeEventListener(t,n,!s&&g)}function m(e,t){if(t){if(\">\"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function b(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function v(e,t,n,r){if(e){n=n||document;do{if(null!=t&&(\">\"===t[0]?e.parentNode===n&&m(e,t):m(e,t))||r&&e===n)return e;if(e===n)break}while(e=b(e))}return null}var _,y=/\\s+/g;function E(e,t,n){if(e&&t)if(e.classList)e.classList[n?\"add\":\"remove\"](t);else{var r=(\" \"+e.className+\" \").replace(y,\" \").replace(\" \"+t+\" \",\" \");e.className=(r+(n?\" \"+t:\"\")).replace(y,\" \")}}function w(e,t,n){var r=e&&e.style;if(r){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,\"\"):e.currentStyle&&(n=e.currentStyle),void 0===t?n:n[t];t in r||-1!==t.indexOf(\"webkit\")||(t=\"-webkit-\"+t),r[t]=n+(\"string\"==typeof n?\"\":\"px\")}}function A(e,t){var n=\"\";if(\"string\"==typeof e)n=e;else do{var r=w(e,\"transform\");r&&\"none\"!==r&&(n=r+\" \"+n)}while(!t&&(e=e.parentNode));var o=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return o&&new o(n)}function x(e,t,n){if(e){var r=e.getElementsByTagName(t),o=0,i=r.length;if(n)for(;o=i:o<=i))return r;if(r===S())break;r=M(r,!1)}return!1}function C(e,t,n,r){for(var o=0,i=0,a=e.children;i2&&void 0!==arguments[2]?arguments[2]:{},o=r.evt,a=i(r,H);F.pluginEvent.bind(Re)(e,n,t({dragEl:Y,parentEl:K,ghostEl:q,rootEl:G,nextEl:W,lastDownEl:Z,cloneEl:V,cloneHidden:J,dragStarted:ue,putSortable:oe,activeSortable:Re.active,originalEvent:o,oldIndex:Q,oldDraggableIndex:te,newIndex:ee,newDraggableIndex:ne,hideGhostForTarget:De,unhideGhostForTarget:Me,cloneNowHidden:function(){J=!0},cloneNowShown:function(){J=!1},dispatchSortableEvent:function(e){U({sortable:n,name:e,originalEvent:o})}},a))};function U(e){!function(e){var n=e.sortable,r=e.rootEl,o=e.name,i=e.targetEl,a=e.cloneEl,c=e.toEl,d=e.fromEl,u=e.oldIndex,h=e.newIndex,g=e.oldDraggableIndex,p=e.newDraggableIndex,f=e.originalEvent,m=e.putSortable,b=e.extraEventProperties;if(n=n||r&&r[P]){var v,_=n.options,y=\"on\"+o.charAt(0).toUpperCase()+o.substr(1);!window.CustomEvent||s||l?(v=document.createEvent(\"Event\")).initEvent(o,!0,!0):v=new CustomEvent(o,{bubbles:!0,cancelable:!0}),v.to=c||r,v.from=d||r,v.item=i||r,v.clone=a,v.oldIndex=u,v.newIndex=h,v.oldDraggableIndex=g,v.newDraggableIndex=p,v.originalEvent=f,v.pullMode=m?m.lastPutMode:void 0;var E=t(t({},b),F.getEventProperties(o,n));for(var w in E)v[w]=E[w];r&&r.dispatchEvent(v),_[y]&&_[y].call(n,v)}}(t({putSortable:oe,cloneEl:V,targetEl:Y,rootEl:G,oldIndex:Q,oldDraggableIndex:te,newIndex:ee,newDraggableIndex:ne},e))}var Y,K,q,G,W,Z,V,J,Q,ee,te,ne,re,oe,ie,ae,se,le,ce,de,ue,he,ge,pe,fe,me=!1,be=!1,ve=[],_e=!1,ye=!1,Ee=[],we=!1,Ae=[],xe=\"undefined\"!=typeof document,Se=u,ke=l||s?\"cssFloat\":\"float\",Ne=xe&&!h&&!u&&\"draggable\"in document.createElement(\"div\"),Ce=function(){if(xe){if(s)return!1;var e=document.createElement(\"x\");return e.style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents}}(),Oe=function(e,t){var n=w(e),r=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),o=C(e,0,t),i=C(e,1,t),a=o&&w(o),s=i&&w(i),l=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+k(o).width,c=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+k(i).width;if(\"flex\"===n.display)return\"column\"===n.flexDirection||\"column-reverse\"===n.flexDirection?\"vertical\":\"horizontal\";if(\"grid\"===n.display)return n.gridTemplateColumns.split(\" \").length<=1?\"vertical\":\"horizontal\";if(o&&a.float&&\"none\"!==a.float){var d=\"left\"===a.float?\"left\":\"right\";return!i||\"both\"!==s.clear&&s.clear!==d?\"horizontal\":\"vertical\"}return o&&(\"block\"===a.display||\"flex\"===a.display||\"table\"===a.display||\"grid\"===a.display||l>=r&&\"none\"===n[ke]||i&&\"none\"===n[ke]&&l+c>r)?\"vertical\":\"horizontal\"},Te=function(e){function t(e,n){return function(r,o,i,a){var s=r.options.group.name&&o.options.group.name&&r.options.group.name===o.options.group.name;if(null==e&&(n||s))return!0;if(null==e||!1===e)return!1;if(n&&\"clone\"===e)return e;if(\"function\"==typeof e)return t(e(r,o,i,a),n)(r,o,i,a);var l=(n?r:o).options.group.name;return!0===e||\"string\"==typeof e&&e===l||e.join&&e.indexOf(l)>-1}}var r={},o=e.group;o&&\"object\"==n(o)||(o={name:o}),r.name=o.name,r.checkPull=t(o.pull,!0),r.checkPut=t(o.put),r.revertClone=o.revertClone,e.group=r},De=function(){!Ce&&q&&w(q,\"display\",\"none\")},Me=function(){!Ce&&q&&w(q,\"display\",\"\")};xe&&document.addEventListener(\"click\",(function(e){if(be)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),be=!1,!1}),!0);var Ie=function(e){if(Y){e=e.touches?e.touches[0]:e;var t=(o=e.clientX,i=e.clientY,ve.some((function(e){var t=e[P].options.emptyInsertThreshold;if(t&&!O(e)){var n=k(e),r=o>=n.left-t&&o<=n.right+t,s=i>=n.top-t&&i<=n.bottom+t;return r&&s?a=e:void 0}})),a);if(t){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);n.target=n.rootEl=t,n.preventDefault=void 0,n.stopPropagation=void 0,t[P]._onDragOver(n)}}var o,i,a},Be=function(e){Y&&Y.parentNode[P]._isOutsideThisEl(e.target)};function Re(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw\"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(e));this.el=e,this.options=t=o({},t),e[P]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?\">li\":\">*\",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Oe(e,this.options)},ghostClass:\"sortable-ghost\",chosenClass:\"sortable-chosen\",dragClass:\"sortable-drag\",ignore:\"a, img\",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData(\"Text\",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:\"data-id\",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:\"sortable-fallback\",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Re.supportPointer&&\"PointerEvent\"in window&&!d,emptyInsertThreshold:5};for(var r in F.initializePlugins(this,e,n),n)!(r in t)&&(t[r]=n[r]);for(var i in Te(t),this)\"_\"===i.charAt(0)&&\"function\"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!t.forceFallback&&Ne,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?p(e,\"pointerdown\",this._onTapStart):(p(e,\"mousedown\",this._onTapStart),p(e,\"touchstart\",this._onTapStart)),this.nativeDraggable&&(p(e,\"dragover\",this),p(e,\"dragenter\",this)),ve.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),o(this,j())}function Le(e,t,n,r,o,i,a,c){var d,u,h=e[P],g=h.options.onMove;return!window.CustomEvent||s||l?(d=document.createEvent(\"Event\")).initEvent(\"move\",!0,!0):d=new CustomEvent(\"move\",{bubbles:!0,cancelable:!0}),d.to=t,d.from=e,d.dragged=n,d.draggedRect=r,d.related=o||t,d.relatedRect=i||k(t),d.willInsertAfter=c,d.originalEvent=a,e.dispatchEvent(d),g&&(u=g.call(h,d,a)),u}function Pe(e){e.draggable=!1}function je(){we=!1}function $e(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function ze(e){return setTimeout(e,0)}function Fe(e){return clearTimeout(e)}Re.prototype={constructor:Re,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(he=null)},_getDirection:function(e,t){return\"function\"==typeof this.options.direction?this.options.direction.call(this,e,t,Y):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,n=this.el,r=this.options,o=r.preventOnFilter,i=e.type,a=e.touches&&e.touches[0]||e.pointerType&&\"touch\"===e.pointerType&&e,s=(a||e).target,l=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,c=r.filter;if(function(e){Ae.length=0;var t=e.getElementsByTagName(\"input\"),n=t.length;for(;n--;){var r=t[n];r.checked&&Ae.push(r)}}(n),!Y&&!(/mousedown|pointerdown/.test(i)&&0!==e.button||r.disabled)&&!l.isContentEditable&&(this.nativeDraggable||!d||!s||\"SELECT\"!==s.tagName.toUpperCase())&&!((s=v(s,r.draggable,n,!1))&&s.animated||Z===s)){if(Q=T(s),te=T(s,r.draggable),\"function\"==typeof c){if(c.call(this,e,s,this))return U({sortable:t,rootEl:l,name:\"filter\",targetEl:s,toEl:n,fromEl:n}),X(\"filter\",t,{evt:e}),void(o&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(\",\").some((function(r){if(r=v(l,r.trim(),n,!1))return U({sortable:t,rootEl:r,name:\"filter\",targetEl:s,fromEl:n,toEl:n}),X(\"filter\",t,{evt:e}),!0}))))return void(o&&e.cancelable&&e.preventDefault());r.handle&&!v(l,r.handle,n,!1)||this._prepareDragStart(e,a,s)}}},_prepareDragStart:function(e,t,n){var r,o=this,i=o.el,a=o.options,d=i.ownerDocument;if(n&&!Y&&n.parentNode===i){var u=k(n);if(G=i,K=(Y=n).parentNode,W=Y.nextSibling,Z=n,re=a.group,Re.dragged=Y,ie={target:Y,clientX:(t||e).clientX,clientY:(t||e).clientY},ce=ie.clientX-u.left,de=ie.clientY-u.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,Y.style[\"will-change\"]=\"all\",r=function(){X(\"delayEnded\",o,{evt:e}),Re.eventCanceled?o._onDrop():(o._disableDelayedDragEvents(),!c&&o.nativeDraggable&&(Y.draggable=!0),o._triggerDragStart(e,t),U({sortable:o,name:\"choose\",originalEvent:e}),E(Y,a.chosenClass,!0))},a.ignore.split(\",\").forEach((function(e){x(Y,e.trim(),Pe)})),p(d,\"dragover\",Ie),p(d,\"mousemove\",Ie),p(d,\"touchmove\",Ie),p(d,\"mouseup\",o._onDrop),p(d,\"touchend\",o._onDrop),p(d,\"touchcancel\",o._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,Y.draggable=!0),X(\"delayStart\",this,{evt:e}),!a.delay||a.delayOnTouchOnly&&!t||this.nativeDraggable&&(l||s))r();else{if(Re.eventCanceled)return void this._onDrop();p(d,\"mouseup\",o._disableDelayedDrag),p(d,\"touchend\",o._disableDelayedDrag),p(d,\"touchcancel\",o._disableDelayedDrag),p(d,\"mousemove\",o._delayedDragTouchMoveHandler),p(d,\"touchmove\",o._delayedDragTouchMoveHandler),a.supportPointer&&p(d,\"pointermove\",o._delayedDragTouchMoveHandler),o._dragStartTimer=setTimeout(r,a.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){Y&&Pe(Y),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;f(e,\"mouseup\",this._disableDelayedDrag),f(e,\"touchend\",this._disableDelayedDrag),f(e,\"touchcancel\",this._disableDelayedDrag),f(e,\"mousemove\",this._delayedDragTouchMoveHandler),f(e,\"touchmove\",this._delayedDragTouchMoveHandler),f(e,\"pointermove\",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||\"touch\"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?p(document,\"pointermove\",this._onTouchMove):p(document,t?\"touchmove\":\"mousemove\",this._onTouchMove):(p(Y,\"dragend\",this),p(G,\"dragstart\",this._onDragStart));try{document.selection?ze((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(me=!1,G&&Y){X(\"dragStarted\",this,{evt:t}),this.nativeDraggable&&p(document,\"dragover\",Be);var n=this.options;!e&&E(Y,n.dragClass,!1),E(Y,n.ghostClass,!0),Re.active=this,e&&this._appendGhost(),U({sortable:this,name:\"start\",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(ae){this._lastX=ae.clientX,this._lastY=ae.clientY,De();for(var e=document.elementFromPoint(ae.clientX,ae.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(ae.clientX,ae.clientY))!==t;)t=e;if(Y.parentNode[P]._isOutsideThisEl(e),t)do{if(t[P]){if(t[P]._onDragOver({clientX:ae.clientX,clientY:ae.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break}e=t}while(t=t.parentNode);Me()}},_onTouchMove:function(e){if(ie){var t=this.options,n=t.fallbackTolerance,r=t.fallbackOffset,o=e.touches?e.touches[0]:e,i=q&&A(q,!0),a=q&&i&&i.a,s=q&&i&&i.d,l=Se&&fe&&D(fe),c=(o.clientX-ie.clientX+r.x)/(a||1)+(l?l[0]-Ee[0]:0)/(a||1),d=(o.clientY-ie.clientY+r.y)/(s||1)+(l?l[1]-Ee[1]:0)/(s||1);if(!Re.active&&!me){if(n&&Math.max(Math.abs(o.clientX-this._lastX),Math.abs(o.clientY-this._lastY))r.right+o||e.clientX<=r.right&&e.clientY>r.bottom&&e.clientX>=r.left:e.clientX>r.right&&e.clientY>r.top||e.clientX<=r.right&&e.clientY>r.bottom+o}(e,i,this)&&!m.animated){if(m===Y)return H(!1);if(m&&a===e.target&&(s=m),s&&(r=k(s)),!1!==Le(G,a,Y,n,s,r,e,!!s))return F(),a.appendChild(Y),K=a,Z(),H(!0)}else if(m&&function(e,t,n){var r=k(C(n.el,0,n.options,!0)),o=10;return t?e.clientXd+c*i/2:lu-pe)return-ge}else if(l>d+c*(1-o)/2&&lu-c*i/2))return l>d+c/2?1:-1;return 0}(e,s,r,i,S?1:l.swapThreshold,null==l.invertedSwapThreshold?l.swapThreshold:l.invertedSwapThreshold,ye,he===s),0!==_){var B=T(Y);do{B-=_,A=K.children[B]}while(A&&(\"none\"===w(A,\"display\")||A===q))}if(0===_||A===s)return H(!1);he=s,ge=_;var L=s.nextElementSibling,j=!1,$=Le(G,a,Y,n,s,r,e,j=1===_);if(!1!==$)return 1!==$&&-1!==$||(j=1===$),we=!0,setTimeout(je,30),F(),j&&!L?a.appendChild(Y):s.parentNode.insertBefore(Y,j?L:s),M&&R(M,0,I-M.scrollTop),K=Y.parentNode,void 0===y||ye||(pe=Math.abs(y-k(s)[D])),Z(),H(!0)}if(a.contains(Y))return H(!1)}return!1}function z(l,c){X(l,p,t({evt:e,isOwner:u,axis:i?\"vertical\":\"horizontal\",revert:o,dragRect:n,targetRect:r,canSort:h,fromSortable:g,target:s,completed:H,onMove:function(t,r){return Le(G,a,Y,n,t,k(t),e,r)},changed:Z},c))}function F(){z(\"dragOverAnimationCapture\"),p.captureAnimationState(),p!==g&&g.captureAnimationState()}function H(t){return z(\"dragOverCompleted\",{insertion:t}),t&&(u?d._hideClone():d._showClone(p),p!==g&&(E(Y,oe?oe.options.ghostClass:d.options.ghostClass,!1),E(Y,l.ghostClass,!0)),oe!==p&&p!==Re.active?oe=p:p===Re.active&&oe&&(oe=null),g===p&&(p._ignoreWhileAnimating=s),p.animateAll((function(){z(\"dragOverAnimationComplete\"),p._ignoreWhileAnimating=null})),p!==g&&(g.animateAll(),g._ignoreWhileAnimating=null)),(s===Y&&!Y.animated||s===a&&!s.animated)&&(he=null),l.dragoverBubble||e.rootEl||s===document||(Y.parentNode[P]._isOutsideThisEl(e.target),!t&&Ie(e)),!l.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),f=!0}function Z(){ee=T(Y),ne=T(Y,l.draggable),U({sortable:p,name:\"change\",toEl:a,newIndex:ee,newDraggableIndex:ne,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){f(document,\"mousemove\",this._onTouchMove),f(document,\"touchmove\",this._onTouchMove),f(document,\"pointermove\",this._onTouchMove),f(document,\"dragover\",Ie),f(document,\"mousemove\",Ie),f(document,\"touchmove\",Ie)},_offUpEvents:function(){var e=this.el.ownerDocument;f(e,\"mouseup\",this._onDrop),f(e,\"touchend\",this._onDrop),f(e,\"pointerup\",this._onDrop),f(e,\"touchcancel\",this._onDrop),f(document,\"selectstart\",this)},_onDrop:function(e){var t=this.el,n=this.options;ee=T(Y),ne=T(Y,n.draggable),X(\"drop\",this,{evt:e}),K=Y&&Y.parentNode,ee=T(Y),ne=T(Y,n.draggable),Re.eventCanceled||(me=!1,ye=!1,_e=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Fe(this.cloneId),Fe(this._dragStartId),this.nativeDraggable&&(f(document,\"drop\",this),f(t,\"dragstart\",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),d&&w(document.body,\"user-select\",\"\"),w(Y,\"transform\",\"\"),e&&(ue&&(e.cancelable&&e.preventDefault(),!n.dropBubble&&e.stopPropagation()),q&&q.parentNode&&q.parentNode.removeChild(q),(G===K||oe&&\"clone\"!==oe.lastPutMode)&&V&&V.parentNode&&V.parentNode.removeChild(V),Y&&(this.nativeDraggable&&f(Y,\"dragend\",this),Pe(Y),Y.style[\"will-change\"]=\"\",ue&&!me&&E(Y,oe?oe.options.ghostClass:this.options.ghostClass,!1),E(Y,this.options.chosenClass,!1),U({sortable:this,name:\"unchoose\",toEl:K,newIndex:null,newDraggableIndex:null,originalEvent:e}),G!==K?(ee>=0&&(U({rootEl:K,name:\"add\",toEl:K,fromEl:G,originalEvent:e}),U({sortable:this,name:\"remove\",toEl:K,originalEvent:e}),U({rootEl:K,name:\"sort\",toEl:K,fromEl:G,originalEvent:e}),U({sortable:this,name:\"sort\",toEl:K,originalEvent:e})),oe&&oe.save()):ee!==Q&&ee>=0&&(U({sortable:this,name:\"update\",toEl:K,originalEvent:e}),U({sortable:this,name:\"sort\",toEl:K,originalEvent:e})),Re.active&&(null!=ee&&-1!==ee||(ee=Q,ne=te),U({sortable:this,name:\"end\",toEl:K,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){X(\"nulling\",this),G=Y=K=q=W=V=Z=J=ie=ae=ue=ee=ne=Q=te=he=ge=oe=re=Re.dragged=Re.ghost=Re.clone=Re.active=null,Ae.forEach((function(e){e.checked=!0})),Ae.length=se=le=0},handleEvent:function(e){switch(e.type){case\"drop\":case\"dragend\":this._onDrop(e);break;case\"dragenter\":case\"dragover\":Y&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect=\"move\");e.cancelable&&e.preventDefault()}(e));break;case\"selectstart\":e.preventDefault()}},toArray:function(){for(var e,t=[],n=this.el.children,r=0,o=n.length,i=this.options;r/g,\">\").replace(/\"/g,\""\").replace(/'/g,\"'\")}function st(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t];return t.forEach((function(e){for(const t in e)n[t]=e[t]})),n}const lt=e=>!!e.scope||e.sublanguage&&e.language;class ct{constructor(e,t){this.buffer=\"\",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=at(e)}openNode(e){if(!lt(e))return;let t=\"\";t=e.sublanguage?`language-${e.language}`:((e,{prefix:t})=>{if(e.includes(\".\")){const n=e.split(\".\");return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${\"_\".repeat(t+1)}`))].join(\" \")}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)}closeNode(e){lt(e)&&(this.buffer+=\"\")}value(){return this.buffer}span(e){this.buffer+=``}}const dt=(e={})=>{const t={children:[]};return Object.assign(t,e),t};class ut{constructor(){this.rootNode=dt(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const t=dt({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return\"string\"==typeof t?e.addText(t):t.children&&(e.openNode(t),t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){\"string\"!=typeof e&&e.children&&(e.children.every((e=>\"string\"==typeof e))?e.children=[e.children.join(\"\")]:e.children.forEach((e=>{ut._collapse(e)})))}}class ht extends ut{constructor(e){super(),this.options=e}addKeyword(e,t){\"\"!==e&&(this.openNode(t),this.addText(e),this.closeNode())}addText(e){\"\"!==e&&this.add(e)}addSublanguage(e,t){const n=e.root;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){return new ct(this,this.options).value()}finalize(){return!0}}function gt(e){return e?\"string\"==typeof e?e:e.source:null}function pt(e){return bt(\"(?=\",e,\")\")}function ft(e){return bt(\"(?:\",e,\")*\")}function mt(e){return bt(\"(?:\",e,\")?\")}function bt(...e){return e.map((e=>gt(e))).join(\"\")}function vt(...e){const t=function(e){const t=e[e.length-1];return\"object\"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}(e);return\"(\"+(t.capture?\"\":\"?:\")+e.map((e=>gt(e))).join(\"|\")+\")\"}function _t(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}const yt=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;function Et(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n;let r=gt(e),o=\"\";for(;r.length>0;){const e=yt.exec(r);if(!e){o+=r;break}o+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),\"\\\\\"===e[0][0]&&e[1]?o+=\"\\\\\"+String(Number(e[1])+t):(o+=e[0],\"(\"===e[0]&&n++)}return o})).map((e=>`(${e})`)).join(t)}const wt=\"[a-zA-Z]\\\\w*\",At=\"[a-zA-Z_]\\\\w*\",xt=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",St=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",kt=\"\\\\b(0b[01]+)\",Nt={begin:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},Ct={scope:\"string\",begin:\"'\",end:\"'\",illegal:\"\\\\n\",contains:[Nt]},Ot={scope:\"string\",begin:'\"',end:'\"',illegal:\"\\\\n\",contains:[Nt]},Tt=function(e,t,n={}){const r=st({scope:\"comment\",begin:e,end:t,contains:[]},n);r.contains.push({scope:\"doctag\",begin:\"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)\",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const o=vt(\"I\",\"a\",\"is\",\"so\",\"us\",\"to\",\"at\",\"if\",\"in\",\"it\",\"on\",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:bt(/[ ]+/,\"(\",o,/[.]?[:]?([.][ ]|[ ])/,\"){3}\")}),r},Dt=Tt(\"//\",\"$\"),Mt=Tt(\"/\\\\*\",\"\\\\*/\"),It=Tt(\"#\",\"$\"),Bt={scope:\"number\",begin:xt,relevance:0},Rt={scope:\"number\",begin:St,relevance:0},Lt={scope:\"number\",begin:kt,relevance:0},Pt={begin:/(?=\\/[^/\\n]*\\/)/,contains:[{scope:\"regexp\",begin:/\\//,end:/\\/[gimuy]*/,illegal:/\\n/,contains:[Nt,{begin:/\\[/,end:/\\]/,relevance:0,contains:[Nt]}]}]},jt={scope:\"title\",begin:wt,relevance:0},$t={scope:\"title\",begin:At,relevance:0},zt={begin:\"\\\\.\\\\s*\"+At,relevance:0};var Ft=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\\b\\B/,IDENT_RE:wt,UNDERSCORE_IDENT_RE:At,NUMBER_RE:xt,C_NUMBER_RE:St,BINARY_NUMBER_RE:kt,RE_STARTERS_RE:\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",SHEBANG:(e={})=>{const t=/^#![ ]*\\//;return e.binary&&(e.begin=bt(t,/.*\\b/,e.binary,/\\b.*/)),st({scope:\"meta\",begin:t,end:/$/,relevance:0,\"on:begin\":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:Nt,APOS_STRING_MODE:Ct,QUOTE_STRING_MODE:Ot,PHRASAL_WORDS_MODE:{begin:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},COMMENT:Tt,C_LINE_COMMENT_MODE:Dt,C_BLOCK_COMMENT_MODE:Mt,HASH_COMMENT_MODE:It,NUMBER_MODE:Bt,C_NUMBER_MODE:Rt,BINARY_NUMBER_MODE:Lt,REGEXP_MODE:Pt,TITLE_MODE:jt,UNDERSCORE_TITLE_MODE:$t,METHOD_GUARD:zt,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{\"on:begin\":(e,t)=>{t.data._beginMatch=e[1]},\"on:end\":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})}});function Ht(e,t){\".\"===e.input[e.index-1]&&t.ignoreMatch()}function Xt(e,t){void 0!==e.className&&(e.scope=e.className,delete e.className)}function Ut(e,t){t&&e.beginKeywords&&(e.begin=\"\\\\b(\"+e.beginKeywords.split(\" \").join(\"|\")+\")(?!\\\\.)(?=\\\\b|\\\\s)\",e.__beforeBegin=Ht,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,void 0===e.relevance&&(e.relevance=0))}function Yt(e,t){Array.isArray(e.illegal)&&(e.illegal=vt(...e.illegal))}function Kt(e,t){if(e.match){if(e.begin||e.end)throw new Error(\"begin & end are not supported with match\");e.begin=e.match,delete e.match}}function qt(e,t){void 0===e.relevance&&(e.relevance=1)}const Gt=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw new Error(\"beforeMatch cannot be used with starts\");const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t]})),e.keywords=n.keywords,e.begin=bt(n.beforeMatch,pt(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},Wt=[\"of\",\"and\",\"for\",\"in\",\"not\",\"or\",\"if\",\"then\",\"parent\",\"list\",\"value\"];function Zt(e,t,n=\"keyword\"){const r=Object.create(null);return\"string\"==typeof e?o(n,e.split(\" \")):Array.isArray(e)?o(n,e):Object.keys(e).forEach((function(n){Object.assign(r,Zt(e[n],t,n))})),r;function o(e,n){t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((function(t){const n=t.split(\"|\");r[n[0]]=[e,Vt(n[0],n[1])]}))}}function Vt(e,t){return t?Number(t):function(e){return Wt.includes(e.toLowerCase())}(e)?0:1}const Jt={},Qt=e=>{console.error(e)},en=(e,...t)=>{console.log(`WARN: ${e}`,...t)},tn=(e,t)=>{Jt[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),Jt[`${e}/${t}`]=!0)},nn=new Error;function rn(e,t,{key:n}){let r=0;const o=e[n],i={},a={};for(let e=1;e<=t.length;e++)a[e+r]=o[e],i[e+r]=!0,r+=_t(t[e-1]);e[n]=a,e[n]._emit=i,e[n]._multi=!0}function on(e){!function(e){e.scope&&\"object\"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,delete e.scope)}(e),\"string\"==typeof e.beginScope&&(e.beginScope={_wrap:e.beginScope}),\"string\"==typeof e.endScope&&(e.endScope={_wrap:e.endScope}),function(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw Qt(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\"),nn;if(\"object\"!=typeof e.beginScope||null===e.beginScope)throw Qt(\"beginScope must be object\"),nn;rn(e,e.begin,{key:\"beginScope\"}),e.begin=Et(e.begin,{joinWith:\"\"})}}(e),function(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw Qt(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\"),nn;if(\"object\"!=typeof e.endScope||null===e.endScope)throw Qt(\"endScope must be object\"),nn;rn(e,e.end,{key:\"endScope\"}),e.end=Et(e.end,{joinWith:\"\"})}}(e)}function an(e){function t(t,n){return new RegExp(gt(t),\"m\"+(e.case_insensitive?\"i\":\"\")+(e.unicodeRegex?\"u\":\"\")+(n?\"g\":\"\"))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=_t(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map((e=>e[1]));this.matcherRe=t(Et(e,{joinWith:\"|\"}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const t=this.matcherRe.exec(e);if(!t)return null;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),\"begin\"===t.type&&this.count++}exec(e){const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}if(e.compilerExtensions||(e.compilerExtensions=[]),e.contains&&e.contains.includes(\"self\"))throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");return e.classNameAliases=st(e.classNameAliases||{}),function n(o,i){const a=o;if(o.isCompiled)return a;[Xt,Kt,on,Gt].forEach((e=>e(o,i))),e.compilerExtensions.forEach((e=>e(o,i))),o.__beforeBegin=null,[Ut,Yt,qt].forEach((e=>e(o,i))),o.isCompiled=!0;let s=null;return\"object\"==typeof o.keywords&&o.keywords.$pattern&&(o.keywords=Object.assign({},o.keywords),s=o.keywords.$pattern,delete o.keywords.$pattern),s=s||/\\w+/,o.keywords&&(o.keywords=Zt(o.keywords,e.case_insensitive)),a.keywordPatternRe=t(s,!0),i&&(o.begin||(o.begin=/\\B|\\b/),a.beginRe=t(a.begin),o.end||o.endsWithParent||(o.end=/\\B|\\b/),o.end&&(a.endRe=t(a.end)),a.terminatorEnd=gt(a.end)||\"\",o.endsWithParent&&i.terminatorEnd&&(a.terminatorEnd+=(o.end?\"|\":\"\")+i.terminatorEnd)),o.illegal&&(a.illegalRe=t(o.illegal)),o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((function(e){return function(e){e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((function(t){return st(e,{variants:null},t)})));if(e.cachedVariants)return e.cachedVariants;if(sn(e))return st(e,{starts:e.starts?st(e.starts):null});if(Object.isFrozen(e))return st(e);return e}(\"self\"===e?o:e)}))),o.contains.forEach((function(e){n(e,a)})),o.starts&&n(o.starts,i),a.matcher=function(e){const t=new r;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:\"begin\"}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:\"end\"}),e.illegal&&t.addRule(e.illegal,{type:\"illegal\"}),t}(a),a}(e)}function sn(e){return!!e&&(e.endsWithParent||sn(e.starts))}class ln extends Error{constructor(e,t){super(e),this.name=\"HTMLInjectionError\",this.html=t}}const cn=at,dn=st,un=Symbol(\"nomatch\");var hn=function(e){const t=Object.create(null),n=Object.create(null),r=[];let o=!0;const i=\"Could not find the language '{}', did you forget to load/include a language module?\",a={disableAutodetect:!0,name:\"Plain text\",contains:[]};let s={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\\blang(?:uage)?-([\\w-]+)\\b/i,classPrefix:\"hljs-\",cssSelector:\"pre code\",languages:null,__emitter:ht};function l(e){return s.noHighlightRe.test(e)}function c(e,t,n){let r=\"\",o=\"\";\"object\"==typeof t?(r=e,n=t.ignoreIllegals,o=t.language):(tn(\"10.7.0\",\"highlight(lang, code, ...args) has been deprecated.\"),tn(\"10.7.0\",\"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\"),o=e,r=t),void 0===n&&(n=!0);const i={code:r,language:o};v(\"before:highlight\",i);const a=i.result?i.result:d(i.language,i.code,n);return a.code=i.code,v(\"after:highlight\",a),a}function d(e,n,r,a){const l=Object.create(null);function c(){if(!x.keywords)return void k.addText(N);let e=0;x.keywordPatternRe.lastIndex=0;let t=x.keywordPatternRe.exec(N),n=\"\";for(;t;){n+=N.substring(e,t.index);const o=E.case_insensitive?t[0].toLowerCase():t[0],i=(r=o,x.keywords[r]);if(i){const[e,r]=i;if(k.addText(n),n=\"\",l[o]=(l[o]||0)+1,l[o]<=7&&(C+=r),e.startsWith(\"_\"))n+=t[0];else{const n=E.classNameAliases[e]||e;k.addKeyword(t[0],n)}}else n+=t[0];e=x.keywordPatternRe.lastIndex,t=x.keywordPatternRe.exec(N)}var r;n+=N.substring(e),k.addText(n)}function h(){null!=x.subLanguage?function(){if(\"\"===N)return;let e=null;if(\"string\"==typeof x.subLanguage){if(!t[x.subLanguage])return void k.addText(N);e=d(x.subLanguage,N,!0,S[x.subLanguage]),S[x.subLanguage]=e._top}else e=u(N,x.subLanguage.length?x.subLanguage:null);x.relevance>0&&(C+=e.relevance),k.addSublanguage(e._emitter,e.language)}():c(),N=\"\"}function g(e,t){let n=1;const r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}const r=E.classNameAliases[e[n]]||e[n],o=t[n];r?k.addKeyword(o,r):(N=o,c(),N=\"\"),n++}}function p(e,t){return e.scope&&\"string\"==typeof e.scope&&k.openNode(E.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(k.addKeyword(N,E.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),N=\"\"):e.beginScope._multi&&(g(e.beginScope,t),N=\"\")),x=Object.create(e,{parent:{value:x}}),x}function m(e,t,n){let r=function(e,t){const n=e&&e.exec(t);return n&&0===n.index}(e.endRe,n);if(r){if(e[\"on:end\"]){const n=new it(e);e[\"on:end\"](t,n),n.isMatchIgnored&&(r=!1)}if(r){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return m(e.parent,t,n)}function b(e){return 0===x.matcher.regexIndex?(N+=e[0],1):(D=!0,0)}function v(e){const t=e[0],r=n.substring(e.index),o=m(x,e,r);if(!o)return un;const i=x;x.endScope&&x.endScope._wrap?(h(),k.addKeyword(t,x.endScope._wrap)):x.endScope&&x.endScope._multi?(h(),g(x.endScope,e)):i.skip?N+=t:(i.returnEnd||i.excludeEnd||(N+=t),h(),i.excludeEnd&&(N=t));do{x.scope&&k.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent}while(x!==o.parent);return o.starts&&p(o.starts,e),i.returnEnd?0:t.length}let _={};function y(t,i){const a=i&&i[0];if(N+=t,null==a)return h(),0;if(\"begin\"===_.type&&\"end\"===i.type&&_.index===i.index&&\"\"===a){if(N+=n.slice(i.index,i.index+1),!o){const t=new Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=_.rule,t}return 1}if(_=i,\"begin\"===i.type)return function(e){const t=e[0],n=e.rule,r=new it(n),o=[n.__beforeBegin,n[\"on:begin\"]];for(const n of o)if(n&&(n(e,r),r.isMatchIgnored))return b(t);return n.skip?N+=t:(n.excludeBegin&&(N+=t),h(),n.returnBegin||n.excludeBegin||(N=t)),p(n,e),n.returnBegin?0:t.length}(i);if(\"illegal\"===i.type&&!r){const e=new Error('Illegal lexeme \"'+a+'\" for mode \"'+(x.scope||\"\")+'\"');throw e.mode=x,e}if(\"end\"===i.type){const e=v(i);if(e!==un)return e}if(\"illegal\"===i.type&&\"\"===a)return 1;if(T>1e5&&T>3*i.index){throw new Error(\"potential infinite loop, way more iterations than matches\")}return N+=a,a.length}const E=f(e);if(!E)throw Qt(i.replace(\"{}\",e)),new Error('Unknown language: \"'+e+'\"');const w=an(E);let A=\"\",x=a||w;const S={},k=new s.__emitter(s);!function(){const e=[];for(let t=x;t!==E;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach((e=>k.openNode(e)))}();let N=\"\",C=0,O=0,T=0,D=!1;try{for(x.matcher.considerAll();;){T++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=O;const e=x.matcher.exec(n);if(!e)break;const t=y(n.substring(O,e.index),e);O=e.index+t}return y(n.substring(O)),k.closeAllNodes(),k.finalize(),A=k.toHTML(),{language:e,value:A,relevance:C,illegal:!1,_emitter:k,_top:x}}catch(t){if(t.message&&t.message.includes(\"Illegal\"))return{language:e,value:cn(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:O,context:n.slice(O-100,O+100),mode:t.mode,resultSoFar:A},_emitter:k};if(o)return{language:e,value:cn(n),illegal:!1,relevance:0,errorRaised:t,_emitter:k,_top:x};throw t}}function u(e,n){n=n||s.languages||Object.keys(t);const r=function(e){const t={value:cn(e),illegal:!1,relevance:0,_top:a,_emitter:new s.__emitter(s)};return t._emitter.addText(e),t}(e),o=n.filter(f).filter(b).map((t=>d(t,e,!1)));o.unshift(r);const i=o.sort(((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(f(e.language).supersetOf===t.language)return 1;if(f(t.language).supersetOf===e.language)return-1}return 0})),[l,c]=i,u=l;return u.secondBest=c,u}function h(e){let t=null;const r=function(e){let t=e.className+\" \";t+=e.parentNode?e.parentNode.className:\"\";const n=s.languageDetectRe.exec(t);if(n){const t=f(n[1]);return t||(en(i.replace(\"{}\",n[1])),en(\"Falling back to no-highlight mode for this block.\",e)),t?n[1]:\"no-highlight\"}return t.split(/\\s+/).find((e=>l(e)||f(e)))}(e);if(l(r))return;if(v(\"before:highlightElement\",{el:e,language:r}),e.children.length>0&&(s.ignoreUnescapedHTML||(console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\"),console.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\"),console.warn(\"The element with unescaped HTML:\"),console.warn(e)),s.throwUnescapedHTML)){throw new ln(\"One of your code blocks includes unescaped HTML.\",e.innerHTML)}t=e;const o=t.textContent,a=r?c(o,{language:r,ignoreIllegals:!0}):u(o);e.innerHTML=a.value,function(e,t,r){const o=t&&n[t]||r;e.classList.add(\"hljs\"),e.classList.add(`language-${o}`)}(e,r,a.language),e.result={language:a.language,re:a.relevance,relevance:a.relevance},a.secondBest&&(e.secondBest={language:a.secondBest.language,relevance:a.secondBest.relevance}),v(\"after:highlightElement\",{el:e,result:a,text:o})}let g=!1;function p(){if(\"loading\"===document.readyState)return void(g=!0);document.querySelectorAll(s.cssSelector).forEach(h)}function f(e){return e=(e||\"\").toLowerCase(),t[e]||t[n[e]]}function m(e,{languageName:t}){\"string\"==typeof e&&(e=[e]),e.forEach((e=>{n[e.toLowerCase()]=t}))}function b(e){const t=f(e);return t&&!t.disableAutodetect}function v(e,t){const n=e;r.forEach((function(e){e[n]&&e[n](t)}))}\"undefined\"!=typeof window&&window.addEventListener&&window.addEventListener(\"DOMContentLoaded\",(function(){g&&p()}),!1),Object.assign(e,{highlight:c,highlightAuto:u,highlightAll:p,highlightElement:h,highlightBlock:function(e){return tn(\"10.7.0\",\"highlightBlock will be removed entirely in v12.0\"),tn(\"10.7.0\",\"Please use highlightElement now.\"),h(e)},configure:function(e){s=dn(s,e)},initHighlighting:()=>{p(),tn(\"10.6.0\",\"initHighlighting() deprecated. Use highlightAll() now.\")},initHighlightingOnLoad:function(){p(),tn(\"10.6.0\",\"initHighlightingOnLoad() deprecated. Use highlightAll() now.\")},registerLanguage:function(n,r){let i=null;try{i=r(e)}catch(e){if(Qt(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!o)throw e;Qt(e),i=a}i.name||(i.name=n),t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&m(i.aliases,{languageName:n})},unregisterLanguage:function(e){delete t[e];for(const t of Object.keys(n))n[t]===e&&delete n[t]},listLanguages:function(){return Object.keys(t)},getLanguage:f,registerAliases:m,autoDetection:b,inherit:dn,addPlugin:function(e){!function(e){e[\"before:highlightBlock\"]&&!e[\"before:highlightElement\"]&&(e[\"before:highlightElement\"]=t=>{e[\"before:highlightBlock\"](Object.assign({block:t.el},t))}),e[\"after:highlightBlock\"]&&!e[\"after:highlightElement\"]&&(e[\"after:highlightElement\"]=t=>{e[\"after:highlightBlock\"](Object.assign({block:t.el},t))})}(e),r.push(e)}}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=\"11.7.0\",e.regex={concat:bt,lookahead:pt,either:vt,optional:mt,anyNumberOfTimes:ft};for(const e in Ft)\"object\"==typeof Ft[e]&&rt.exports(Ft[e]);return Object.assign(e,Ft),e}({}),gn=hn;hn.HighlightJS=hn,hn.default=hn;var pn=gn;class fn{el;_dropArea;_dragArea;_dropSortable;_dragSortable;parentElement;_prevPosition;reusable;randomize;storedSourceBlocks;storedSourceBlockExplanations;blockOrder;hljsLanguage;_liveRegion;initialized;constructor(e,t,n){this.el=document.createElement(\"div\"),this.el.classList.add(\"hparsons-input\"),this.parentElement=e,this.el.id=\"hparsonstool-\"+this.parentElement.toolNumber+\"-parsons-input\";const r=document.createElement(\"div\");r.innerText=\"Drag or click the blocks below to form your code:\",r.classList.add(\"hparsons-tip\"),this.el.append(r),this._dragArea=document.createElement(\"div\"),this.el.appendChild(this._dragArea),this._dragArea.classList.add(\"drag-area\"),this._dragArea.setAttribute(\"role\",\"listbox\"),this._dragArea.setAttribute(\"aria-label\",\"Available blocks\");const o=document.createElement(\"div\");o.innerText=\"Your code (click on a block to remove it):\",o.classList.add(\"hparsons-tip\"),this.el.append(o),this._dropArea=document.createElement(\"div\"),this.el.appendChild(this._dropArea),this._dropArea.classList.add(\"drop-area\"),this._dropArea.setAttribute(\"role\",\"listbox\"),this._dropArea.setAttribute(\"aria-label\",\"Answer area\"),this._prevPosition=-1,this._liveRegion=document.createElement(\"div\"),this._liveRegion.setAttribute(\"aria-live\",\"polite\"),this._liveRegion.setAttribute(\"aria-atomic\",\"true\"),this._liveRegion.classList.add(\"sr-only\"),this.el.appendChild(this._liveRegion),this.storedSourceBlocks=[],this.blockOrder=[],this.storedSourceBlockExplanations=null,this.reusable=t,this.randomize=n,this._dragSortable=null,this._dropSortable=null,this._initSortable(),this._setupKeyboardNav(),this.initialized=!1}getText=e=>{let t=\"\";if(this._dropArea.hasChildNodes()){let n=this._dropArea.firstChild;for(t+=this._getTextFromBlock(n);n.nextSibling;)n=n.nextSibling,t+=e?\" \":\"\",t+=this._getTextFromBlock(n);return t}return t};getBlockIndices=()=>{const e=this._dropArea.querySelectorAll(\".parsons-block\");return Array.from(e).map((e=>parseInt(e.dataset.index||\"-1\")))};_getTextFromBlock=e=>{if(\"raw\"==this.parentElement.language)return e.innerHTML;if(!e.lastChild||e.lastChild.nodeType!=Node.ELEMENT_NODE)return e.textContent||\"\";const t=e.lastChild.classList.contains(\"parsons-tooltip\")&&e.lastChild.textContent?.length||0;return t>0?(e.textContent||\"\").slice(0,-t):e.textContent||\"\"};shuffleArray(e){for(let t=e.length-1;t>0;t--){let n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}}setSourceBlocks=(e,t)=>{this.blockOrder=[];for(let t=0;t{for(;this._dragArea.firstChild;)this._dragArea.removeChild(this._dragArea.firstChild);for(;this._dropArea.firstChild;)this._dropArea.removeChild(this._dropArea.firstChild);for(let e=0;e{this._onBlockClicked(t,e)},this.storedSourceBlockExplanations&&this.storedSourceBlockExplanations[this.blockOrder[e]]){const n=document.createElement(\"div\");n.innerText=this.storedSourceBlockExplanations[this.blockOrder[e]],n.classList.add(\"parsons-tooltip\"),t.appendChild(n)}}this._updateBlockAria()};_onBlockClicked=(e,t)=>{const n=this._getTextFromBlock(e).trim();if(e.parentElement==this._dragArea){let r;if(this.reusable){const t=e.cloneNode(!0);t.onclick=e=>this._onBlockClicked(t,e),this._dropArea.appendChild(t),r=this._getBlockPosition(t)}else this._dropArea.appendChild(e),r=this._getBlockPosition(e);const o={type:\"input\",action:Je.InputAction.ADD,position:[-1,r],answer:this._getTextArray()};t.isTrusted&&this.parentElement.logEvent(o),this._updateBlockAria(),this._announce(`${n} moved to answer area`)}else{const t=this._getBlockPosition(e);this.reusable?this._dropArea.removeChild(e):this._dragArea.appendChild(e);const r={type:\"input\",action:Je.InputAction.REMOVE,position:[t,-1],answer:this._getTextArray()};this.parentElement.logEvent(r),this._updateBlockAria(),this._announce(`${n} moved to available blocks`)}};_initSortable=()=>{this.reusable?(this._dragSortable=new Re(this._dragArea,{group:{name:\"shared\",pull:\"clone\",put:!1},sort:!1,direction:\"horizontal\",animation:150,draggable:\".parsons-block\",onClone:e=>{const t=e.clone;t.onclick=e=>this._onBlockClicked(t,e)}}),this._dropSortable=new Re(this._dropArea,{group:\"shared\",direction:\"horizontal\",animation:150,draggable:\".parsons-block\",onAdd:e=>{const t={type:\"input\",action:Je.InputAction.ADD,position:[-1,this._getBlockPosition(e.item)],answer:this._getTextArray()};this.parentElement.logEvent(t),this._updateBlockAria()},onStart:e=>{this._prevPosition=this._getBlockPosition(e.item)},onEnd:e=>{let t,n=Je.InputAction.MOVE;const r=this._dropArea.getBoundingClientRect().top,o=this._dropArea.getBoundingClientRect().bottom;if(e.originalEvent.clientY>o||e.originalEvent.clientY{const t={type:\"input\",action:Je.InputAction.ADD,position:[-1,this._getBlockPosition(e.item)],answer:this._getTextArray()};this.parentElement.logEvent(t),this._updateBlockAria()},onStart:e=>{this._prevPosition=this._getBlockPosition(e.item)},onEnd:e=>{let t=this._getBlockPosition(e.item);const n={type:\"input\",action:-1==t?Je.InputAction.REMOVE:Je.InputAction.MOVE,position:[this._prevPosition,t],answer:this._getTextArray()};this.parentElement.logEvent(n),this._updateBlockAria()}}))};updateTestStatus=e=>{this._dropArea.classList.contains(e)||(this._dropArea.classList.contains(\"Pass\")?this._dropArea.classList.remove(\"Pass\"):this._dropArea.classList.contains(\"Fail\")?this._dropArea.classList.remove(\"Fail\"):this._dropArea.classList.contains(\"Error\")&&this._dropArea.classList.remove(\"Error\"),this._dropArea.classList.add(e))};_updateBlockAria=()=>{const e=(e,t)=>{e.querySelectorAll(\".parsons-block\").forEach(((e,n)=>{e.setAttribute(\"role\",\"option\"),e.setAttribute(\"aria-selected\",t?\"true\":\"false\"),e.setAttribute(\"tabindex\",0===n?\"0\":\"-1\")}))};e(this._dragArea,!1),e(this._dropArea,!0)};_focusBlock=(e,t)=>{t.querySelectorAll(\".parsons-block\").forEach((e=>{e.setAttribute(\"tabindex\",\"-1\")})),e.setAttribute(\"tabindex\",\"0\"),e.focus()};_announce=e=>{this._liveRegion.textContent=\"\",setTimeout((()=>{this._liveRegion.textContent=e}),10)};_setupKeyboardNav=()=>{this.el.addEventListener(\"keydown\",(e=>{const t=e.target.closest(\".parsons-block\");if(!t)return;const n=t.parentElement;if(n!==this._dragArea&&n!==this._dropArea)return;const r=Array.from(n.querySelectorAll(\".parsons-block\")),o=r.indexOf(t);switch(e.key){case\"ArrowRight\":case\"ArrowDown\":e.preventDefault(),o0&&this._focusBlock(r[o-1],n);break;case\" \":case\"Enter\":{e.preventDefault();const r=n===this._dragArea;this._onBlockClicked(t,e);let o=null;o=r?this.reusable?this._dropArea.lastElementChild:t:this.reusable?this._dropArea.firstElementChild||this._dragArea.firstElementChild:t,o&&this._focusBlock(o,o.parentElement);break}}}))};_getBlockPosition=e=>{let t=-1;const n=this._dropArea;if(n)for(t=0;t{let e=[];if(this._dropArea.hasChildNodes()){let t=this._dropArea.firstChild;for(e.push(this._getTextFromBlock(t));t.nextSibling;)t=t.nextSibling,e.push(this._getTextFromBlock(t))}return e};removeFormat=()=>{if(this._dropArea.hasChildNodes()){let e=this._dropArea.firstChild;for(e.style.removeProperty(\"background-color\");e.nextSibling;)e=e.nextSibling,e.style.removeProperty(\"background-color\")}};resetInput=()=>{if(this.reusable){for(;this._dropArea.firstChild;)this._dropArea.removeChild(this._dropArea.firstChild);this._updateBlockAria()}else this._resetInput()};restoreAnswer(e){this.resetInput();const t=/^\\s+$/;for(let n=0;n\",o=\"\",i={begin:/<[A-Za-z0-9\\\\._:-]+/,end:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,isTrulyOpeningTag:(e,t)=>{const n=e[0].length+e.index,r=e.input[n];if(\"<\"===r||\",\"===r)return void t.ignoreMatch();let o;\">\"===r&&(((e,{after:t})=>{const n=\"\",C={match:[/const|var|let/,/\\s+/,n,/\\s*/,/=\\s*/,/(async\\s*)?/,t.lookahead(N)],keywords:\"async\",className:{1:\"keyword\",3:\"title.function\"},contains:[_]};return{name:\"Javascript\",aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],keywords:a,exports:{PARAMS_CONTAINS:v,CLASS_REFERENCE:E},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:\"shebang\",binary:\"node\",relevance:5}),{label:\"use_strict\",className:\"meta\",relevance:10,begin:/^\\s*['\"]use (strict|asm)['\"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,h,g,p,f,{match:/\\$\\d+/},d,E,{className:\"attr\",begin:n+t.lookahead(\":\"),relevance:0},C,{begin:\"(\"+e.RE_STARTERS_RE+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",keywords:\"return throw case\",relevance:0,contains:[f,e.REGEXP_MODE,{className:\"function\",begin:N,returnBegin:!0,end:\"\\\\s*=>\",contains:[{className:\"params\",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:v}]}]},{begin:/,/,relevance:0},{match:/\\s+/,relevance:0},{variants:[{begin:r,end:o},{match:/<[A-Za-z0-9\\\\._:-]+\\s*\\/>/},{begin:i.begin,\"on:begin\":i.isTrulyOpeningTag,end:i.end}],subLanguage:\"xml\",contains:[{begin:i.begin,end:i.end,skip:!0,contains:[\"self\"]}]}]},w,{beginKeywords:\"while if switch catch for\"},{begin:\"\\\\b(?!function)\"+e.UNDERSCORE_IDENT_RE+\"\\\\([^()]*(\\\\([^()]*(\\\\([^()]*\\\\)[^()]*)*\\\\)[^()]*)*\\\\)\\\\s*\\\\{\",returnBegin:!0,label:\"func.def\",contains:[_,e.inherit(e.TITLE_MODE,{begin:n,className:\"title.function\"})]},{match:/\\.\\.\\./,relevance:0},S,{match:\"\\\\$\"+n,relevance:0},{match:[/\\bconstructor(?=\\s*\\()/],className:{1:\"title.function\"},contains:[_]},A,{relevance:0,match:/\\b[A-Z][A-Z_0-9]+\\b/,className:\"variable.constant\"},y,k,{match:/\\$[(.]/}]}};var Sn=function(e){const t=e.regex,n=/[\\p{XID_Start}_]\\p{XID_Continue}*/u,r=[\"and\",\"as\",\"assert\",\"async\",\"await\",\"break\",\"case\",\"class\",\"continue\",\"def\",\"del\",\"elif\",\"else\",\"except\",\"finally\",\"for\",\"from\",\"global\",\"if\",\"import\",\"in\",\"is\",\"lambda\",\"match\",\"nonlocal|10\",\"not\",\"or\",\"pass\",\"raise\",\"return\",\"try\",\"while\",\"with\",\"yield\"],o={$pattern:/[A-Za-z]\\w+|__\\w+__/,keyword:r,built_in:[\"__import__\",\"abs\",\"all\",\"any\",\"ascii\",\"bin\",\"bool\",\"breakpoint\",\"bytearray\",\"bytes\",\"callable\",\"chr\",\"classmethod\",\"compile\",\"complex\",\"delattr\",\"dict\",\"dir\",\"divmod\",\"enumerate\",\"eval\",\"exec\",\"filter\",\"float\",\"format\",\"frozenset\",\"getattr\",\"globals\",\"hasattr\",\"hash\",\"help\",\"hex\",\"id\",\"input\",\"int\",\"isinstance\",\"issubclass\",\"iter\",\"len\",\"list\",\"locals\",\"map\",\"max\",\"memoryview\",\"min\",\"next\",\"object\",\"oct\",\"open\",\"ord\",\"pow\",\"print\",\"property\",\"range\",\"repr\",\"reversed\",\"round\",\"set\",\"setattr\",\"slice\",\"sorted\",\"staticmethod\",\"str\",\"sum\",\"super\",\"tuple\",\"type\",\"vars\",\"zip\"],literal:[\"__debug__\",\"Ellipsis\",\"False\",\"None\",\"NotImplemented\",\"True\"],type:[\"Any\",\"Callable\",\"Coroutine\",\"Dict\",\"List\",\"Literal\",\"Generic\",\"Optional\",\"Sequence\",\"Set\",\"Tuple\",\"Type\",\"Union\"]},i={className:\"meta\",begin:/^(>>>|\\.\\.\\.) /},a={className:\"subst\",begin:/\\{/,end:/\\}/,keywords:o,illegal:/#/},s={begin:/\\{\\{/,relevance:0},l={className:\"string\",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?\"\"\"/,end:/\"\"\"/,contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,i,s,a]},{begin:/([fF][rR]|[rR][fF]|[fF])\"\"\"/,end:/\"\"\"/,contains:[e.BACKSLASH_ESCAPE,i,s,a]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])\"/,end:/\"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])\"/,end:/\"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,a]},{begin:/([fF][rR]|[rR][fF]|[fF])\"/,end:/\"/,contains:[e.BACKSLASH_ESCAPE,s,a]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},c=\"[0-9](_?[0-9])*\",d=`(\\\\b(${c}))?\\\\.(${c})|\\\\b(${c})\\\\.`,u=`\\\\b|${r.join(\"|\")}`,h={className:\"number\",relevance:0,variants:[{begin:`(\\\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${u})`},{begin:`(${d})[jJ]?`},{begin:`\\\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${u})`},{begin:`\\\\b0[bB](_?[01])+[lL]?(?=${u})`},{begin:`\\\\b0[oO](_?[0-7])+[lL]?(?=${u})`},{begin:`\\\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${u})`},{begin:`\\\\b(${c})[jJ](?=${u})`}]},g={className:\"comment\",begin:t.lookahead(/# type:/),end:/$/,keywords:o,contains:[{begin:/# type:/},{begin:/#/,end:/\\b\\B/,endsWithParent:!0}]},p={className:\"params\",variants:[{className:\"\",begin:/\\(\\s*\\)/,skip:!0},{begin:/\\(/,end:/\\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:[\"self\",i,h,l,e.HASH_COMMENT_MODE]}]};return a.contains=[l,h,i],{name:\"Python\",aliases:[\"py\",\"gyp\",\"ipython\"],unicodeRegex:!0,keywords:o,illegal:/(<\\/|->|\\?)|=>/,contains:[i,h,{begin:/\\bself\\b/},{beginKeywords:\"if\",relevance:0},l,g,e.HASH_COMMENT_MODE,{match:[/\\bdef/,/\\s+/,n],scope:{1:\"keyword\",3:\"title.function\"},contains:[p]},{variants:[{match:[/\\bclass/,/\\s+/,n,/\\s*/,/\\(\\s*/,n,/\\s*\\)/]},{match:[/\\bclass/,/\\s+/,n]}],scope:{1:\"keyword\",3:\"title.class\",6:\"title.class.inherited\"}},{className:\"meta\",begin:/^[\\t ]*@/,end:/(?=#)|$/,contains:[h,p,l]}]}},kn=\"[0-9](_*[0-9])*\",Nn=`\\\\.(${kn})`,Cn=\"[0-9a-fA-F](_*[0-9a-fA-F])*\",On={className:\"number\",variants:[{begin:`(\\\\b(${kn})((${Nn})|\\\\.)?|(${Nn}))[eE][+-]?(${kn})[fFdD]?\\\\b`},{begin:`\\\\b(${kn})((${Nn})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)`},{begin:`(${Nn})[fFdD]?\\\\b`},{begin:`\\\\b(${kn})[fFdD]\\\\b`},{begin:`\\\\b0[xX]((${Cn})\\\\.?|(${Cn})?\\\\.(${Cn}))[pP][+-]?(${kn})[fFdD]?\\\\b`},{begin:\"\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b\"},{begin:`\\\\b0[xX](${Cn})[lL]?\\\\b`},{begin:\"\\\\b0(_*[0-7])*[lL]?\\\\b\"},{begin:\"\\\\b0[bB][01](_*[01])*[lL]?\\\\b\"}],relevance:0};function Tn(e,t,n){return-1===n?\"\":e.replace(t,(r=>Tn(e,t,n-1)))}var Dn=function(e){const t=e.regex,n=\"[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*\",r=n+Tn(\"(?:<\"+n+\"~~~(?:\\\\s*,\\\\s*\"+n+\"~~~)*>)?\",/~~~/g,2),o={keyword:[\"synchronized\",\"abstract\",\"private\",\"var\",\"static\",\"if\",\"const \",\"for\",\"while\",\"strictfp\",\"finally\",\"protected\",\"import\",\"native\",\"final\",\"void\",\"enum\",\"else\",\"break\",\"transient\",\"catch\",\"instanceof\",\"volatile\",\"case\",\"assert\",\"package\",\"default\",\"public\",\"try\",\"switch\",\"continue\",\"throws\",\"protected\",\"public\",\"private\",\"module\",\"requires\",\"exports\",\"do\",\"sealed\",\"yield\",\"permits\"],literal:[\"false\",\"true\",\"null\"],type:[\"char\",\"boolean\",\"long\",\"float\",\"int\",\"byte\",\"short\",\"double\"],built_in:[\"super\",\"this\"]},i={className:\"meta\",begin:\"@\"+n,contains:[{begin:/\\(/,end:/\\)/,contains:[\"self\"]}]},a={className:\"params\",begin:/\\(/,end:/\\)/,keywords:o,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:\"Java\",aliases:[\"jsp\"],keywords:o,illegal:/<\\/|#/,contains:[e.COMMENT(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,contains:[{begin:/\\w+@/,relevance:0},{className:\"doctag\",begin:\"@[A-Za-z]+\"}]}),{begin:/import java\\.[a-z]+\\./,keywords:\"import\",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/\"\"\"/,end:/\"\"\"/,className:\"string\",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\\b(?:class|interface|enum|extends|implements|new)/,/\\s+/,n],className:{1:\"keyword\",3:\"title.class\"}},{match:/non-sealed/,scope:\"keyword\"},{begin:[t.concat(/(?!else)/,n),/\\s+/,n,/\\s+/,/=(?!=)/],className:{1:\"type\",3:\"variable\",5:\"operator\"}},{begin:[/record/,/\\s+/,n],className:{1:\"keyword\",3:\"title.class\"},contains:[a,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:\"new throw return else\",relevance:0},{begin:[\"(?:\"+r+\"\\\\s+)\",e.UNDERSCORE_IDENT_RE,/\\s*(?=\\()/],className:{2:\"title.function\"},keywords:o,contains:[{className:\"params\",begin:/\\(/,end:/\\)/,keywords:o,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,On,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},On,i]}};var Mn=function(e){const t=e.regex,n=e.COMMENT(\"--\",\"$\"),r=[\"true\",\"false\",\"unknown\"],o=[\"bigint\",\"binary\",\"blob\",\"boolean\",\"char\",\"character\",\"clob\",\"date\",\"dec\",\"decfloat\",\"decimal\",\"float\",\"int\",\"integer\",\"interval\",\"nchar\",\"nclob\",\"national\",\"numeric\",\"real\",\"row\",\"smallint\",\"time\",\"timestamp\",\"varchar\",\"varying\",\"varbinary\"],i=[\"abs\",\"acos\",\"array_agg\",\"asin\",\"atan\",\"avg\",\"cast\",\"ceil\",\"ceiling\",\"coalesce\",\"corr\",\"cos\",\"cosh\",\"count\",\"covar_pop\",\"covar_samp\",\"cume_dist\",\"dense_rank\",\"deref\",\"element\",\"exp\",\"extract\",\"first_value\",\"floor\",\"json_array\",\"json_arrayagg\",\"json_exists\",\"json_object\",\"json_objectagg\",\"json_query\",\"json_table\",\"json_table_primitive\",\"json_value\",\"lag\",\"last_value\",\"lead\",\"listagg\",\"ln\",\"log\",\"log10\",\"lower\",\"max\",\"min\",\"mod\",\"nth_value\",\"ntile\",\"nullif\",\"percent_rank\",\"percentile_cont\",\"percentile_disc\",\"position\",\"position_regex\",\"power\",\"rank\",\"regr_avgx\",\"regr_avgy\",\"regr_count\",\"regr_intercept\",\"regr_r2\",\"regr_slope\",\"regr_sxx\",\"regr_sxy\",\"regr_syy\",\"row_number\",\"sin\",\"sinh\",\"sqrt\",\"stddev_pop\",\"stddev_samp\",\"substring\",\"substring_regex\",\"sum\",\"tan\",\"tanh\",\"translate\",\"translate_regex\",\"treat\",\"trim\",\"trim_array\",\"unnest\",\"upper\",\"value_of\",\"var_pop\",\"var_samp\",\"width_bucket\"],a=[\"create table\",\"insert into\",\"primary key\",\"foreign key\",\"not null\",\"alter table\",\"add constraint\",\"grouping sets\",\"on overflow\",\"character set\",\"respect nulls\",\"ignore nulls\",\"nulls first\",\"nulls last\",\"depth first\",\"breadth first\"],s=i,l=[\"abs\",\"acos\",\"all\",\"allocate\",\"alter\",\"and\",\"any\",\"are\",\"array\",\"array_agg\",\"array_max_cardinality\",\"as\",\"asensitive\",\"asin\",\"asymmetric\",\"at\",\"atan\",\"atomic\",\"authorization\",\"avg\",\"begin\",\"begin_frame\",\"begin_partition\",\"between\",\"bigint\",\"binary\",\"blob\",\"boolean\",\"both\",\"by\",\"call\",\"called\",\"cardinality\",\"cascaded\",\"case\",\"cast\",\"ceil\",\"ceiling\",\"char\",\"char_length\",\"character\",\"character_length\",\"check\",\"classifier\",\"clob\",\"close\",\"coalesce\",\"collate\",\"collect\",\"column\",\"commit\",\"condition\",\"connect\",\"constraint\",\"contains\",\"convert\",\"copy\",\"corr\",\"corresponding\",\"cos\",\"cosh\",\"count\",\"covar_pop\",\"covar_samp\",\"create\",\"cross\",\"cube\",\"cume_dist\",\"current\",\"current_catalog\",\"current_date\",\"current_default_transform_group\",\"current_path\",\"current_role\",\"current_row\",\"current_schema\",\"current_time\",\"current_timestamp\",\"current_path\",\"current_role\",\"current_transform_group_for_type\",\"current_user\",\"cursor\",\"cycle\",\"date\",\"day\",\"deallocate\",\"dec\",\"decimal\",\"decfloat\",\"declare\",\"default\",\"define\",\"delete\",\"dense_rank\",\"deref\",\"describe\",\"deterministic\",\"disconnect\",\"distinct\",\"double\",\"drop\",\"dynamic\",\"each\",\"element\",\"else\",\"empty\",\"end\",\"end_frame\",\"end_partition\",\"end-exec\",\"equals\",\"escape\",\"every\",\"except\",\"exec\",\"execute\",\"exists\",\"exp\",\"external\",\"extract\",\"false\",\"fetch\",\"filter\",\"first_value\",\"float\",\"floor\",\"for\",\"foreign\",\"frame_row\",\"free\",\"from\",\"full\",\"function\",\"fusion\",\"get\",\"global\",\"grant\",\"group\",\"grouping\",\"groups\",\"having\",\"hold\",\"hour\",\"identity\",\"in\",\"indicator\",\"initial\",\"inner\",\"inout\",\"insensitive\",\"insert\",\"int\",\"integer\",\"intersect\",\"intersection\",\"interval\",\"into\",\"is\",\"join\",\"json_array\",\"json_arrayagg\",\"json_exists\",\"json_object\",\"json_objectagg\",\"json_query\",\"json_table\",\"json_table_primitive\",\"json_value\",\"lag\",\"language\",\"large\",\"last_value\",\"lateral\",\"lead\",\"leading\",\"left\",\"like\",\"like_regex\",\"listagg\",\"ln\",\"local\",\"localtime\",\"localtimestamp\",\"log\",\"log10\",\"lower\",\"match\",\"match_number\",\"match_recognize\",\"matches\",\"max\",\"member\",\"merge\",\"method\",\"min\",\"minute\",\"mod\",\"modifies\",\"module\",\"month\",\"multiset\",\"national\",\"natural\",\"nchar\",\"nclob\",\"new\",\"no\",\"none\",\"normalize\",\"not\",\"nth_value\",\"ntile\",\"null\",\"nullif\",\"numeric\",\"octet_length\",\"occurrences_regex\",\"of\",\"offset\",\"old\",\"omit\",\"on\",\"one\",\"only\",\"open\",\"or\",\"order\",\"out\",\"outer\",\"over\",\"overlaps\",\"overlay\",\"parameter\",\"partition\",\"pattern\",\"per\",\"percent\",\"percent_rank\",\"percentile_cont\",\"percentile_disc\",\"period\",\"portion\",\"position\",\"position_regex\",\"power\",\"precedes\",\"precision\",\"prepare\",\"primary\",\"procedure\",\"ptf\",\"range\",\"rank\",\"reads\",\"real\",\"recursive\",\"ref\",\"references\",\"referencing\",\"regr_avgx\",\"regr_avgy\",\"regr_count\",\"regr_intercept\",\"regr_r2\",\"regr_slope\",\"regr_sxx\",\"regr_sxy\",\"regr_syy\",\"release\",\"result\",\"return\",\"returns\",\"revoke\",\"right\",\"rollback\",\"rollup\",\"row\",\"row_number\",\"rows\",\"running\",\"savepoint\",\"scope\",\"scroll\",\"search\",\"second\",\"seek\",\"select\",\"sensitive\",\"session_user\",\"set\",\"show\",\"similar\",\"sin\",\"sinh\",\"skip\",\"smallint\",\"some\",\"specific\",\"specifictype\",\"sql\",\"sqlexception\",\"sqlstate\",\"sqlwarning\",\"sqrt\",\"start\",\"static\",\"stddev_pop\",\"stddev_samp\",\"submultiset\",\"subset\",\"substring\",\"substring_regex\",\"succeeds\",\"sum\",\"symmetric\",\"system\",\"system_time\",\"system_user\",\"table\",\"tablesample\",\"tan\",\"tanh\",\"then\",\"time\",\"timestamp\",\"timezone_hour\",\"timezone_minute\",\"to\",\"trailing\",\"translate\",\"translate_regex\",\"translation\",\"treat\",\"trigger\",\"trim\",\"trim_array\",\"true\",\"truncate\",\"uescape\",\"union\",\"unique\",\"unknown\",\"unnest\",\"update\",\"upper\",\"user\",\"using\",\"value\",\"values\",\"value_of\",\"var_pop\",\"var_samp\",\"varbinary\",\"varchar\",\"varying\",\"versioning\",\"when\",\"whenever\",\"where\",\"width_bucket\",\"window\",\"with\",\"within\",\"without\",\"year\",\"add\",\"asc\",\"collation\",\"desc\",\"final\",\"first\",\"last\",\"view\"].filter((e=>!i.includes(e))),c={begin:t.concat(/\\b/,t.either(...s),/\\s*\\(/),relevance:0,keywords:{built_in:s}};return{name:\"SQL\",case_insensitive:!0,illegal:/[{}]|<\\//,keywords:{$pattern:/\\b[\\w\\.]+/,keyword:function(e,{exceptions:t,when:n}={}){const r=n;return t=t||[],e.map((e=>e.match(/\\|\\d+$/)||t.includes(e)?e:r(e)?`${e}|0`:e))}(l,{when:e=>e.length<3}),literal:r,type:o,built_in:[\"current_catalog\",\"current_date\",\"current_default_transform_group\",\"current_path\",\"current_role\",\"current_schema\",\"current_transform_group_for_type\",\"current_user\",\"session_user\",\"system_time\",\"system_user\",\"current_time\",\"localtime\",\"current_timestamp\",\"localtimestamp\"]},contains:[{begin:t.either(...a),relevance:0,keywords:{$pattern:/[\\w\\.]+/,keyword:l.concat(a),literal:r,type:o}},{className:\"type\",begin:t.either(\"double precision\",\"large object\",\"with timezone\",\"without timezone\")},c,{className:\"variable\",begin:/@[a-z0-9]+/},{className:\"string\",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/\"/,end:/\"/,contains:[{begin:/\"\"/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:\"operator\",begin:/[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}};var In=function(e){const t=e.regex,n=t.concat(/[\\p{L}_]/u,t.optional(/[\\p{L}0-9_.-]*:/u),/[\\p{L}0-9_.-]*/u),r={className:\"symbol\",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},o={begin:/\\s/,contains:[{className:\"keyword\",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\\n/}]},i=e.inherit(o,{begin:/\\(/,end:/\\)/}),a=e.inherit(e.APOS_STRING_MODE,{className:\"string\"}),s=e.inherit(e.QUOTE_STRING_MODE,{className:\"string\"}),l={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:\"HTML, XML\",aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:\"meta\",begin://,relevance:10,contains:[o,s,a,i,{begin:/\\[/,end:/\\]/,contains:[{className:\"meta\",begin://,contains:[o,i,s,a]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},r,{className:\"meta\",end:/\\?>/,variants:[{begin:/<\\?xml/,relevance:10,contains:[s]},{begin:/<\\?[a-z][a-z0-9]+/}]},{className:\"tag\",begin:/)/,end:/>/,keywords:{name:\"style\"},contains:[l],starts:{end:/<\\/style>/,returnEnd:!0,subLanguage:[\"css\",\"xml\"]}},{className:\"tag\",begin:/)/,end:/>/,keywords:{name:\"script\"},contains:[l],starts:{end:/<\\/script>/,returnEnd:!0,subLanguage:[\"javascript\",\"handlebars\",\"xml\"]}},{className:\"tag\",begin:/<>|<\\/>/},{className:\"tag\",begin:t.concat(//,/>/,/\\s/)))),end:/\\/?>/,contains:[{className:\"name\",begin:n,relevance:0,starts:l}]},{className:\"tag\",begin:t.concat(/<\\//,t.lookahead(t.concat(n,/>/))),contains:[{className:\"name\",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}};pn.registerLanguage(\"javascript\",xn),pn.registerLanguage(\"sql\",Mn),pn.registerLanguage(\"java\",Dn),pn.registerLanguage(\"xml\",In),pn.registerLanguage(\"python\",Sn);class Bn extends HTMLElement{root;_parsonsData;parsonsExplanation;hparsonsInput;inputType;static toolCount=0;toolNumber;temporaryInputEvent;language;hljsLanguage;codeBefore;codeAfter;constructor(){super(),Bn.toolCount+=1,this.toolNumber=Bn.toolCount,this.root=this;const e=!!this.getAttribute(\"reuse\"),t=!!this.getAttribute(\"randomize\");this.hparsonsInput=new fn(this,e,t),this._parsonsData=new Array,this.parsonsExplanation=null,this.inputType=\"parsons\",this.language=this.getAttribute(\"language\")||\"none\";let n=new Map(Object.entries({html:\"xml\",python:\"python\",javascript:\"javascript\",java:\"java\",sql:\"sql\"}));this.hljsLanguage=n.get(this.language),this.initInput(),this.temporaryInputEvent=null,this.codeBefore=null,this.codeAfter=null}set parsonsData(e){this._parsonsData=e,\"parsons\"==this.inputType&&this.hparsonsInput.setSourceBlocks(e,this.parsonsExplanation)}get parsonsData(){return this._parsonsData}logEvent=e=>{const t=new CustomEvent(\"micro-parsons\",{bubbles:!0,detail:{...e}});this.dispatchEvent(t)};initInput(){this.inputType=\"parsons\",this._parsonsData=new Array,this.parsonsExplanation=null;const e=null!=this.getAttribute(\"reuse\"),t=null!=this.getAttribute(\"randomize\");this.hparsonsInput=new fn(this,e,t),this.root.appendChild(this.hparsonsInput.el)}resetInput(){this.hparsonsInput.resetInput();this.logEvent({type:\"reset\"})}restoreAnswer(e){this.hparsonsInput.restoreAnswer(e)}restoreAnswerByIndices(e){this.hparsonsInput.restoreAnswerByIndices(e)}getCurrentInput(e){return this.hparsonsInput.getText(e)}getParsonsTextArray(){return this.hparsonsInput._getTextArray()}getBlockIndices(){return this.hparsonsInput.getBlockIndices()}setCodeContext(e){if(e.before){let t;this.codeBefore=e.before,this.querySelector(\".context.before\")?t=this.querySelector(\".context.before\"):(t=document.createElement(\"pre\"),t.className=\"context before\",this.querySelector(\".hparsons-input\").insertBefore(t,this.querySelector(\".drop-area\"))),t.innerHTML=this.codeBefore,this.hljsLanguage&&(t.className=\"context before\",t.classList.add(this.hljsLanguage),pn.highlightElement(t))}if(e.after){let t;this.codeAfter=e.after,this.querySelector(\".context.after\")?t=this.querySelector(\".context.after\"):(t=document.createElement(\"pre\"),t.className=\"context after\",this.querySelector(\".hparsons-input\").appendChild(t)),t.innerHTML=this.codeAfter,this.hljsLanguage&&(t.className=\"context after\",t.classList.add(this.hljsLanguage),pn.highlightElement(t))}}}const Rn=e=>{let t;try{t=document.querySelector(e.selector)}catch{throw\"micro-parsons: init: selector error\"}if(null==t||\"DIV\"!=t.tagName)throw\"micro-parsons: element not a div\";const n=-1==[\"javascript\",\"sql\",\"java\",\"html\",\"python\",\"raw\"].indexOf(e.language||\"\")?\"\":`language='${e.language}'`,r=e.id?`id='${e.id}'`:\"\",o=``;t.innerHTML=o;const i=t.firstChild;i.parsonsExplanation=e.parsonsTooltips,i.parsonsData=e.parsonsBlocks,e.context&&i.setCodeContext(e.context)};customElements.define(\"micro-parsons\",Bn);export{Rn as InitMicroParsons,Bn as MicroParsonsElement};\n//# sourceMappingURL=micro-parsons.js.map\n"],"names":["e","t","n","Object","keys","getOwnPropertySymbols","r","filter","getOwnPropertyDescriptor","enumerable","push","apply","arguments","length","o","forEach","getOwnPropertyDescriptors","defineProperties","defineProperty","Symbol","iterator","constructor","prototype","value","configurable","writable","assign","hasOwnProperty","call","this","a","window","navigator","userAgent","match","s","l","c","d","u","h","g","capture","passive","p","addEventListener","f","removeEventListener","m","substring","matches","msMatchesSelector","webkitMatchesSelector","b","host","document","nodeType","parentNode","v","_","y","E","classList","className","replace","w","style","defaultView","getComputedStyle","currentStyle","indexOf","A","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","x","getElementsByTagName","i","S","scrollingElement","documentElement","k","getBoundingClientRect","top","left","bottom","right","height","width","innerHeight","innerWidth","parseInt","N","M","C","children","display","Re","ghost","dragged","draggable","O","lastElementChild","previousElementSibling","T","nodeName","toUpperCase","clone","D","scrollLeft","scrollTop","clientWidth","scrollWidth","clientHeight","scrollHeight","overflowX","overflowY","body","I","Math","round","B","setTimeout","R","L","Polymer","jQuery","Zepto","dom","cloneNode","P","Date","getTime","j","captureAnimationState","options","animation","slice","el","target","rect","thisAnimationDuration","fromRect","addAnimationState","removeAnimationState","splice","Number","animateAll","clearTimeout","prevFromRect","prevToRect","toRect","sqrt","pow","animate","max","animationResetTimer","animationTime","animatingX","animatingY","forRepaintDummy","offsetWidth","easing","animated","$","z","initializeByDefault","F","mount","pluginName","concat","pluginEvent","eventCanceled","cancel","sortable","initializePlugins","defaults","modifyOption","getEventProperties","eventProperties","optionListeners","H","X","evt","propertyIsEnumerable","bind","dragEl","Y","parentEl","K","ghostEl","q","rootEl","G","nextEl","W","lastDownEl","Z","cloneEl","V","cloneHidden","J","dragStarted","ue","putSortable","oe","activeSortable","active","originalEvent","oldIndex","Q","oldDraggableIndex","te","newIndex","ee","newDraggableIndex","ne","hideGhostForTarget","De","unhideGhostForTarget","Me","cloneNowHidden","cloneNowShown","dispatchSortableEvent","U","name","targetEl","toEl","fromEl","extraEventProperties","charAt","substr","CustomEvent","createEvent","initEvent","bubbles","cancelable","to","from","item","pullMode","lastPutMode","dispatchEvent","re","ie","ae","se","le","ce","de","he","ge","pe","fe","me","be","ve","_e","ye","Ee","we","Ae","xe","Se","ke","Ne","createElement","Ce","cssText","pointerEvents","Oe","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","marginLeft","marginRight","flexDirection","gridTemplateColumns","split","float","clear","Te","group","join","checkPull","pull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","Ie","touches","clientX","clientY","some","emptyInsertThreshold","_onDragOver","Be","_isOutsideThisEl","toString","sort","disabled","store","handle","test","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","get","Le","onMove","draggedRect","related","relatedRect","willInsertAfter","Pe","je","$e","tagName","src","href","charCodeAt","ze","Fe","contains","_getDirection","type","pointerType","shadowRoot","path","composedPath","checked","button","isContentEditable","trim","_prepareDragStart","ownerDocument","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","_dragStarted","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","appendChild","dataTransfer","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","_ignoreWhileAnimating","nextElementSibling","isOwner","axis","revert","dragRect","targetRect","canSort","fromSortable","completed","changed","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","removeChild","save","handleEvent","dropEffect","toArray","getAttribute","set","closest","option","destroy","Array","querySelectorAll","removeAttribute","utils","on","off","css","find","is","extend","throttle","toggleClass","index","nextTick","cancelNextTick","detectDirection","getChild","create","version","He","Xe","Ue","Ye","Ke","qe","Ge","We","Ze","pid","Ve","Je","Qe","scroll","scrollSensitivity","scrollSpeed","scrollFn","vx","vy","layer","bubbleScroll","et","changedTouches","onSpill","tt","nt","startIndex","dragStart","drop","forceAutoScrollFallback","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","dragOverBubble","nulling","InputAction","ADD","MOVE","REMOVE","rt","exports","ot","Map","delete","Error","Set","add","freeze","getOwnPropertyNames","isFrozen","default","it","data","isMatchIgnored","ignoreMatch","at","st","lt","scope","sublanguage","language","ct","buffer","classPrefix","walk","addText","openNode","prefix","includes","shift","map","repeat","span","closeNode","dt","ut","rootNode","stack","root","pop","closeAllNodes","toJSON","JSON","stringify","_walk","_collapse","every","ht","super","addKeyword","addSublanguage","toHTML","finalize","gt","source","pt","bt","ft","mt","vt","_t","RegExp","exec","yt","Et","joinWith","String","wt","At","xt","St","kt","Nt","begin","relevance","Ct","end","illegal","Ot","Tt","excludeBegin","Dt","Mt","It","Bt","Rt","Lt","Pt","jt","$t","zt","Ft","__proto__","MATCH_NOTHING_RE","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","SHEBANG","binary","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","END_SAME_AS_BEGIN","_beginMatch","Ht","input","Xt","Ut","beginKeywords","__beforeBegin","keywords","Yt","isArray","Kt","qt","Gt","beforeMatch","starts","endsParent","Wt","Zt","toLowerCase","Vt","Jt","Qt","console","error","en","log","tn","nn","rn","key","_emit","_multi","beginScope","_wrap","endScope","skip","returnBegin","excludeEnd","returnEnd","an","case_insensitive","unicodeRegex","matchIndexes","regexes","matchAt","position","addRule","compile","matcherRe","lastIndex","findIndex","rules","multiRegexes","count","regexIndex","getMatcher","resumingScanAtSamePosition","considerAll","compilerExtensions","classNameAliases","isCompiled","$pattern","keywordPatternRe","beginRe","endsWithParent","endRe","terminatorEnd","illegalRe","variants","cachedVariants","sn","matcher","rule","ln","html","cn","dn","un","hn","disableAutodetect","ignoreUnescapedHTML","throwUnescapedHTML","noHighlightRe","languageDetectRe","cssSelector","languages","__emitter","ignoreIllegals","code","result","startsWith","subLanguage","_top","_emitter","parent","languageName","badRule","mode","unshift","message","_illegalBy","context","resultSoFar","errorRaised","supersetOf","secondBest","warn","innerHTML","text","readyState","highlight","highlightAuto","highlightAll","highlightElement","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","rawDefinition","aliases","unregisterLanguage","listLanguages","getLanguage","registerAliases","autoDetection","inherit","addPlugin","block","debugMode","safeMode","versionString","regex","lookahead","either","optional","anyNumberOfTimes","gn","HighlightJS","pn","fn","_dropArea","_dragArea","_dropSortable","_dragSortable","parentElement","_prevPosition","reusable","randomize","storedSourceBlocks","storedSourceBlockExplanations","blockOrder","hljsLanguage","_liveRegion","initialized","id","toolNumber","innerText","append","setAttribute","_initSortable","_setupKeyboardNav","getText","hasChildNodes","firstChild","_getTextFromBlock","getBlockIndices","dataset","lastChild","Node","ELEMENT_NODE","shuffleArray","random","setSourceBlocks","_resetInput","onclick","_onBlockClicked","_updateBlockAria","_getBlockPosition","action","answer","_getTextArray","isTrusted","logEvent","_announce","onClone","onAdd","onStart","onEnd","updateTestStatus","remove","_focusBlock","focus","firstElementChild","childNodes","removeFormat","removeProperty","resetInput","restoreAnswer","click","restoreAnswerByIndices","mn","bn","vn","_n","yn","En","wn","An","kn","Nn","Cn","On","Tn","isTrulyOpeningTag","after","keyword","literal","built_in","label","PARAMS_CONTAINS","CLASS_REFERENCE","exceptions","when","Bn","HTMLElement","_parsonsData","parsonsExplanation","hparsonsInput","inputType","static","temporaryInputEvent","codeBefore","codeAfter","toolCount","entries","python","javascript","java","sql","initInput","parsonsData","detail","getCurrentInput","getParsonsTextArray","setCodeContext","before","querySelector","Rn","selector","reuse","parsonsTooltips","parsonsBlocks","customElements","define"],"sourceRoot":""} \ No newline at end of file diff --git a/course/_static/207.3a19748be8bb18ba.js.map.gz b/course/_static/207.3a19748be8bb18ba.js.map.gz new file mode 100755 index 0000000000000000000000000000000000000000..d97196ff7ad63502cf65bdf0596b2520002d07a7 GIT binary patch literal 60588 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ⅆO)t4VVwLaG}`fKUx_N!RcOZc_l+?m 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.builtinFiles={files:{"src/builtin/this.py":'s = """Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny pnfrf nera\'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh\'er Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg\'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg\'f qb zber bs gubfr!"""\n\nd = {}\nfor c in (65, 97):\n for i in range(26):\n d[chr(i+c)] = chr((i+13) % 26 + c)\n\nprint("".join([d.get(c, c) for c in s]))\n',"src/lib/BaseHTTPServer.py":'import _sk_fail; _sk_fail._("BaseHTTPServer")\n',"src/lib/Bastion.py":'import _sk_fail; _sk_fail._("Bastion")\n',"src/lib/CGIHTTPServer.py":'import _sk_fail; _sk_fail._("CGIHTTPServer")\n',"src/lib/ConfigParser.py":'import _sk_fail; _sk_fail._("ConfigParser")\n',"src/lib/Cookie.py":'import _sk_fail; _sk_fail._("Cookie")\n',"src/lib/DocXMLRPCServer.py":'import _sk_fail; _sk_fail._("DocXMLRPCServer")\n',"src/lib/HTMLParser.py":'import _sk_fail; _sk_fail._("HTMLParser")\n',"src/lib/MimeWriter.py":'import _sk_fail; _sk_fail._("MimeWriter")\n',"src/lib/PIL.py":'import image as _image_module\n\n__appname__ = "PIL"\n__author__ = "Marco Sirabella"\n__copyright__ = ""\n__credits__ = ["Marco Sirabella"] # Authors and bug reporters\n__license__ = "GPL"\n__version__ = "1.0"\n__maintainers__ = "Marco Sirabella"\n__email__ = "marco@sirabella.org"\n__status__ = "Prototype" # "Prototype", "Development" or "Production"\n__module__ = "PIL"\n\n\nclass PixelAccess:\n def __init__(self, parent):\n self._parent = parent\n\n def __getitem__(self, key):\n p = self._parent._image.getPixel(*key)\n return p.getRed(), p.getGreen(), p.getBlue()\n\n def __setitem__(self, key, value):\n r, g, b = value\n x, y = key\n self._parent._image.updatePixel(_image_module.Pixel(r, g, b, x, y))\n\n\nclass Image:\n def __init__(self, image):\n self._image = image\n self.size = (self._image.getWidth(), self._image.getHeight())\n\n self.pixels = PixelAccess(self)\n\n def open(filename):\n cls = Image\n self = cls(image=_image_module.Image(filename))\n return self\n\n def load(self):\n return self.pixels\n\n def show(self):\n win = _image_module.ImageWin(*self.size)\n self._image.draw(win)\n',"src/lib/Queue.py":'import _sk_fail; _sk_fail._("Queue")\n',"src/lib/SimpleHTTPServer.py":'import _sk_fail; _sk_fail._("SimpleHTTPServer")\n',"src/lib/SimpleXMLRPCServer.py":'import _sk_fail; _sk_fail._("SimpleXMLRPCServer")\n',"src/lib/SocketServer.py":'import _sk_fail; _sk_fail._("SocketServer")\n',"src/lib/StringIO.py":'r"""File-like objects that read from or write to a string buffer.\n\nThis implements (nearly) all stdio methods.\n\nf = StringIO() # ready for writing\nf = StringIO(buf) # ready for reading\nf.close() # explicitly release resources held\nflag = f.isatty() # always false\npos = f.tell() # get current position\nf.seek(pos) # set current position\nf.seek(pos, mode) # mode 0: absolute; 1: relative; 2: relative to EOF\nbuf = f.read() # read until EOF\nbuf = f.read(n) # read up to n bytes\nbuf = f.readline() # read until end of line (\'\\n\') or EOF\nlist = f.readlines()# list of f.readline() results until EOF\nf.truncate([size]) # truncate file at to at most size (default: current pos)\nf.write(buf) # write at current position\nf.writelines(list) # for line in list: f.write(line)\nf.getvalue() # return whole file\'s contents as a string\n\nNotes:\n- Using a real file is often faster (but less convenient).\n- There\'s also a much faster implementation in C, called cStringIO, but\n it\'s not subclassable.\n- fileno() is left unimplemented so that code which uses it triggers\n an exception early.\n- Seeking far beyond EOF and then writing will insert real null\n bytes that occupy space in the buffer.\n- There\'s a simple test set (see end of this file).\n"""\n\n__all__ = ["StringIO"]\n\ndef _complain_ifclosed(closed):\n if closed:\n raise ValueError("I/O operation on closed file")\n\nclass StringIO:\n """class StringIO([buffer])\n\n When a StringIO object is created, it can be initialized to an existing\n string by passing the string to the constructor. If no string is given,\n the StringIO will start empty.\n\n The StringIO object can accept either Unicode or 8-bit strings, but\n mixing the two may take some care. If both are used, 8-bit strings that\n cannot be interpreted as 7-bit ASCII (that use the 8th bit) will cause\n a UnicodeError to be raised when getvalue() is called.\n """\n def __init__(self, buf = \'\'):\n # Force self.buf to be a string or unicode\n if not isinstance(buf, str):\n buf = str(buf)\n self.buf = buf\n self.len = len(buf)\n self.buflist = []\n self.pos = 0\n self.closed = False\n self.softspace = 0\n\n def __iter__(self):\n return self\n\n def next(self):\n """A file object is its own iterator, for example iter(f) returns f\n (unless f is closed). When a file is used as an iterator, typically\n in a for loop (for example, for line in f: print line), the next()\n method is called repeatedly. This method returns the next input line,\n or raises StopIteration when EOF is hit.\n """\n _complain_ifclosed(self.closed)\n r = self.readline()\n if not r:\n raise StopIteration\n return r\n\n def close(self):\n """Free the memory buffer.\n """\n if not self.closed:\n self.closed = True\n self.buf = None\n self.pos = None\n\n def isatty(self):\n """Returns False because StringIO objects are not connected to a\n tty-like device.\n """\n _complain_ifclosed(self.closed)\n return False\n\n def seek(self, pos, mode = 0):\n """Set the file\'s current position.\n\n The mode argument is optional and defaults to 0 (absolute file\n positioning); other values are 1 (seek relative to the current\n position) and 2 (seek relative to the file\'s end).\n\n There is no return value.\n """\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = []\n if mode == 1:\n pos += self.pos\n elif mode == 2:\n pos += self.len\n self.pos = max(0, pos)\n\n def tell(self):\n """Return the file\'s current position."""\n _complain_ifclosed(self.closed)\n return self.pos\n\n def read(self, n = -1):\n """Read at most size bytes from the file\n (less if the read hits EOF before obtaining size bytes).\n\n If the size argument is negative or omitted, read all data until EOF\n is reached. The bytes are returned as a string object. An empty\n string is returned when EOF is encountered immediately.\n """\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = []\n if n is None or n < 0:\n newpos = self.len\n else:\n newpos = min(self.pos+n, self.len)\n r = self.buf[self.pos:newpos]\n self.pos = newpos\n return r\n\n def readline(self, length=None):\n r"""Read one entire line from the file.\n\n A trailing newline character is kept in the string (but may be absent\n when a file ends with an incomplete line). If the size argument is\n present and non-negative, it is a maximum byte count (including the\n trailing newline) and an incomplete line may be returned.\n\n An empty string is returned only when EOF is encountered immediately.\n\n Note: Unlike stdio\'s fgets(), the returned string contains null\n characters (\'\\0\') if they occurred in the input.\n """\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = []\n i = self.buf.find(\'\\n\', self.pos)\n if i < 0:\n newpos = self.len\n else:\n newpos = i+1\n if length is not None and length >= 0:\n if self.pos + length < newpos:\n newpos = self.pos + length\n r = self.buf[self.pos:newpos]\n self.pos = newpos\n return r\n\n def readlines(self, sizehint = 0):\n """Read until EOF using readline() and return a list containing the\n lines thus read.\n\n If the optional sizehint argument is present, instead of reading up\n to EOF, whole lines totalling approximately sizehint bytes (or more\n to accommodate a final whole line).\n """\n total = 0\n lines = []\n line = self.readline()\n while line:\n lines.append(line)\n total += len(line)\n if 0 < sizehint <= total:\n break\n line = self.readline()\n return lines\n\n def truncate(self, size=None):\n """Truncate the file\'s size.\n\n If the optional size argument is present, the file is truncated to\n (at most) that size. The size defaults to the current position.\n The current file position is not changed unless the position\n is beyond the new file size.\n\n If the specified size exceeds the file\'s current size, the\n file remains unchanged.\n """\n _complain_ifclosed(self.closed)\n if size is None:\n size = self.pos\n elif size < 0:\n raise IOError(22, "Negative size not allowed")\n elif size < self.pos:\n self.pos = size\n self.buf = self.getvalue()[:size]\n self.len = size\n\n def write(self, s):\n """Write a string to the file.\n\n There is no return value.\n """\n _complain_ifclosed(self.closed)\n if not s: return\n # Force s to be a string or unicode\n if not isinstance(s, str):\n s = str(s)\n spos = self.pos\n slen = self.len\n if spos == slen:\n self.buflist.append(s)\n self.len = self.pos = spos + len(s)\n return\n if spos > slen:\n self.buflist.append(\'\\0\'*(spos - slen))\n slen = spos\n newpos = spos + len(s)\n if spos < slen:\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = [self.buf[:spos], s, self.buf[newpos:]]\n self.buf = \'\'\n if newpos > slen:\n slen = newpos\n else:\n self.buflist.append(s)\n slen = newpos\n self.len = slen\n self.pos = newpos\n\n def writelines(self, iterable):\n """Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings. There\n is no return value.\n\n (The name is intended to match readlines(); writelines() does not add\n line separators.)\n """\n write = self.write\n for line in iterable:\n write(line)\n\n def flush(self):\n """Flush the internal buffer\n """\n _complain_ifclosed(self.closed)\n\n def getvalue(self):\n """\n Retrieve the entire contents of the "file" at any time before\n the StringIO object\'s close() method is called.\n\n The StringIO object can accept either Unicode or 8-bit strings,\n but mixing the two may take some care. If both are used, 8-bit\n strings that cannot be interpreted as 7-bit ASCII (that use the\n 8th bit) will cause a UnicodeError to be raised when getvalue()\n is called.\n """\n _complain_ifclosed(self.closed)\n if self.buflist:\n self.buf += \'\'.join(self.buflist)\n self.buflist = []\n return self.buf\n\n # The following two methods implement the PEP343 context management protocol\n # for StringIO objects, allowing them to be used in with statements.\n # In standard Python this is done via inheriting from IOBase\n # Possible pure Python implementation: https://github.com/python/cpython/blob/main/Lib/_pyio.py\n def __enter__(self):\n _complain_ifclosed(self.closed)\n return self\n\n def __exit__(self, *args):\n self.close()\n',"src/lib/UserDict.py":'import _sk_fail; _sk_fail._("UserDict")\n',"src/lib/UserList.py":'import _sk_fail; _sk_fail._("UserList")\n',"src/lib/UserString.py":'import _sk_fail; _sk_fail._("UserString")\n',"src/lib/_LWPCookieJar.py":'import _sk_fail; _sk_fail._("_LWPCookieJar")\n',"src/lib/_MozillaCookieJar.py":'import _sk_fail; _sk_fail._("_MozillaCookieJar")\n',"src/lib/__future__.py":'import _sk_fail;_sk_fail._("__future__")\n',"src/lib/__phello__.foo.py":'import _sk_fail; _sk_fail._("__phello__.foo")\n',"src/lib/_abcoll.py":'import _sk_fail; _sk_fail._("_abcoll")\n',"src/lib/_sk_fail.py":'class NotImplementedImportError(ImportError, NotImplementedError): pass\n\ndef _(name):\n msg = "{} is not yet implemented in Skulpt".format(name)\n raise NotImplementedImportError(msg, name=name)\n',"src/lib/_threading_local.py":'import _sk_fail; _sk_fail._("_threading_local")\n',"src/lib/abc.py":'import _sk_fail; _sk_fail._("abc")\n',"src/lib/aifc.py":'import _sk_fail; _sk_fail._("aifc")\n',"src/lib/altair/__init__.py":'import random\n\ntry:\n from vega_caller import render_graph\nexcept:\n print("Mock render")\n\n def render_graph(js):\n print(js)\n\n\nclass Chart:\n # TODO allow data to be specified as a URL to a CSV or DB or json\n def __init__(self, data, title=None):\n self.title = title\n self.data_id = random.randrange(1000000, 5000000)\n self.dsname = "data-{}".format(self.data_id)\n if isinstance(data, dict):\n self.data = Data(**data)\n else:\n self.data = data\n\n self.json = {}\n self.json["$schema"] = "https://vega.github.io/schema/vega-lite/v2.5.json"\n self.json["data"] = {}\n if self.title:\n self.json["title"] = self.title\n\n self.json["data"] = {"values": self.data.vals}\n self.is_composite = False\n\n # mark can be a simple string or a dictionary\n # "mark": {"color": "green", "opacity": 0.2, "type": "rect"}\n\n def mark_json(self, mark_type, **kwargs):\n if kwargs:\n self.json["mark"] = {}\n self.json["mark"]["type"] = mark_type\n self.json["mark"].update(kwargs)\n else:\n self.json["mark"] = mark_type\n\n return self\n\n def mark_bar(self, **kwargs):\n return self.mark_json("bar", **kwargs)\n\n def mark_point(self, **kwargs):\n return self.mark_json("point", **kwargs)\n\n def mark_line(self, **kwargs):\n return self.mark_json("line", **kwargs)\n\n def mark_rect(self, **kwargs):\n return self.mark_json("rect", **kwargs)\n\n def mark_area(self, **kwargs):\n return self.mark_json("area", **kwargs)\n\n def mark_tick(self, **kwargs):\n return self.mark_json("tick", **kwargs)\n\n def encode(self, x="", y="", color="", size="", tooltip=""):\n self.encoding = {}\n if x:\n if isinstance(x, Axis):\n self.encoding["x"] = x.toJson()\n else:\n self.encoding["x"] = Axis(x).toJson()\n if y:\n if isinstance(y, Axis):\n self.encoding["y"] = y.toJson()\n else:\n self.encoding["y"] = Axis(y).toJson()\n\n # "color": {"type": "nominal", "field": "species"}\n if color:\n field, tp = _get_name_type(color)\n self.encoding["color"] = dict(type=tp, field=field)\n\n # "size": {"type": "quantitative", "field": "Acceleration"}\n if size:\n field, tp = _get_name_type(size)\n self.encoding["size"] = dict(type=tp, field=field)\n\n if tooltip:\n field, tp = _get_name_type(tooltip)\n self.encoding["tooltip"] = dict(type=tp, field=field)\n\n self.json["encoding"] = self.encoding\n return self\n\n def interactive(self):\n iconfig = {\n "selector002": {\n "type": "interval",\n "bind": "scales",\n "encodings": ["x", "y"],\n "on": "[mousedown, window:mouseup] > window:mousemove!",\n "translate": "[mousedown, window:mouseup] > window:mousemove!",\n "zoom": "wheel!",\n "mark": {"fill": "#333", "fillOpacity": 0.125, "stroke": "white"},\n "resolve": "global",\n }\n }\n self.json["selection"] = iconfig\n return self\n\n def display(self):\n render_graph(self.json)\n\n def __add__(self, other):\n return self.add_layer(other, "layer")\n\n def __and__(self, other):\n return self.add_layer(other, "vconcat")\n\n def __or__(self, other):\n return self.add_layer(other, "hconcat")\n\n def add_layer(self, other, lname):\n # multle layers are added by concatenating the new element to the\n # existing layer. If the layer does not exist then initialize\n # it from self.\n if lname not in self.json:\n self.json[lname] = []\n self.json["datasets"] = {}\n temp = {}\n temp["data"] = {"name": self.dsname}\n self.json["datasets"][self.dsname] = self.json["data"]["values"]\n del self.json["data"]\n temp["encoding"] = self.json["encoding"]\n del self.json["encoding"]\n temp["mark"] = self.json["mark"]\n del self.json["mark"]\n self.json[lname].append(temp)\n temp = {}\n self.json["datasets"][other.dsname] = other.json["data"]["values"]\n temp["data"] = {"name": other.dsname}\n temp["encoding"] = other.json["encoding"]\n temp["mark"] = other.json["mark"]\n self.json[lname].append(temp)\n return self\n\n\n# "datasets": {\n# "data-e56e43354d9b8f2ab0d1e90cf27cd47f": [\n# {"a": 4, "b": 1, "c": "r"},\n# {"a": 5, "b": 2, "c": "g"},\n# {"a": 6, "b": 3, "c": "b"}\n# ],\n# "data-a4c3047a15bf9380c2e615cf87648369": [\n# {"a": 1, "b": 4, "c": "r"},\n# {"a": 2, "b": 5, "c": "g"},\n# {"a": 3, "b": 6, "c": "b"}\n# ]\n# }\n\n# TODO: add a rect mark type for a heat map\n\n\ndef _get_name_type(name):\n typed = {"Q": "quantitative", "O": "ordinal", "N": "nominal", "T": "temporal"}\n nt = name.split(":")\n tstring = "quantitative"\n if len(nt) == 2:\n tstring = typed[nt[1]]\n return nt[0], tstring\n\n\nclass Axis:\n def __init__(self, name, bin=False):\n self.aggregate = None\n self.name, self.type = _get_name_type(name)\n if "()" in self.name: # aggregate function\n self.aggregate = self.name.replace("()", "")\n self.name = None\n self.bin = bin\n\n def toJson(self):\n json = {}\n if self.name:\n json["field"] = self.name\n if self.type:\n json["type"] = self.type\n if self.bin:\n json["bin"] = True\n if self.aggregate:\n json["aggregate"] = self.aggregate\n\n return json\n\n\nclass X(Axis):\n pass\n\n\nclass Y(Axis):\n pass\n\n\nclass Data:\n def __init__(self, **kwargs):\n """\n input can be the form of a series of keyword args where\n the keyword is the column name, or a single keyword data\n that is a list of json style records as rows.\n could also accept a csv file? or keywords columns and rows\n This accepts a lot more options that "real altair" to make it easier\n to work with non-DataFrame data sets. Internally:\n self.keys contains the list of column names\n self.vals is a list of dictionaries of the form [{col1:val1, col2:val2, ... coln:valn},\n {col1:val3, col2:val4, ... coln:valn},\n {col1:val5, col2:val6, ... coln:valn}]\n """\n # todo: accept a URL as the argument to read a CSV or JSON file\n if len(kwargs) == 1 and "data" in kwargs:\n self.data = kwargs["data"]\n self.keys = self.data[0].keys()\n self.vals = self.data\n elif len(kwargs) == 2 and ("columns" in kwargs) and ("rows" in kwargs):\n self.keys = kwargs["columns"]\n self.vals = []\n for r in kwargs["rows"]:\n self.vals.append(dict(zip(self.keys, r)))\n else:\n keys = kwargs.keys()\n vals = []\n primary_key = list(keys)[0]\n for ix in range(len(kwargs[primary_key])):\n d = {}\n for key in keys:\n d[key] = kwargs[key][ix]\n vals.append(d)\n self.vals = vals\n self.keys = keys\n\n def __str__(self):\n # header = "\\t".join(self.keys) + "\\n"\n header = ""\n for key in self.keys:\n header += key.center(10) + " "\n header += "\\n"\n template = ""\n for key in self.keys:\n template += "{" + key + ": <10} "\n template += "\\n"\n res = ""\n for row in self.vals:\n res += template.format(**row)\n\n return header + res\n\n\nif __name__ == "__main__":\n d = Data(a=[3, 4, 5], b=[1, 2, 3], c=["r", "g", "b"])\n print(d)\n print(\n type(\n Chart({"a": list("abc"), "b": [1, 2, 3]}).mark_bar().encode(x="a:N", y="b")\n )\n )\n aa = (\n Chart(Data(a=[3, 4, 5], b=[1, 2, 3], c=["r", "g", "b"]))\n .mark_point(color="red")\n .encode(x="b", y="a", color="c:O")\n )\n print("aa = ", aa)\n aa.display()\n\n bb = (\n Chart(Data(a=[1, 2, 3], b=[4, 5, 6], c=["r", "g", "b"]))\n .mark_line()\n .encode(x="b", y="a", color="c:O")\n )\n print("bb = ", bb)\n bb.display()\n print("aa+bb", (aa + bb).display())\n # Chart(Data(a=[1,2,3,2,2,4,5,5,6,7,8,8,8,8,8,9,0,0])).mark_bar().encode(Axis(\'a:Q\', bin=True),y=\'count()\')\n\n\n# todo: see if I can work with the repr of an object to get the behavior that altair gets in notebooks\n# todo: implement a Bin object to specifiy maxbins\n',"src/lib/antigravity.py":'import webbrowser\n\nwebbrowser.open("https://xkcd.com/353/")\n',"src/lib/anydbm.py":'import _sk_fail; _sk_fail._("anydbm")\n',"src/lib/ast.py":'import _sk_fail; _sk_fail._("ast")\n',"src/lib/asynchat.py":'import _sk_fail; _sk_fail._("asynchat")\n',"src/lib/asyncore.py":'import _sk_fail; _sk_fail._("asyncore")\n',"src/lib/atexit.py":'import _sk_fail; _sk_fail._("atexit")\n',"src/lib/audiodev.py":'import _sk_fail; _sk_fail._("audiodev")\n',"src/lib/base64.py":'import _sk_fail; _sk_fail._("base64")\n',"src/lib/bdb.py":'import _sk_fail; _sk_fail._("bdb")\n',"src/lib/binhex.py":'import _sk_fail; _sk_fail._("binhex")\n',"src/lib/bisect.py":'"""Bisection algorithms."""\n\ndef insort_right(a, x, lo=0, hi=None):\n """Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the right of the rightmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n a.insert(lo, x)\n\ndef bisect_right(a, x, lo=0, hi=None):\n """Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e <= x, and all e in\n a[i:] have e > x. So if x already appears in the list, a.insert(x) will\n insert just after the rightmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if x < a[mid]: hi = mid\n else: lo = mid+1\n return lo\n\ndef insort_left(a, x, lo=0, hi=None):\n """Insert item x in list a, and keep it sorted assuming a is sorted.\n\n If x is already in a, insert it to the left of the leftmost x.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n a.insert(lo, x)\n\n\ndef bisect_left(a, x, lo=0, hi=None):\n """Return the index where to insert item x in list a, assuming a is sorted.\n\n The return value i is such that all e in a[:i] have e < x, and all e in\n a[i:] have e >= x. So if x already appears in the list, a.insert(x) will\n insert just before the leftmost x already there.\n\n Optional args lo (default 0) and hi (default len(a)) bound the\n slice of a to be searched.\n """\n\n if lo < 0:\n raise ValueError(\'lo must be non-negative\')\n if hi is None:\n hi = len(a)\n while lo < hi:\n mid = (lo+hi)//2\n if a[mid] < x: lo = mid+1\n else: hi = mid\n return lo\n\n# Overwrite above definitions with a fast C implementation\ntry:\n from _bisect import *\nexcept ImportError:\n pass\n\n# Create aliases\nbisect = bisect_right\ninsort = insort_right\n',"src/lib/bsddb/__init__.py":'import _sk_fail; _sk_fail._("bsddb")\n',"src/lib/cProfile.py":'import _sk_fail; _sk_fail._("cProfile")\n',"src/lib/cgi.py":'import _sk_fail; _sk_fail._("cgi")\n',"src/lib/cgitb.py":'import _sk_fail; _sk_fail._("cgitb")\n',"src/lib/chunk.py":'import _sk_fail; _sk_fail._("chunk")\n',"src/lib/cmd.py":'import _sk_fail; _sk_fail._("cmd")\n',"src/lib/code.py":'import _sk_fail; _sk_fail._("code")\n',"src/lib/codecs.py":'import _sk_fail; _sk_fail._("codecs")\n',"src/lib/codeop.py":'import _sk_fail; _sk_fail._("codeop")\n',"src/lib/colorsys.py":'import _sk_fail; _sk_fail._("colorsys")\n',"src/lib/commands.py":'import _sk_fail; _sk_fail._("commands")\n',"src/lib/compileall.py":'import _sk_fail; _sk_fail._("compileall")\n',"src/lib/compiler/__init__.py":'import _sk_fail; _sk_fail._("compiler")\n',"src/lib/config/__init__.py":'import _sk_fail; _sk_fail._("config")\n',"src/lib/contextlib.py":'import _sk_fail; _sk_fail._("contextlib")\n',"src/lib/cookielib.py":'import _sk_fail; _sk_fail._("cookielib")\n',"src/lib/copy.py":'"""\nThis file was modified from CPython.\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\n"""\nimport types\nclass Error(Exception):\n pass\nerror = Error \nclass _EmptyClass:\n pass\ntry:\n long\nexcept NameError:\n long = int\ntry:\n bytes\nexcept NameError:\n bytes = str\n\ndef check_notimplemented_state(x):\n getstate = getattr(x, "__getstate__", None)\n setstate = getattr(x, "__setstate__", None)\n initargs = getattr(x, "__getinitargs__", None)\n if getstate or setstate or initargs:\n raise NotImplementedError("Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()")\n\n\ndef copy(x):\n cls = type(x)\n if callable(x):\n return x\n copier = getattr(cls, "__copy__", None)\n if copier:\n return copier(x)\n if cls in (type(None), int, float, bool, str, bytes, tuple, type, frozenset, long):\n return x\n if (cls == list) or (cls == dict) or (cls == set) or (cls == slice):\n return cls(x)\n reductor = getattr(x, "__reduce_ex__", None)\n if reductor:\n rv = reductor(4)\n else:\n reductor = getattr(x, "__reduce__", None)\n if reductor:\n rv = reductor()\n elif str(cls)[1:6] == "class":\n check_notimplemented_state(x)\n copier = _copy_inst\n return copier(x)\n else:\n raise Error("un(shallow)copyable object of type %s" % cls)\n if isinstance(rv, str):\n return x\n return _reconstruct(x, rv, 0)\n\ndef _copy_inst(x):\n if hasattr(x, \'__copy__\'):\n return x.__copy__()\n if hasattr(x, \'__getinitargs__\'):\n args = x.__getinitargs__()\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n if hasattr(x, \'__getstate__\'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\n\nd = _deepcopy_dispatch = {}\n\ndef deepcopy(x, memo=None, _nil=[]):\n """Deep copy operation on arbitrary Python objects.\n See the module\'s __doc__ string for more info.\n """\n if memo is None:\n memo = {}\n idx = id(x)\n y = memo.get(idx, _nil)\n if y is not _nil:\n return y\n cls = type(x)\n copier = _deepcopy_dispatch.get(cls)\n if copier:\n y = copier(x, memo)\n else:\n try:\n issc = issubclass(cls, type)\n except TypeError: # cls is not a class (old Boost; see SF #502085)\n issc = 0\n if issc:\n y = _deepcopy_atomic(x, memo)\n else:\n copier = getattr(x, "__deepcopy__", None)\n if copier:\n y = copier(memo)\n else:\n reductor = getattr(x, "__reduce_ex__", None)\n if reductor:\n rv = reductor(2)\n else:\n rv = None\n reductor = getattr(x, "__reduce__", None)\n if reductor:\n rv = reductor()\n elif str(cls)[1:6] == "class":\n check_notimplemented_state(x)\n copier = _deepcopy_dispatch["InstanceType"]\n y = copier(x, memo)\n else:\n raise Error(\n "un(deep)copyable object of type %s" % cls)\n if rv is not None:\n y = _reconstruct(x, rv, 1, memo)\n memo[idx] = y\n _keep_alive(x, memo) # Make sure x lives at least as long as d\n return y\n\ndef _deepcopy_atomic(x, memo):\n return x\nd[type(None)] = _deepcopy_atomic\n# d[type(Ellipsis)] = _deepcopy_atomic\nd[type(NotImplemented)] = _deepcopy_atomic\nd[int] = _deepcopy_atomic\nd[float] = _deepcopy_atomic\nd[bool] = _deepcopy_atomic\nd[complex] = _deepcopy_atomic\nd[bytes] = _deepcopy_atomic\nd[str] = _deepcopy_atomic\n# try:\n# d[types.CodeType] = _deepcopy_atomic\n# except AttributeError:\n# pass\nd[type] = _deepcopy_atomic\n# d[types.BuiltinFunctionType] = _deepcopy_atomic\nd[types.FunctionType] = _deepcopy_atomic\n# d[weakref.ref] = _deepcopy_atomic\n\ndef _deepcopy_list(x, memo):\n y = []\n memo[id(x)] = y\n for a in x:\n y.append(deepcopy(a, memo))\n return y\nd[list] = _deepcopy_list\n\ndef _deepcopy_set(x, memo):\n result = set([]) # make empty set\n memo[id(x)] = result # register this set in the memo for loop checking\n for a in x: # go through elements of set\n result.add(deepcopy(a, memo)) # add the copied elements into the new set\n return result # return the new set\nd[set] = _deepcopy_set\n\ndef _deepcopy_frozenset(x, memo):\n result = frozenset(_deepcopy_set(x,memo)) \n memo[id(x)] = result \n return result\nd[frozenset] = _deepcopy_frozenset\n\ndef _deepcopy_tuple(x, memo):\n y = [deepcopy(a, memo) for a in x]\n # We\'re not going to put the tuple in the memo, but it\'s still important we\n # check for it, in case the tuple contains recursive mutable structures.\n try:\n return memo[id(x)]\n except KeyError:\n pass\n for k, j in zip(x, y):\n if k is not j:\n y = tuple(y)\n break\n else:\n y = x\n return y\nd[tuple] = _deepcopy_tuple\n\ndef _deepcopy_dict(x, memo):\n y = {}\n memo[id(x)] = y\n for key, value in x.items():\n y[deepcopy(key, memo)] = deepcopy(value, memo)\n return y\nd[dict] = _deepcopy_dict\n\n# def _deepcopy_method(x, memo): # Copy instance methods\n# y = type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class);\n# return y\nd[types.MethodType] = _deepcopy_atomic\n\ndef _deepcopy_inst(x, memo):\n if hasattr(x, \'__deepcopy__\'):\n return x.__deepcopy__(memo)\n if hasattr(x, \'__getinitargs__\'):\n args = x.__getinitargs__()\n args = deepcopy(args, memo)\n y = x.__class__(*args)\n else:\n y = _EmptyClass()\n y.__class__ = x.__class__\n memo[id(x)] = y\n if hasattr(x, \'__getstate__\'):\n state = x.__getstate__()\n else:\n state = x.__dict__\n state = deepcopy(state, memo)\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n y.__dict__.update(state)\n return y\nd["InstanceType"] = _deepcopy_inst\n\ndef _keep_alive(x, memo):\n """Keeps a reference to the object x in the memo.\n Because we remember objects by their id, we have\n to assure that possibly temporary objects are kept\n alive by referencing them.\n We store a reference at the id of the memo, which should\n normally not be used unless someone tries to deepcopy\n the memo itself...\n """\n try:\n memo[id(memo)].append(x)\n except KeyError:\n # aha, this is the first one :-)\n memo[id(memo)]=[x]\n\ndef _reconstruct(x, info, deep, memo=None):\n if isinstance(info, str):\n return x\n assert isinstance(info, tuple)\n if memo is None:\n memo = {}\n n = len(info)\n assert n in (2, 3, 4, 5)\n callable, args = info[:2]\n if n > 2:\n state = info[2]\n else:\n state = None\n if n > 3:\n listiter = info[3]\n else:\n listiter = None\n if n > 4:\n dictiter = info[4]\n else:\n dictiter = None\n if deep:\n args = deepcopy(args, memo)\n y = callable(*args)\n memo[id(x)] = y\n\n if state is not None:\n if deep:\n state = deepcopy(state, memo)\n if hasattr(y, \'__setstate__\'):\n y.__setstate__(state)\n else:\n if isinstance(state, tuple) and len(state) == 2:\n state, slotstate = state\n else:\n slotstate = None\n if state is not None:\n y.__dict__.update(state)\n if slotstate is not None:\n for key, value in slotstate.items():\n setattr(y, key, value)\n\n if listiter is not None:\n for item in listiter:\n if deep:\n item = deepcopy(item, memo)\n y.append(item)\n if dictiter is not None:\n for key, value in dictiter:\n if deep:\n key = deepcopy(key, memo)\n value = deepcopy(value, memo)\n y[key] = value\n return y\n\ndel d\n\ndel types\n\n# Helper for instance creation without calling __init__\nclass _EmptyClass:\n pass',"src/lib/copy_reg.py":'import _sk_fail; _sk_fail._("copy_reg")\n',"src/lib/csv.py":'import _sk_fail; _sk_fail._("csv")\n',"src/lib/ctypes/__init__.py":'import _sk_fail; _sk_fail._("ctypes")\n',"src/lib/ctypes/macholib/__init__.py":'import _sk_fail; _sk_fail._("macholib")\n',"src/lib/curses/__init__.py":'import _sk_fail; _sk_fail._("curses")\n',"src/lib/dbhash.py":'import _sk_fail; _sk_fail._("dbhash")\n',"src/lib/decimal.py":'import _sk_fail; _sk_fail._("decimal")\n',"src/lib/difflib.py":'import _sk_fail; _sk_fail._("difflib")\n',"src/lib/dircache.py":'import _sk_fail; _sk_fail._("dircache")\n',"src/lib/dis.py":'import _sk_fail; _sk_fail._("dis")\n',"src/lib/distutils/__init__.py":'import _sk_fail; _sk_fail._("distutils")\n',"src/lib/distutils/command/__init__.py":'import _sk_fail; _sk_fail._("command")\n',"src/lib/distutils/tests/__init__.py":'import _sk_fail; _sk_fail._("tests")\n',"src/lib/doctest.py":'import _sk_fail; _sk_fail._("doctest")\n',"src/lib/dumbdbm.py":'import _sk_fail; _sk_fail._("dumbdbm")\n',"src/lib/dummy_thread.py":'import _sk_fail; _sk_fail._("dummy_thread")\n',"src/lib/dummy_threading.py":'import _sk_fail; _sk_fail._("dummy_threading")\n',"src/lib/email/__init__.py":'import _sk_fail; _sk_fail._("email")\n',"src/lib/email/mime/__init__.py":'import _sk_fail; _sk_fail._("mime")\n',"src/lib/email/test/data/__init__.py":'import _sk_fail; _sk_fail._("data")\n',"src/lib/encodings/__init__.py":'import _sk_fail; _sk_fail._("encodings")\n',"src/lib/filecmp.py":'import _sk_fail; _sk_fail._("filecmp")\n',"src/lib/fileinput.py":'import _sk_fail; _sk_fail._("fileinput")\n',"src/lib/fnmatch.py":'import _sk_fail; _sk_fail._("fnmatch")\n',"src/lib/formatter.py":'import _sk_fail; _sk_fail._("formatter")\n',"src/lib/fpformat.py":'import _sk_fail; _sk_fail._("fpformat")\n',"src/lib/fractions.py":'import _sk_fail; _sk_fail._("fractions")\n',"src/lib/ftplib.py":'import _sk_fail; _sk_fail._("ftplib")\n',"src/lib/genericpath.py":'import _sk_fail; _sk_fail._("genericpath")\n',"src/lib/getopt.py":'import _sk_fail; _sk_fail._("getopt")\n',"src/lib/getpass.py":'import _sk_fail; _sk_fail._("getpass")\n',"src/lib/gettext.py":'import _sk_fail; _sk_fail._("gettext")\n',"src/lib/glob.py":'import _sk_fail; _sk_fail._("glob")\n',"src/lib/gzip.py":'import _sk_fail; _sk_fail._("gzip")\n',"src/lib/hashlib.py":'import _sk_fail; _sk_fail._("hashlib")\n',"src/lib/heapq.py":'"""Heap queue algorithm (a.k.a. priority queue).\n\nHeaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\nall k, counting elements from 0. For the sake of comparison,\nnon-existing elements are considered to be infinite. The interesting\nproperty of a heap is that a[0] is always its smallest element.\n\nUsage:\n\nheap = [] # creates an empty heap\nheappush(heap, item) # pushes a new item on the heap\nitem = heappop(heap) # pops the smallest item from the heap\nitem = heap[0] # smallest item on the heap without popping it\nheapify(x) # transforms list into a heap, in-place, in linear time\nitem = heapreplace(heap, item) # pops and returns smallest item, and adds\n # new item; the heap size is unchanged\n\nOur API differs from textbook heap algorithms as follows:\n\n- We use 0-based indexing. This makes the relationship between the\n index for a node and the indexes for its children slightly less\n obvious, but is more suitable since Python uses 0-based indexing.\n\n- Our heappop() method returns the smallest item, not the largest.\n\nThese two make it possible to view the heap as a regular Python list\nwithout surprises: heap[0] is the smallest item, and heap.sort()\nmaintains the heap invariant!\n"""\n\n# Original code by Kevin O\'Connor, augmented by Tim Peters and Raymond Hettinger\n\n__about__ = """Heap queues\n\n[explanation by François Pinard]\n\nHeaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\nall k, counting elements from 0. For the sake of comparison,\nnon-existing elements are considered to be infinite. The interesting\nproperty of a heap is that a[0] is always its smallest element.\n\nThe strange invariant above is meant to be an efficient memory\nrepresentation for a tournament. The numbers below are `k\', not a[k]:\n\n 0\n\n 1 2\n\n 3 4 5 6\n\n 7 8 9 10 11 12 13 14\n\n 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30\n\n\nIn the tree above, each cell `k\' is topping `2*k+1\' and `2*k+2\'. In\na usual binary tournament we see in sports, each cell is the winner\nover the two cells it tops, and we can trace the winner down the tree\nto see all opponents s/he had. However, in many computer applications\nof such tournaments, we do not need to trace the history of a winner.\nTo be more memory efficient, when a winner is promoted, we try to\nreplace it by something else at a lower level, and the rule becomes\nthat a cell and the two cells it tops contain three different items,\nbut the top cell "wins" over the two topped cells.\n\nIf this heap invariant is protected at all time, index 0 is clearly\nthe overall winner. The simplest algorithmic way to remove it and\nfind the "next" winner is to move some loser (let\'s say cell 30 in the\ndiagram above) into the 0 position, and then percolate this new 0 down\nthe tree, exchanging values, until the invariant is re-established.\nThis is clearly logarithmic on the total number of items in the tree.\nBy iterating over all items, you get an O(n ln n) sort.\n\nA nice feature of this sort is that you can efficiently insert new\nitems while the sort is going on, provided that the inserted items are\nnot "better" than the last 0\'th element you extracted. This is\nespecially useful in simulation contexts, where the tree holds all\nincoming events, and the "win" condition means the smallest scheduled\ntime. When an event schedule other events for execution, they are\nscheduled into the future, so they can easily go into the heap. So, a\nheap is a good structure for implementing schedulers (this is what I\nused for my MIDI sequencer :-).\n\nVarious structures for implementing schedulers have been extensively\nstudied, and heaps are good for this, as they are reasonably speedy,\nthe speed is almost constant, and the worst case is not much different\nthan the average case. However, there are other representations which\nare more efficient overall, yet the worst cases might be terrible.\n\nHeaps are also very useful in big disk sorts. You most probably all\nknow that a big sort implies producing "runs" (which are pre-sorted\nsequences, which size is usually related to the amount of CPU memory),\nfollowed by a merging passes for these runs, which merging is often\nvery cleverly organised[1]. It is very important that the initial\nsort produces the longest runs possible. Tournaments are a good way\nto that. If, using all the memory available to hold a tournament, you\nreplace and percolate items that happen to fit the current run, you\'ll\nproduce runs which are twice the size of the memory for random input,\nand much better for input fuzzily ordered.\n\nMoreover, if you output the 0\'th item on disk and get an input which\nmay not fit in the current tournament (because the value "wins" over\nthe last output value), it cannot fit in the heap, so the size of the\nheap decreases. The freed memory could be cleverly reused immediately\nfor progressively building a second heap, which grows at exactly the\nsame rate the first heap is melting. When the first heap completely\nvanishes, you switch heaps and start a new run. Clever and quite\neffective!\n\nIn a word, heaps are useful memory structures to know. I use them in\na few applications, and I think it is good to keep a `heap\' module\naround. :-)\n\n--------------------\n[1] The disk balancing algorithms which are current, nowadays, are\nmore annoying than clever, and this is a consequence of the seeking\ncapabilities of the disks. On devices which cannot seek, like big\ntape drives, the story was quite different, and one had to be very\nclever to ensure (far in advance) that each tape movement will be the\nmost effective possible (that is, will best participate at\n"progressing" the merge). Some tapes were even able to read\nbackwards, and this was also used to avoid the rewinding time.\nBelieve me, real good tape sorts were quite spectacular to watch!\nFrom all times, sorting has always been a Great Art! :-)\n"""\n\n__all__ = [\'heappush\', \'heappop\', \'heapify\', \'heapreplace\',\n \'nlargest\', \'nsmallest\', \'heappushpop\']\n\n\ndef heappush(heap, item):\n """Push item onto heap, maintaining the heap invariant."""\n heap.append(item)\n _siftdown(heap, 0, len(heap) - 1)\n\n\ndef heappop(heap):\n """Pop the smallest item off the heap, maintaining the heap invariant."""\n lastelt = heap.pop() # raises appropriate IndexError if heap is empty\n if heap:\n returnitem = heap[0]\n heap[0] = lastelt\n _siftup(heap, 0)\n return returnitem\n return lastelt\n\n\ndef heapreplace(heap, item):\n """Pop and return the current smallest value, and add the new item.\n\n This is more efficient than heappop() followed by heappush(), and can be\n more appropriate when using a fixed-size heap. Note that the value\n returned may be larger than item! That constrains reasonable uses of\n this routine unless written as part of a conditional replacement:\n\n if item > heap[0]:\n item = heapreplace(heap, item)\n """\n returnitem = heap[0] # raises appropriate IndexError if heap is empty\n heap[0] = item\n _siftup(heap, 0)\n return returnitem\n\n\ndef heappushpop(heap, item):\n """Fast version of a heappush followed by a heappop."""\n if heap and heap[0] < item:\n item, heap[0] = heap[0], item\n _siftup(heap, 0)\n return item\n\n\ndef heapify(x):\n """Transform list into a heap, in-place, in O(len(x)) time."""\n n = len(x)\n # Transform bottom-up. The largest index there\'s any point to looking at\n # is the largest with a child index in-range, so must have 2*i + 1 < n,\n # or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so\n # j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is\n # (2*j+1-1)/2 = j so j-1 is the largest, and that\'s again n//2-1.\n for i in reversed(range(n // 2)):\n _siftup(x, i)\n\n\ndef _heappop_max(heap):\n """Maxheap version of a heappop."""\n lastelt = heap.pop() # raises appropriate IndexError if heap is empty\n if heap:\n returnitem = heap[0]\n heap[0] = lastelt\n _siftup_max(heap, 0)\n return returnitem\n return lastelt\n\n\ndef _heapreplace_max(heap, item):\n """Maxheap version of a heappop followed by a heappush."""\n returnitem = heap[0] # raises appropriate IndexError if heap is empty\n heap[0] = item\n _siftup_max(heap, 0)\n return returnitem\n\n\ndef _heapify_max(x):\n """Transform list into a maxheap, in-place, in O(len(x)) time."""\n n = len(x)\n for i in reversed(range(n // 2)):\n _siftup_max(x, i)\n\n# \'heap\' is a heap at all indices >= startpos, except possibly for pos. pos\n# is the index of a leaf with a possibly out-of-order value. Restore the\n# heap invariant.\n\n\ndef _siftdown(heap, startpos, pos):\n newitem = heap[pos]\n # Follow the path to the root, moving parents down until finding a place\n # newitem fits.\n while pos > startpos:\n parentpos = (pos - 1) >> 1\n parent = heap[parentpos]\n if newitem < parent:\n heap[pos] = parent\n pos = parentpos\n continue\n break\n heap[pos] = newitem\n\n# The child indices of heap index pos are already heaps, and we want to make\n# a heap at index pos too. We do this by bubbling the smaller child of\n# pos up (and so on with that child\'s children, etc) until hitting a leaf,\n# then using _siftdown to move the oddball originally at index pos into place.\n#\n# We *could* break out of the loop as soon as we find a pos where newitem <=\n# both its children, but turns out that\'s not a good idea, and despite that\n# many books write the algorithm that way. During a heap pop, the last array\n# element is sifted in, and that tends to be large, so that comparing it\n# against values starting from the root usually doesn\'t pay (= usually doesn\'t\n# get us out of the loop early). See Knuth, Volume 3, where this is\n# explained and quantified in an exercise.\n#\n# Cutting the # of comparisons is important, since these routines have no\n# way to extract "the priority" from an array element, so that intelligence\n# is likely to be hiding in custom comparison methods, or in array elements\n# storing (priority, record) tuples. Comparisons are thus potentially\n# expensive.\n#\n# On random arrays of length 1000, making this change cut the number of\n# comparisons made by heapify() a little, and those made by exhaustive\n# heappop() a lot, in accord with theory. Here are typical results from 3\n# runs (3 just to demonstrate how small the variance is):\n#\n# Compares needed by heapify Compares needed by 1000 heappops\n# -------------------------- --------------------------------\n# 1837 cut to 1663 14996 cut to 8680\n# 1855 cut to 1659 14966 cut to 8678\n# 1847 cut to 1660 15024 cut to 8703\n#\n# Building the heap by using heappush() 1000 times instead required\n# 2198, 2148, and 2219 compares: heapify() is more efficient, when\n# you can use it.\n#\n# The total compares needed by list.sort() on the same lists were 8627,\n# 8627, and 8632 (this should be compared to the sum of heapify() and\n# heappop() compares): list.sort() is (unsurprisingly!) more efficient\n# for sorting.\n\n\ndef _siftup(heap, pos):\n endpos = len(heap)\n startpos = pos\n newitem = heap[pos]\n # Bubble up the smaller child until hitting a leaf.\n childpos = 2 * pos + 1 # leftmost child position\n while childpos < endpos:\n # Set childpos to index of smaller child.\n rightpos = childpos + 1\n if rightpos < endpos and not heap[childpos] < heap[rightpos]:\n childpos = rightpos\n # Move the smaller child up.\n heap[pos] = heap[childpos]\n pos = childpos\n childpos = 2 * pos + 1\n # The leaf at pos is empty now. Put newitem there, and bubble it up\n # to its final resting place (by sifting its parents down).\n heap[pos] = newitem\n _siftdown(heap, startpos, pos)\n\n\ndef _siftdown_max(heap, startpos, pos):\n \'Maxheap variant of _siftdown\'\n newitem = heap[pos]\n # Follow the path to the root, moving parents down until finding a place\n # newitem fits.\n while pos > startpos:\n parentpos = (pos - 1) >> 1\n parent = heap[parentpos]\n if parent < newitem:\n heap[pos] = parent\n pos = parentpos\n continue\n break\n heap[pos] = newitem\n\n\ndef _siftup_max(heap, pos):\n \'Maxheap variant of _siftup\'\n endpos = len(heap)\n startpos = pos\n newitem = heap[pos]\n # Bubble up the larger child until hitting a leaf.\n childpos = 2 * pos + 1 # leftmost child position\n while childpos < endpos:\n # Set childpos to index of larger child.\n rightpos = childpos + 1\n if rightpos < endpos and not heap[rightpos] < heap[childpos]:\n childpos = rightpos\n # Move the larger child up.\n heap[pos] = heap[childpos]\n pos = childpos\n childpos = 2 * pos + 1\n # The leaf at pos is empty now. Put newitem there, and bubble it up\n # to its final resting place (by sifting its parents down).\n heap[pos] = newitem\n _siftdown_max(heap, startpos, pos)\n\n\n# Algorithm notes for nlargest() and nsmallest()\n# ==============================================\n#\n# Make a single pass over the data while keeping the k most extreme values\n# in a heap. Memory consumption is limited to keeping k values in a list.\n#\n# Measured performance for random inputs:\n#\n# number of comparisons\n# n inputs k-extreme values (average of 5 trials) % more than min()\n# ------------- ---------------- --------------------- -----------------\n# 1,000 100 3,317 231.7%\n# 10,000 100 14,046 40.5%\n# 100,000 100 105,749 5.7%\n# 1,000,000 100 1,007,751 0.8%\n# 10,000,000 100 10,009,401 0.1%\n#\n# Theoretical number of comparisons for k smallest of n random inputs:\n#\n# Step Comparisons Action\n# ---- -------------------------- ---------------------------\n# 1 1.66 * k heapify the first k-inputs\n# 2 n - k compare remaining elements to top of heap\n# 3 k * (1 + lg2(k)) * ln(n/k) replace the topmost value on the heap\n# 4 k * lg2(k) - (k/2) final sort of the k most extreme values\n#\n# Combining and simplifying for a rough estimate gives:\n#\n# comparisons = n + k * (log(k, 2) * log(n/k) + log(k, 2) + log(n/k))\n#\n# Computing the number of comparisons for step 3:\n# -----------------------------------------------\n# * For the i-th new value from the iterable, the probability of being in the\n# k most extreme values is k/i. For example, the probability of the 101st\n# value seen being in the 100 most extreme values is 100/101.\n# * If the value is a new extreme value, the cost of inserting it into the\n# heap is 1 + log(k, 2).\n# * The probability times the cost gives:\n# (k/i) * (1 + log(k, 2))\n# * Summing across the remaining n-k elements gives:\n# sum((k/i) * (1 + log(k, 2)) for i in range(k+1, n+1))\n# * This reduces to:\n# (H(n) - H(k)) * k * (1 + log(k, 2))\n# * Where H(n) is the n-th harmonic number estimated by:\n# gamma = 0.5772156649\n# H(n) = log(n, e) + gamma + 1 / (2 * n)\n# http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Rate_of_divergence\n# * Substituting the H(n) formula:\n# comparisons = k * (1 + log(k, 2)) * (log(n/k, e) + (1/n - 1/k) / 2)\n#\n# Worst-case for step 3:\n# ----------------------\n# In the worst case, the input data is reversed sorted so that every new element\n# must be inserted in the heap:\n#\n# comparisons = 1.66 * k + log(k, 2) * (n - k)\n#\n# Alternative Algorithms\n# ----------------------\n# Other algorithms were not used because they:\n# 1) Took much more auxiliary memory,\n# 2) Made multiple passes over the data.\n# 3) Made more comparisons in common cases (small k, large n, semi-random input).\n# See the more detailed comparison of approach at:\n# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest\n\ndef nsmallest(n, iterable, key=None):\n """Find the n smallest elements in a dataset.\n\n Equivalent to: sorted(iterable, key=key)[:n]\n """\n\n # Short-cut for n==1 is to use min()\n if n == 1:\n it = iter(iterable)\n sentinel = object()\n result = min(it, default=sentinel, key=key)\n return [] if result is sentinel else [result]\n\n # When n>=size, it\'s faster to use sorted()\n try:\n size = len(iterable)\n except (TypeError, AttributeError):\n pass\n else:\n if n >= size:\n return sorted(iterable, key=key)[:n]\n\n # When key is none, use simpler decoration\n if key is None:\n it = iter(iterable)\n # put the range(n) first so that zip() doesn\'t\n # consume one too many elements from the iterator\n result = [(elem, i) for i, elem in zip(range(n), it)]\n if not result:\n return result\n _heapify_max(result)\n top = result[0][0]\n order = n\n _heapreplace = _heapreplace_max\n for elem in it:\n if elem < top:\n _heapreplace(result, (elem, order))\n top, _order = result[0]\n order += 1\n result.sort()\n return [elem for (elem, order) in result]\n\n # General case, slowest method\n it = iter(iterable)\n result = [(key(elem), i, elem) for i, elem in zip(range(n), it)]\n if not result:\n return result\n _heapify_max(result)\n top = result[0][0]\n order = n\n _heapreplace = _heapreplace_max\n for elem in it:\n k = key(elem)\n if k < top:\n _heapreplace(result, (k, order, elem))\n top, _order, _elem = result[0]\n order += 1\n result.sort()\n return [elem for (k, order, elem) in result]\n\n\ndef nlargest(n, iterable, key=None):\n """Find the n largest elements in a dataset.\n\n Equivalent to: sorted(iterable, key=key, reverse=True)[:n]\n """\n\n # Short-cut for n==1 is to use max()\n if n == 1:\n it = iter(iterable)\n sentinel = object()\n result = max(it, default=sentinel, key=key)\n return [] if result is sentinel else [result]\n\n # When n>=size, it\'s faster to use sorted()\n try:\n size = len(iterable)\n except (TypeError, AttributeError):\n pass\n else:\n if n >= size:\n return sorted(iterable, key=key, reverse=True)[:n]\n\n # When key is none, use simpler decoration\n if key is None:\n it = iter(iterable)\n result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)]\n if not result:\n return result\n heapify(result)\n top = result[0][0]\n order = -n\n _heapreplace = heapreplace\n for elem in it:\n if top < elem:\n _heapreplace(result, (elem, order))\n top, _order = result[0]\n order -= 1\n result.sort(reverse=True)\n return [elem for (elem, order) in result]\n\n # General case, slowest method\n it = iter(iterable)\n result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)]\n if not result:\n return result\n heapify(result)\n top = result[0][0]\n order = -n\n _heapreplace = heapreplace\n for elem in it:\n k = key(elem)\n if top < k:\n _heapreplace(result, (k, order, elem))\n top, _order, _elem = result[0]\n order -= 1\n result.sort(reverse=True)\n return [elem for (k, order, elem) in result]\n\n\n# If available, use C implementation\ntry:\n from _heapq import *\nexcept ImportError:\n pass\ntry:\n from _heapq import _heapreplace_max\nexcept ImportError:\n pass\ntry:\n from _heapq import _heapify_max\nexcept ImportError:\n pass\ntry:\n from _heapq import _heappop_max\nexcept ImportError:\n pass\n\n\nif __name__ == "__main__":\n\n import doctest # pragma: no cover\n print(doctest.testmod()) # pragma: no cover\n',"src/lib/hmac.py":'import _sk_fail; _sk_fail._("hmac")\n',"src/lib/hotshot/__init__.py":'import _sk_fail; _sk_fail._("hotshot")\n',"src/lib/htmlentitydefs.py":'import _sk_fail; _sk_fail._("htmlentitydefs")\n',"src/lib/htmllib.py":'import _sk_fail; _sk_fail._("htmllib")\n',"src/lib/httplib.py":'import _sk_fail; _sk_fail._("httplib")\n',"src/lib/idlelib/Icons/__init__.py":'import _sk_fail; _sk_fail._("Icons")\n',"src/lib/idlelib/__init__.py":'import _sk_fail; _sk_fail._("idlelib")\n',"src/lib/ihooks.py":'import _sk_fail; _sk_fail._("ihooks")\n',"src/lib/imaplib.py":'import _sk_fail; _sk_fail._("imaplib")\n',"src/lib/imghdr.py":'import _sk_fail; _sk_fail._("imghdr")\n',"src/lib/imputil.py":'import _sk_fail; _sk_fail._("imputil")\n',"src/lib/io.py":'import _sk_fail; _sk_fail._("io")\n',"src/lib/lib-dynload/__init__.py":'import _sk_fail; _sk_fail._("lib-dynload")\n',"src/lib/lib-tk/__init__.py":'import _sk_fail; _sk_fail._("lib-tk")\n',"src/lib/lib2to3/__init__.py":'import _sk_fail; _sk_fail._("lib2to3")\n',"src/lib/lib2to3/fixes/__init__.py":'import _sk_fail; _sk_fail._("fixes")\n',"src/lib/lib2to3/pgen2/__init__.py":'import _sk_fail; _sk_fail._("pgen2")\n',"src/lib/lib2to3/tests/__init__.py":'import _sk_fail; _sk_fail._("tests")\n',"src/lib/linecache.py":'import _sk_fail; _sk_fail._("linecache")\n',"src/lib/locale.py":'import _sk_fail; _sk_fail._("locale")\n',"src/lib/logging/__init__.py":'# Minimal implementation original from CPython 3.9 source code\n\nimport sys, time, re\n\n\n__all__ = [\n "BASIC_FORMAT",\n "BufferingFormatter",\n "CRITICAL",\n "DEBUG",\n "ERROR",\n "FATAL",\n "FileHandler",\n "Filter",\n "Formatter",\n "Handler",\n "INFO",\n "LogRecord",\n "Logger",\n "LoggerAdapter",\n "NOTSET",\n "NullHandler",\n "StreamHandler",\n "WARN",\n "WARNING",\n "addLevelName",\n "basicConfig",\n "captureWarnings",\n "critical",\n "debug",\n "disable",\n "error",\n "exception",\n "fatal",\n "getLevelName",\n "getLogger",\n "getLoggerClass",\n "info",\n "log",\n "makeLogRecord",\n "setLoggerClass",\n "shutdown",\n "warning",\n "getLogRecordFactory",\n "setLogRecordFactory",\n "lastResort",\n "raiseExceptions",\n]\n\n\n_startTime = time.time()\nraiseExceptions = False\nlogThreads = False\nlogMultiprocessing = False\nlogProcesses = False\nlogAsyncioTasks = False\n\n# ---------------------------------------------------------------------------\n# Level related stuff\n# ---------------------------------------------------------------------------\n\nCRITICAL = 50\nFATAL = CRITICAL\nERROR = 40\nWARNING = 30\nWARN = WARNING\nINFO = 20\nDEBUG = 10\nNOTSET = 0\n\n_levelToName = {\n CRITICAL: "CRITICAL",\n ERROR: "ERROR",\n WARNING: "WARNING",\n INFO: "INFO",\n DEBUG: "DEBUG",\n NOTSET: "NOTSET",\n}\n_nameToLevel = {\n "CRITICAL": CRITICAL,\n "FATAL": FATAL,\n "ERROR": ERROR,\n "WARN": WARNING,\n "WARNING": WARNING,\n "INFO": INFO,\n "DEBUG": DEBUG,\n "NOTSET": NOTSET,\n}\n\n\ndef getLevelName(level):\n result = _levelToName.get(level)\n if result is not None:\n return result\n result = _nameToLevel.get(level)\n if result is not None:\n return result\n return "Level %s" % level\n\n\ndef addLevelName(level, levelName):\n _levelToName[level] = levelName\n _nameToLevel[levelName] = level\n\n\ndef _checkLevel(level):\n if isinstance(level, int):\n rv = level\n elif str(level) == level:\n if level not in _nameToLevel:\n raise ValueError("Unknown level: %r" % level)\n rv = _nameToLevel[level]\n else:\n raise TypeError("Level not an integer or a valid string: %r" % level)\n return rv\n\n\nclass _FakeRlock(object):\n def __enter__(self):\n pass\n\n def __exit__(self, exc_type, exc_value, traceback):\n pass\n\n\n_lock = _FakeRlock()\n\n# ---------------------------------------------------------------------------\n# The logging record\n# ---------------------------------------------------------------------------\n\n\nclass LogRecord(object):\n def __init__(\n self,\n name,\n level,\n pathname,\n lineno,\n msg,\n args,\n exc_info,\n func=None,\n sinfo=None,\n **kwargs,\n ):\n ct = time.time()\n self.name = name\n self.msg = msg\n if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:\n args = args[0]\n self.args = args\n self.levelname = getLevelName(level)\n self.levelno = level\n self.pathname = pathname\n self.filename = pathname\n self.module = "Unknown module"\n self.exc_info = exc_info\n self.exc_text = None # used to cache the traceback text\n self.stack_info = sinfo\n self.lineno = lineno\n self.funcName = func\n self.created = ct\n self.msecs = int((ct - int(ct)) * 1000) + 0.0 # see gh-89047\n self.relativeCreated = (self.created - _startTime) * 1000\n self.thread = None\n self.threadName = None\n self.processName = None\n self.process = None\n self.taskName = None\n\n def __repr__(self):\n return \'\' % (\n self.name,\n self.levelno,\n self.pathname,\n self.lineno,\n self.msg,\n )\n\n def getMessage(self):\n msg = str(self.msg)\n if self.args:\n msg = msg % self.args\n return msg\n\n\n#\n# Determine which class to use when instantiating log records.\n#\n_logRecordFactory = LogRecord\n\n\ndef setLogRecordFactory(factory):\n global _logRecordFactory\n _logRecordFactory = factory\n\n\ndef getLogRecordFactory():\n return _logRecordFactory\n\n\ndef makeLogRecord(dict):\n rv = _logRecordFactory(None, None, "", 0, "", (), None, None)\n rv.__dict__.update(dict)\n return rv\n\n\n# ---------------------------------------------------------------------------\n# Formatter classes and functions\n# ---------------------------------------------------------------------------\nclass PercentStyle(object):\n default_format = "%(message)s"\n asctime_format = "%(asctime)s"\n asctime_search = "%(asctime)"\n validation_pattern = re.compile(\n r"%\\(\\w+\\)[#0+ -]*(\\*|\\d+)?(\\.(\\*|\\d+))?[diouxefgcrsa%]", re.I\n )\n\n def __init__(self, fmt, *, defaults=None):\n self._fmt = fmt or self.default_format\n self._defaults = defaults\n\n def usesTime(self):\n return self._fmt.find(self.asctime_search) >= 0\n\n def validate(self):\n if not self.validation_pattern.search(self._fmt):\n raise ValueError(\n "Invalid format \'%s\' for \'%s\' style"\n % (self._fmt, self.default_format[0])\n )\n\n def _format(self, record):\n defaults = self._defaults\n if defaults:\n values = defaults | record.__dict__\n else:\n values = record.__dict__\n return self._fmt % values\n\n def format(self, record):\n try:\n return self._format(record)\n except KeyError as e:\n raise ValueError("Formatting field not found in record: %s" % e)\n\n\nclass StrFormatStyle(PercentStyle):\n default_format = "{message}"\n asctime_format = "{asctime}"\n asctime_search = "{asctime"\n\n fmt_spec = re.compile(\n r"^(.?[<>=^])?[+ -]?#?0?(\\d+|{\\w+})?[,_]?(\\.(\\d+|{\\w+}))?[bcdefgnosx%]?$", re.I\n )\n field_spec = re.compile(r"^(\\d+|\\w+)(\\.\\w+|\\[[^]]+\\])*$")\n\n def _format(self, record):\n defaults = self._defaults\n if defaults:\n values = defaults | record.__dict__\n else:\n values = record.__dict__\n return self._fmt.format(**values)\n\n def validate(self):\n """Validate the input format, ensure it is the correct string formatting style"""\n return # TODO - _str_formatter.parse is not a thing - just assume it\'s valid\n fields = set()\n try:\n for _, fieldname, spec, conversion in _str_formatter.parse(self._fmt):\n if fieldname:\n if not self.field_spec.match(fieldname):\n raise ValueError(\n "invalid field name/expression: %r" % fieldname\n )\n fields.add(fieldname)\n if conversion and conversion not in "rsa":\n raise ValueError("invalid conversion: %r" % conversion)\n if spec and not self.fmt_spec.match(spec):\n raise ValueError("bad specifier: %r" % spec)\n except ValueError as e:\n raise ValueError("invalid format: %s" % e)\n if not fields:\n raise ValueError("invalid format: no fields")\n\n\nclass StringTemplateStyle(PercentStyle):\n default_format = "${message}"\n asctime_format = "${asctime}"\n asctime_search = "${asctime}"\n\n def __init__(self, fmt, *, defaults=None):\n raise NotImplementedError("StringTemplateStyle is not implemented")\n\n\nBASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"\n\n_STYLES = {\n "%": (PercentStyle, BASIC_FORMAT),\n "{": (StrFormatStyle, "{levelname}:{name}:{message}"),\n "$": (StringTemplateStyle, "${levelname}:${name}:${message}"),\n}\n\n\nclass Formatter(object):\n def converter(self, x):\n return time.localtime(x)\n\n def __init__(self, fmt=None, datefmt=None, style=\'%\', validate=True, *,\n defaults=None):\n if style not in _STYLES:\n raise ValueError("Style must be one of: %s" % ",".join(_STYLES.keys()))\n self._style = _STYLES[style][0](fmt, defaults=defaults)\n if validate:\n self._style.validate()\n\n self._fmt = self._style._fmt\n self.datefmt = datefmt\n\n default_time_format = "%Y-%m-%d %H:%M:%S"\n default_msec_format = "%s,%03d"\n\n def formatTime(self, record, datefmt=None):\n ct = self.converter(record.created)\n if datefmt:\n s = time.strftime(datefmt, ct)\n else:\n s = time.strftime(self.default_time_format, ct)\n if self.default_msec_format:\n s = self.default_msec_format % (s, record.msecs)\n return s\n\n def formatException(self, ei):\n raise NotImplementedError("formatException is not implemented")\n\n def usesTime(self):\n return self._style.usesTime()\n\n def formatMessage(self, record):\n return self._style.format(record)\n\n def formatStack(self, stack_info):\n return stack_info\n\n def format(self, record):\n record.message = record.getMessage()\n if self.usesTime():\n record.asctime = self.formatTime(record, self.datefmt)\n s = self.formatMessage(record)\n if record.exc_info:\n # Cache the traceback text to avoid converting it multiple times\n # (it\'s constant anyway)\n if not record.exc_text:\n record.exc_text = self.formatException(record.exc_info)\n if record.exc_text:\n if s[-1:] != "\\n":\n s = s + "\\n"\n s = s + record.exc_text\n if record.stack_info:\n if s[-1:] != "\\n":\n s = s + "\\n"\n s = s + self.formatStack(record.stack_info)\n return s\n\n\n#\n# The default formatter to use when no other is specified\n#\n_defaultFormatter = Formatter()\n\n\nclass BufferingFormatter(object):\n def __init__(self, linefmt=None):\n if linefmt:\n self.linefmt = linefmt\n else:\n self.linefmt = _defaultFormatter\n\n def formatHeader(self, records):\n return ""\n\n def formatFooter(self, records):\n return ""\n\n def format(self, records):\n rv = ""\n if len(records) > 0:\n rv = rv + self.formatHeader(records)\n for record in records:\n rv = rv + self.linefmt.format(record)\n rv = rv + self.formatFooter(records)\n return rv\n\n\n# ---------------------------------------------------------------------------\n# Filter classes and functions\n# ---------------------------------------------------------------------------\n\n\nclass Filter(object):\n def __init__(self, name=""):\n self.name = name\n self.nlen = len(name)\n\n def filter(self, record):\n if self.nlen == 0:\n return True\n elif self.name == record.name:\n return True\n elif record.name.find(self.name, 0, self.nlen) != 0:\n return False\n return record.name[self.nlen] == "."\n\n\nclass Filterer(object):\n def __init__(self):\n self.filters = []\n\n def addFilter(self, filter):\n if filter not in self.filters:\n self.filters.append(filter)\n\n def removeFilter(self, filter):\n if filter in self.filters:\n self.filters.remove(filter)\n\n def filter(self, record):\n for f in self.filters:\n if hasattr(f, "filter"):\n result = f.filter(record)\n else:\n result = f(record) # assume callable - will raise if not\n if not result:\n return False\n if isinstance(result, LogRecord):\n record = result\n return record\n\n\n# ---------------------------------------------------------------------------\n# Handler classes and functions\n# ---------------------------------------------------------------------------\n\n# _handlers = weakref.WeakValueDictionary() # map of handler names to handlers\n_handlers = {} # map of handler names to handlers\n\n\nclass Handler(Filterer):\n def __init__(self, level=NOTSET):\n Filterer.__init__(self)\n self._name = None\n self.level = _checkLevel(level)\n self.formatter = None\n self._closed = False\n\n def get_name(self):\n return self._name\n\n def set_name(self, name):\n if self._name in _handlers:\n del _handlers[self._name]\n self._name = name\n if name:\n _handlers[name] = self\n\n name = property(get_name, set_name)\n\n def setLevel(self, level):\n self.level = _checkLevel(level)\n\n def format(self, record):\n if self.formatter:\n fmt = self.formatter\n else:\n fmt = _defaultFormatter\n return fmt.format(record)\n\n def emit(self, record):\n raise NotImplementedError("emit must be implemented " "by Handler subclasses")\n\n def handle(self, record):\n rv = self.filter(record)\n if isinstance(rv, LogRecord):\n record = rv\n if rv:\n self.emit(record)\n return rv\n\n def setFormatter(self, fmt):\n self.formatter = fmt\n\n def flush(self):\n pass\n\n def close(self):\n self._closed = True\n if self._name and self._name in _handlers:\n del _handlers[self._name]\n\n def handleError(self, record):\n pass\n\n def __repr__(self):\n level = getLevelName(self.level)\n return "<%s (%s)>" % (self.__class__.__name__, level)\n\n\nclass StreamHandler(Handler):\n terminator = "\\n"\n\n def __init__(self, stream=None):\n Handler.__init__(self)\n if stream is None:\n stream = sys.stderr\n self.stream = stream\n\n def flush(self):\n if self.stream and hasattr(self.stream, "flush"):\n self.stream.flush()\n\n def emit(self, record):\n try:\n msg = self.format(record)\n stream = self.stream\n stream.write(msg + self.terminator)\n self.flush()\n except RecursionError: # See issue 36272\n raise\n except Exception:\n raise # TODO - we can\'t really handle errors so just raise them\n self.handleError(record)\n\n def setStream(self, stream):\n if stream is self.stream:\n result = None\n else:\n result = self.stream\n self.flush()\n self.stream = stream\n return result\n\n def __repr__(self):\n level = getLevelName(self.level)\n name = getattr(self.stream, "name", "")\n # bpo-36015: name can be an int\n name = str(name)\n if name:\n name += " "\n return "<%s %s(%s)>" % (self.__class__.__name__, name, level)\n\n\nclass FileHandler(StreamHandler):\n def __init__(self, filename, mode="a", encoding=None, delay=False, errors=None):\n raise NotImplementedError("FileHandler is not implemented")\n\n\nclass _StderrHandler(StreamHandler):\n def __init__(self, level=NOTSET):\n Handler.__init__(self, level)\n\n @property\n def stream(self):\n return sys.stderr\n\n\n_defaultLastResort = _StderrHandler(WARNING)\nlastResort = _defaultLastResort\n\n# ---------------------------------------------------------------------------\n# Manager classes and functions\n# ---------------------------------------------------------------------------\n\n\nclass PlaceHolder(object):\n def __init__(self, alogger):\n self.loggerMap = {alogger: None}\n\n def append(self, alogger):\n if alogger not in self.loggerMap:\n self.loggerMap[alogger] = None\n\n\ndef setLoggerClass(klass):\n if klass != Logger:\n if not issubclass(klass, Logger):\n raise TypeError("logger not derived from logging.Logger: " + klass.__name__)\n global _loggerClass\n _loggerClass = klass\n\n\ndef getLoggerClass():\n return _loggerClass\n\n\nclass Manager(object):\n def __init__(self, rootnode):\n self.root = rootnode\n self.disable = 0\n self.emittedNoHandlerWarning = False\n self.loggerDict = {}\n self.loggerClass = None\n self.logRecordFactory = None\n\n @property\n def disable(self):\n return self._disable\n\n @disable.setter\n def disable(self, value):\n self._disable = _checkLevel(value)\n\n def getLogger(self, name):\n rv = None\n if not isinstance(name, str):\n raise TypeError("A logger name must be a string")\n if name in self.loggerDict:\n rv = self.loggerDict[name]\n if isinstance(rv, PlaceHolder):\n ph = rv\n rv = (self.loggerClass or _loggerClass)(name)\n rv.manager = self\n self.loggerDict[name] = rv\n self._fixupChildren(ph, rv)\n self._fixupParents(rv)\n else:\n rv = (self.loggerClass or _loggerClass)(name)\n rv.manager = self\n self.loggerDict[name] = rv\n self._fixupParents(rv)\n return rv\n\n def setLoggerClass(self, klass):\n if klass != Logger:\n if not issubclass(klass, Logger):\n raise TypeError(\n "logger not derived from logging.Logger: " + klass.__name__\n )\n self.loggerClass = klass\n\n def setLogRecordFactory(self, factory):\n self.logRecordFactory = factory\n\n def _fixupParents(self, alogger):\n name = alogger.name\n i = name.rfind(".")\n rv = None\n while (i > 0) and not rv:\n substr = name[:i]\n if substr not in self.loggerDict:\n self.loggerDict[substr] = PlaceHolder(alogger)\n else:\n obj = self.loggerDict[substr]\n if isinstance(obj, Logger):\n rv = obj\n else:\n assert isinstance(obj, PlaceHolder)\n obj.append(alogger)\n i = name.rfind(".", 0, i - 1)\n if not rv:\n rv = self.root\n alogger.parent = rv\n\n def _fixupChildren(self, ph, alogger):\n name = alogger.name\n namelen = len(name)\n for c in ph.loggerMap.keys():\n # The if means ... if not c.parent.name.startswith(nm)\n if c.parent.name[:namelen] != name:\n alogger.parent = c.parent\n c.parent = alogger\n\n def _clear_cache(self):\n for logger in self.loggerDict.values():\n if isinstance(logger, Logger):\n logger._cache.clear()\n self.root._cache.clear()\n\n\n# ---------------------------------------------------------------------------\n# Logger classes and functions\n# ---------------------------------------------------------------------------\n\n\nclass Logger(Filterer):\n def __init__(self, name, level=NOTSET):\n Filterer.__init__(self)\n self.name = name\n self.level = _checkLevel(level)\n self.parent = None\n self.propagate = True\n self.handlers = []\n self.disabled = False\n self._cache = {}\n\n def setLevel(self, level):\n self.level = _checkLevel(level)\n self.manager._clear_cache()\n\n def debug(self, msg, *args, **kwargs):\n if self.isEnabledFor(DEBUG):\n self._log(DEBUG, msg, args, **kwargs)\n\n def info(self, msg, *args, **kwargs):\n if self.isEnabledFor(INFO):\n self._log(INFO, msg, args, **kwargs)\n\n def warning(self, msg, *args, **kwargs):\n if self.isEnabledFor(WARNING):\n self._log(WARNING, msg, args, **kwargs)\n\n def error(self, msg, *args, **kwargs):\n if self.isEnabledFor(ERROR):\n self._log(ERROR, msg, args, **kwargs)\n\n def exception(self, msg, *args, exc_info=True, **kwargs):\n self.error(msg, *args, exc_info=exc_info, **kwargs)\n\n def critical(self, msg, *args, **kwargs):\n if self.isEnabledFor(CRITICAL):\n self._log(CRITICAL, msg, args, **kwargs)\n\n fatal = critical\n\n def log(self, level, msg, *args, **kwargs):\n if not isinstance(level, int):\n if raiseExceptions:\n raise TypeError("level must be an integer")\n else:\n return\n if self.isEnabledFor(level):\n self._log(level, msg, args, **kwargs)\n\n def findCaller(self, stack_info=False, stacklevel=1):\n rv = "(unknown file)", 0, "(unknown function)", None\n return rv\n\n def makeRecord(\n self,\n name,\n level,\n fn,\n lno,\n msg,\n args,\n exc_info,\n func=None,\n extra=None,\n sinfo=None,\n ):\n rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func, sinfo)\n if extra is not None:\n for key in extra:\n if (key in ["message", "asctime"]) or (key in rv.__dict__):\n raise KeyError("Attempt to overwrite %r in LogRecord" % key)\n rv.__dict__[key] = extra[key]\n return rv\n\n def _log(\n self,\n level,\n msg,\n args,\n exc_info=None,\n extra=None,\n stack_info=False,\n stacklevel=1,\n ):\n sinfo = None\n fn, lno, func = "(unknown file)", 0, "(unknown function)"\n if exc_info:\n if isinstance(exc_info, BaseException):\n exc_info = (type(exc_info), exc_info, exc_info.__traceback__)\n elif not isinstance(exc_info, tuple):\n exc_info = sys.exc_info()\n record = self.makeRecord(\n self.name, level, fn, lno, msg, args, exc_info, func, extra, sinfo\n )\n self.handle(record)\n\n def handle(self, record):\n if self.disabled:\n return\n maybe_record = self.filter(record)\n if not maybe_record:\n return\n if isinstance(maybe_record, LogRecord):\n record = maybe_record\n self.callHandlers(record)\n\n def addHandler(self, hdlr):\n if hdlr not in self.handlers:\n self.handlers.append(hdlr)\n\n def removeHandler(self, hdlr):\n if hdlr in self.handlers:\n self.handlers.remove(hdlr)\n\n def hasHandlers(self):\n c = self\n rv = False\n while c:\n if c.handlers:\n rv = True\n break\n if not c.propagate:\n break\n else:\n c = c.parent\n return rv\n\n def callHandlers(self, record):\n c = self\n found = 0\n while c:\n for hdlr in c.handlers:\n found = found + 1\n if record.levelno >= hdlr.level:\n hdlr.handle(record)\n if not c.propagate:\n c = None # break out\n else:\n c = c.parent\n if found == 0:\n if lastResort:\n if record.levelno >= lastResort.level:\n lastResort.handle(record)\n elif raiseExceptions and not self.manager.emittedNoHandlerWarning:\n sys.stderr.write(\n "No handlers could be found for logger" \' "%s"\\n\' % self.name\n )\n self.manager.emittedNoHandlerWarning = True\n\n def getEffectiveLevel(self):\n logger = self\n while logger:\n if logger.level:\n return logger.level\n logger = logger.parent\n return NOTSET\n\n def isEnabledFor(self, level):\n if self.disabled:\n return False\n\n try:\n return self._cache[level]\n except KeyError:\n if self.manager.disable >= level:\n is_enabled = self._cache[level] = False\n else:\n is_enabled = self._cache[level] = level >= self.getEffectiveLevel()\n return is_enabled\n\n def getChild(self, suffix):\n if self.root is not self:\n suffix = ".".join((self.name, suffix))\n return self.manager.getLogger(suffix)\n\n\n def getChildren(self):\n\n def _hierlevel(logger):\n if logger is logger.manager.root:\n return 0\n return 1 + logger.name.count(\'.\')\n\n d = self.manager.loggerDict\n return set(item for item in d.values()\n if isinstance(item, Logger) and item.parent is self and\n _hierlevel(item) == 1 + _hierlevel(item.parent))\n\n def __repr__(self):\n level = getLevelName(self.getEffectiveLevel())\n return "<%s %s (%s)>" % (self.__class__.__name__, self.name, level)\n\n\nclass RootLogger(Logger):\n def __init__(self, level):\n Logger.__init__(self, "root", level)\n\n\n_loggerClass = Logger\n\n\nclass LoggerAdapter(object):\n def __init__(self, logger, extra=None):\n self.logger = logger\n self.extra = extra\n\n def process(self, msg, kwargs):\n kwargs["extra"] = self.extra\n return msg, kwargs\n\n def debug(self, msg, *args, **kwargs):\n self.log(DEBUG, msg, *args, **kwargs)\n\n def info(self, msg, *args, **kwargs):\n self.log(INFO, msg, *args, **kwargs)\n\n def warning(self, msg, *args, **kwargs):\n self.log(WARNING, msg, *args, **kwargs)\n\n def error(self, msg, *args, **kwargs):\n self.log(ERROR, msg, *args, **kwargs)\n\n def exception(self, msg, *args, exc_info=True, **kwargs):\n self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)\n\n def critical(self, msg, *args, **kwargs):\n self.log(CRITICAL, msg, *args, **kwargs)\n\n def log(self, level, msg, *args, **kwargs):\n if self.isEnabledFor(level):\n msg, kwargs = self.process(msg, kwargs)\n self.logger.log(level, msg, *args, **kwargs)\n\n def isEnabledFor(self, level):\n return self.logger.isEnabledFor(level)\n\n def setLevel(self, level):\n self.logger.setLevel(level)\n\n def getEffectiveLevel(self):\n return self.logger.getEffectiveLevel()\n\n def hasHandlers(self):\n return self.logger.hasHandlers()\n\n def _log(self, level, msg, args, **kwargs):\n return self.logger._log(level, msg, args, **kwargs)\n\n @property\n def manager(self):\n return self.logger.manager\n\n @manager.setter\n def manager(self, value):\n self.logger.manager = value\n\n @property\n def name(self):\n return self.logger.name\n\n def __repr__(self):\n logger = self.logger\n level = getLevelName(logger.getEffectiveLevel())\n return "<%s %s (%s)>" % (self.__class__.__name__, logger.name, level)\n\n\nroot = RootLogger(WARNING)\nLogger.root = root\nLogger.manager = Manager(Logger.root)\n\n# ---------------------------------------------------------------------------\n# Configuration classes and functions\n# ---------------------------------------------------------------------------\n\n\ndef basicConfig(**kwargs):\n force = kwargs.pop("force", False)\n encoding = kwargs.pop("encoding", None)\n errors = kwargs.pop("errors", "backslashreplace")\n if force:\n for h in root.handlers[:]:\n root.removeHandler(h)\n h.close()\n if len(root.handlers) == 0:\n handlers = kwargs.pop("handlers", None)\n if handlers is None:\n if "stream" in kwargs and "filename" in kwargs:\n raise ValueError(\n "\'stream\' and \'filename\' should not be " "specified together"\n )\n else:\n if "stream" in kwargs or "filename" in kwargs:\n raise ValueError(\n "\'stream\' or \'filename\' should not be "\n "specified together with \'handlers\'"\n )\n if handlers is None:\n filename = kwargs.pop("filename", None)\n mode = kwargs.pop("filemode", "a")\n if filename:\n if "b" in mode:\n errors = None\n h = FileHandler(filename, mode, encoding=encoding, errors=errors)\n else:\n stream = kwargs.pop("stream", None)\n h = StreamHandler(stream)\n handlers = [h]\n dfs = kwargs.pop("datefmt", None)\n style = kwargs.pop("style", "%")\n if style not in _STYLES:\n raise ValueError("Style must be one of: %s" % ",".join(_STYLES.keys()))\n fs = kwargs.pop("format", _STYLES[style][1])\n fmt = Formatter(fs, dfs, style)\n for h in handlers:\n if h.formatter is None:\n h.setFormatter(fmt)\n root.addHandler(h)\n level = kwargs.pop("level", None)\n if level is not None:\n root.setLevel(level)\n if kwargs:\n keys = ", ".join(kwargs.keys())\n raise ValueError("Unrecognised argument(s): %s" % keys)\n\n\ndef getLogger(name=None):\n if not name or isinstance(name, str) and name == root.name:\n return root\n return Logger.manager.getLogger(name)\n\n\ndef critical(msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.critical(msg, *args, **kwargs)\n\n\nfatal = critical\n\n\ndef error(msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.error(msg, *args, **kwargs)\n\n\ndef exception(msg, *args, exc_info=True, **kwargs):\n error(msg, *args, exc_info=exc_info, **kwargs)\n\n\ndef warning(msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.warning(msg, *args, **kwargs)\n\n\ndef info(msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.info(msg, *args, **kwargs)\n\n\ndef debug(msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.debug(msg, *args, **kwargs)\n\n\ndef log(level, msg, *args, **kwargs):\n if len(root.handlers) == 0:\n basicConfig()\n root.log(level, msg, *args, **kwargs)\n\n\ndef disable(level=CRITICAL):\n root.manager.disable = level\n root.manager._clear_cache()\n\n\ndef shutdown(handlerList=[]):\n raise NotImplementedError("shutdown is not implemented")\n\n\nclass NullHandler(Handler):\n def handle(self, record):\n """Stub."""\n\n def emit(self, record):\n """Stub."""\n\n\ndef captureWarnings(capture):\n raise NotImplementedError("captureWarnings is not implemented")\n',"src/lib/macpath.py":'import _sk_fail; _sk_fail._("macpath")\n',"src/lib/macurl2path.py":'import _sk_fail; _sk_fail._("macurl2path")\n',"src/lib/mailbox.py":'import _sk_fail; _sk_fail._("mailbox")\n',"src/lib/mailcap.py":'import _sk_fail; _sk_fail._("mailcap")\n',"src/lib/markupbase.py":'import _sk_fail; _sk_fail._("markupbase")\n',"src/lib/md5.py":'import _sk_fail; _sk_fail._("md5")\n',"src/lib/mhlib.py":'import _sk_fail; _sk_fail._("mhlib")\n',"src/lib/mimetools.py":'import _sk_fail; _sk_fail._("mimetools")\n',"src/lib/mimetypes.py":'import _sk_fail; _sk_fail._("mimetypes")\n',"src/lib/mimify.py":'import _sk_fail; _sk_fail._("mimify")\n',"src/lib/modulefinder.py":'import _sk_fail; _sk_fail._("modulefinder")\n',"src/lib/multifile.py":'import _sk_fail; _sk_fail._("multifile")\n',"src/lib/multiprocessing/__init__.py":'import _sk_fail; _sk_fail._("multiprocessing")\n',"src/lib/multiprocessing/dummy/__init__.py":'import _sk_fail; _sk_fail._("dummy")\n',"src/lib/mutex.py":'import _sk_fail; _sk_fail._("mutex")\n',"src/lib/netrc.py":'import _sk_fail; _sk_fail._("netrc")\n',"src/lib/new.py":'import _sk_fail; _sk_fail._("new")\n',"src/lib/nntplib.py":'import _sk_fail; _sk_fail._("nntplib")\n',"src/lib/ntpath.py":'import _sk_fail; _sk_fail._("ntpath")\n',"src/lib/nturl2path.py":'import _sk_fail; _sk_fail._("nturl2path")\n',"src/lib/numbers.py":"Number = (int, float, complex)\nIntegral = int\nComplex = complex\n","src/lib/opcode.py":'import _sk_fail; _sk_fail._("opcode")\n',"src/lib/optparse.py":'import _sk_fail; _sk_fail._("optparse")\n',"src/lib/os.py":'import _sk_fail; _sk_fail._("os")\n',"src/lib/os2emxpath.py":'import _sk_fail; _sk_fail._("os2emxpath")\n',"src/lib/pdb.py":'import _sk_fail; _sk_fail._("pdb")\n',"src/lib/pickle.py":'import _sk_fail; _sk_fail._("pickle")\n',"src/lib/pickletools.py":'import _sk_fail; _sk_fail._("pickletools")\n',"src/lib/pipes.py":'import _sk_fail; _sk_fail._("pipes")\n',"src/lib/pkgutil.py":'import _sk_fail; _sk_fail._("pkgutil")\n',"src/lib/platform.py":'import _sk_fail; _sk_fail._("platform")\n',"src/lib/plistlib.py":'import _sk_fail; _sk_fail._("plistlib")\n',"src/lib/popen2.py":'import _sk_fail; _sk_fail._("popen2")\n',"src/lib/poplib.py":'import _sk_fail; _sk_fail._("poplib")\n',"src/lib/posixfile.py":'import _sk_fail; _sk_fail._("posixfile")\n',"src/lib/posixpath.py":'import _sk_fail; _sk_fail._("posixpath")\n',"src/lib/pprint.py":'import _sk_fail; _sk_fail._("pprint")\n',"src/lib/profile.py":'import _sk_fail; _sk_fail._("profile")\n',"src/lib/pstats.py":'import _sk_fail; _sk_fail._("pstats")\n',"src/lib/pty.py":'import _sk_fail; _sk_fail._("pty")\n',"src/lib/py_compile.py":'import _sk_fail; _sk_fail._("py_compile")\n',"src/lib/pyclbr.py":'import _sk_fail; _sk_fail._("pyclbr")\n',"src/lib/pydoc.py":'import _sk_fail; _sk_fail._("pydoc")\n',"src/lib/pydoc_topics.py":'import _sk_fail; _sk_fail._("pydoc_topics")\n',"src/lib/pythonds/__init__.py":"","src/lib/pythonds/basic/__init__.py":'\n#__all__ = ["stack"]\n\n\nfrom .stack import Stack\nfrom .queue import Queue\nfrom .deque import Deque\n\n\n',"src/lib/pythonds/basic/deque.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n#\n# deque.py\n\n\nclass Deque:\n def __init__(self):\n self.items = []\n\n def isEmpty(self):\n return self.items == []\n\n def addFront(self, item):\n self.items.append(item)\n\n def addRear(self, item):\n self.items.insert(0, item)\n\n def removeFront(self):\n return self.items.pop()\n\n def removeRear(self):\n return self.items.pop(0)\n\n def size(self):\n return len(self.items)\n","src/lib/pythonds/basic/queue.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n#\n# queue.py\n\n\nclass Queue:\n def __init__(self):\n self.items = []\n\n def isEmpty(self):\n return self.items == []\n\n def enqueue(self, item):\n self.items.insert(0, item)\n\n def dequeue(self):\n return self.items.pop()\n\n def size(self):\n return len(self.items)\n","src/lib/pythonds/basic/stack.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n#\n# stack.py\n\n\nclass Stack:\n def __init__(self):\n self.items = []\n\n def isEmpty(self):\n return self.items == []\n\n def push(self, item):\n self.items.append(item)\n\n def pop(self):\n return self.items.pop()\n\n def peek(self):\n return self.items[len(self.items) - 1]\n\n def size(self):\n return len(self.items)\n","src/lib/pythonds/graphs/__init__.py":"\n\nfrom .adjGraph import Graph\nfrom .adjGraph import Vertex\nfrom .priorityQueue import PriorityQueue\n","src/lib/pythonds/graphs/adjGraph.py":'#\n# adjGraph\n#\n# Created by Brad Miller on 2005-02-24.\n# Copyright (c) 2005 Brad Miller, David Ranum, Luther College. All rights reserved.\n#\n\nimport sys\nimport os\nimport unittest\n\nclass Graph:\n def __init__(self):\n self.vertices = {}\n self.numVertices = 0\n \n def addVertex(self,key):\n self.numVertices = self.numVertices + 1\n newVertex = Vertex(key)\n self.vertices[key] = newVertex\n return newVertex\n \n def getVertex(self,n):\n if n in self.vertices:\n return self.vertices[n]\n else:\n return None\n\n def __contains__(self,n):\n return n in self.vertices\n \n def addEdge(self,f,t,cost=0):\n if f not in self.vertices:\n nv = self.addVertex(f)\n if t not in self.vertices:\n nv = self.addVertex(t)\n self.vertices[f].addNeighbor(self.vertices[t],cost)\n \n def getVertices(self):\n return list(self.vertices.keys())\n \n def __iter__(self):\n return iter(self.vertices.values())\n \nclass Vertex:\n def __init__(self,num):\n self.id = num\n self.connectedTo = {}\n self.color = \'white\'\n self.dist = sys.maxsize\n self.pred = None\n self.disc = 0\n self.fin = 0\n\n # def __lt__(self,o):\n # return self.id < o.id\n \n def addNeighbor(self,nbr,weight=0):\n self.connectedTo[nbr] = weight\n \n def setColor(self,color):\n self.color = color\n \n def setDistance(self,d):\n self.dist = d\n\n def setPred(self,p):\n self.pred = p\n\n def setDiscovery(self,dtime):\n self.disc = dtime\n \n def setFinish(self,ftime):\n self.fin = ftime\n \n def getFinish(self):\n return self.fin\n \n def getDiscovery(self):\n return self.disc\n \n def getPred(self):\n return self.pred\n \n def getDistance(self):\n return self.dist\n \n def getColor(self):\n return self.color\n \n def getConnections(self):\n return self.connectedTo.keys()\n \n def getWeight(self,nbr):\n return self.connectedTo[nbr]\n \n def __str__(self):\n return str(self.id) + ":color " + self.color + ":disc " + str(self.disc) + ":fin " + str(self.fin) + ":dist " + str(self.dist) + ":pred \\n\\t[" + str(self.pred)+ "]\\n"\n \n def getId(self):\n return self.id\n\nclass adjGraphTests(unittest.TestCase):\n def setUp(self):\n self.tGraph = Graph()\n \n def testMakeGraph(self):\n gFile = open("test.dat")\n for line in gFile:\n fVertex, tVertex = line.split(\'|\')\n fVertex = int(fVertex)\n tVertex = int(tVertex)\n self.tGraph.addEdge(fVertex,tVertex)\n for i in self.tGraph:\n adj = i.getAdj()\n for k in adj:\n print(i, k)\n\n \nif __name__ == \'__main__\':\n unittest.main()\n \n',"src/lib/pythonds/graphs/priorityQueue.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \nimport unittest\n\n# this implementation of binary heap takes key value pairs,\n# we will assume that the keys are all comparable\n\nclass PriorityQueue:\n def __init__(self):\n self.heapArray = [(0,0)]\n self.currentSize = 0\n\n def buildHeap(self,alist):\n self.currentSize = len(alist)\n self.heapArray = [(0,0)]\n for i in alist:\n self.heapArray.append(i)\n i = len(alist) // 2 \n while (i > 0):\n self.percDown(i)\n i = i - 1\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapArray[i][0] > self.heapArray[mc][0]:\n tmp = self.heapArray[i]\n self.heapArray[i] = self.heapArray[mc]\n self.heapArray[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i*2 > self.currentSize:\n return -1\n else:\n if i*2 + 1 > self.currentSize:\n return i*2\n else:\n if self.heapArray[i*2][0] < self.heapArray[i*2+1][0]:\n return i*2\n else:\n return i*2+1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapArray[i][0] < self.heapArray[i//2][0]:\n tmp = self.heapArray[i//2]\n self.heapArray[i//2] = self.heapArray[i]\n self.heapArray[i] = tmp\n i = i//2\n \n def add(self,k):\n self.heapArray.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapArray[1][1]\n self.heapArray[1] = self.heapArray[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapArray.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if self.currentSize == 0:\n return True\n else:\n return False\n\n def decreaseKey(self,val,amt):\n # this is a little wierd, but we need to find the heap thing to decrease by\n # looking at its value\n done = False\n i = 1\n myKey = 0\n while not done and i <= self.currentSize:\n if self.heapArray[i][1] == val:\n done = True\n myKey = i\n else:\n i = i + 1\n if myKey > 0:\n self.heapArray[myKey] = (amt,self.heapArray[myKey][1])\n self.percUp(myKey)\n \n def __contains__(self,vtx):\n for pair in self.heapArray:\n if pair[1] == vtx:\n return True\n return False\n \nclass TestBinHeap(unittest.TestCase):\n def setUp(self):\n self.theHeap = PriorityQueue()\n self.theHeap.add((2,'x'))\n self.theHeap.add((3,'y'))\n self.theHeap.add((5,'z'))\n self.theHeap.add((6,'a'))\n self.theHeap.add((4,'d'))\n\n\n def testInsert(self):\n assert self.theHeap.currentSize == 5\n\n def testDelmin(self):\n assert self.theHeap.delMin() == 'x'\n assert self.theHeap.delMin() == 'y'\n \n def testDecKey(self):\n self.theHeap.decreaseKey('d',1)\n assert self.theHeap.delMin() == 'd'\n \nif __name__ == '__main__':\n unittest.main()\n","src/lib/pythonds/trees/__init__.py":"\nfrom .binaryTree import BinaryTree\nfrom .balance import AVLTree\nfrom .bst import BinarySearchTree\nfrom .binheap import BinHeap\n\n\n","src/lib/pythonds/trees/balance.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nfrom .bst import BinarySearchTree, TreeNode\n\nclass AVLTree(BinarySearchTree):\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n has_key(k)\n items() \n keys() \n values()\n put(k,v)\n '''\n\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.leftChild)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n self.updateBalance(currentNode.rightChild) \n\n def updateBalance(self,node):\n if node.balanceFactor > 1 or node.balanceFactor < -1:\n self.rebalance(node)\n return\n if node.parent != None:\n if node.isLeftChild():\n node.parent.balanceFactor += 1\n elif node.isRightChild():\n node.parent.balanceFactor -= 1\n\n if node.parent.balanceFactor != 0:\n self.updateBalance(node.parent)\n\n def rebalance(self,node):\n if node.balanceFactor < 0:\n if node.rightChild.balanceFactor > 0:\n # Do an LR Rotation\n self.rotateRight(node.rightChild)\n self.rotateLeft(node)\n else:\n # single left\n self.rotateLeft(node)\n elif node.balanceFactor > 0:\n if node.leftChild.balanceFactor < 0:\n # Do an RL Rotation\n self.rotateLeft(node.leftChild)\n self.rotateRight(node)\n else:\n # single right\n self.rotateRight(node)\n\n def rotateLeft(self,rotRoot):\n newRoot = rotRoot.rightChild\n rotRoot.rightChild = newRoot.leftChild\n if newRoot.leftChild != None:\n newRoot.leftChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isLeftChild():\n rotRoot.parent.leftChild = newRoot\n else:\n rotRoot.parent.rightChild = newRoot\n newRoot.leftChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor + 1 - min(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor + 1 + max(rotRoot.balanceFactor, 0)\n\n\n def rotateRight(self,rotRoot):\n newRoot = rotRoot.leftChild\n rotRoot.leftChild = newRoot.rightChild\n if newRoot.rightChild != None:\n newRoot.rightChild.parent = rotRoot\n newRoot.parent = rotRoot.parent\n if rotRoot.isRoot():\n self.root = newRoot\n else:\n if rotRoot.isRightChild():\n rotRoot.parent.rightChild = newRoot\n else:\n rotRoot.parent.leftChild = newRoot\n newRoot.rightChild = rotRoot\n rotRoot.parent = newRoot\n rotRoot.balanceFactor = rotRoot.balanceFactor - 1 - max(newRoot.balanceFactor, 0)\n newRoot.balanceFactor = newRoot.balanceFactor - 1 + min(rotRoot.balanceFactor, 0)\n \n","src/lib/pythonds/trees/binaryTree.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\nclass BinaryTree:\n \"\"\"\n A recursive implementation of Binary Tree\n Using links and Nodes approach.\n \"\"\" \n def __init__(self,rootObj):\n self.key = rootObj\n self.leftChild = None\n self.rightChild = None\n\n def insertLeft(self,newNode):\n if self.leftChild == None:\n self.leftChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.left = self.leftChild\n self.leftChild = t\n \n def insertRight(self,newNode):\n if self.rightChild == None:\n self.rightChild = BinaryTree(newNode)\n else:\n t = BinaryTree(newNode)\n t.right = self.rightChild\n self.rightChild = t\n\n def isLeaf(self):\n return ((not self.leftChild) and (not self.rightChild))\n\n def getRightChild(self):\n return self.rightChild\n\n def getLeftChild(self):\n return self.leftChild\n\n def setRootVal(self,obj):\n self.key = obj\n\n def getRootVal(self,):\n return self.key\n\n def inorder(self):\n if self.leftChild:\n self.leftChild.inorder()\n print(self.key)\n if self.rightChild:\n self.rightChild.inorder()\n\n def postorder(self):\n if self.leftChild:\n self.leftChild.postorder()\n if self.rightChild:\n self.rightChild.postorder()\n print(self.key)\n\n\n def preorder(self):\n print(self.key)\n if self.leftChild:\n self.leftChild.preorder()\n if self.rightChild:\n self.rightChild.preorder()\n\n def printexp(self):\n if self.leftChild:\n print('(')\n self.leftChild.printexp()\n print(self.key)\n if self.rightChild:\n self.rightChild.printexp()\n print(')')\n\n def postordereval(self):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if self.leftChild:\n res1 = self.leftChild.postordereval() #// \\label{peleft}\n if self.rightChild:\n res2 = self.rightChild.postordereval() #// \\label{peright}\n if res1 and res2:\n return opers[self.key](res1,res2) #// \\label{peeval}\n else:\n return self.key\n\ndef inorder(tree):\n if tree != None:\n inorder(tree.getLeftChild())\n print(tree.getRootVal())\n inorder(tree.getRightChild())\n\ndef printexp(tree):\n if tree.leftChild:\n print('(')\n printexp(tree.getLeftChild())\n print(tree.getRootVal())\n if tree.rightChild:\n printexp(tree.getRightChild())\n print(')') \n\ndef printexp(tree):\n sVal = \"\"\n if tree:\n sVal = '(' + printexp(tree.getLeftChild())\n sVal = sVal + str(tree.getRootVal())\n sVal = sVal + printexp(tree.getRightChild()) + ')'\n return sVal\n\ndef postordereval(tree):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if tree:\n res1 = postordereval(tree.getLeftChild()) #// \\label{peleft}\n res2 = postordereval(tree.getRightChild()) #// \\label{peright}\n if res1 and res2:\n return opers[tree.getRootVal()](res1,res2) #// \\label{peeval}\n else:\n return tree.getRootVal()\n\ndef height(tree):\n if tree == None:\n return -1\n else:\n return 1 + max(height(tree.leftChild),height(tree.rightChild))\n\n# t = BinaryTree(7)\n# t.insertLeft(3)\n# t.insertRight(9)\n# inorder(t)\n# import operator\n# x = BinaryTree('*')\n# x.insertLeft('+')\n# l = x.getLeftChild()\n# l.insertLeft(4)\n# l.insertRight(5)\n# x.insertRight(7)\n# print(printexp(x))\n# print(postordereval(x))\n# print(height(x))\n","src/lib/pythonds/trees/binheap.py":"# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005\n# \n\n# this heap takes key value pairs, we will assume that the keys are integers\nclass BinHeap:\n def __init__(self):\n self.heapList = [0]\n self.currentSize = 0\n\n\n def buildHeap(self,alist):\n i = len(alist) // 2\n self.currentSize = len(alist)\n self.heapList = [0] + alist[:]\n print(len(self.heapList), i)\n while (i > 0):\n print(self.heapList, i)\n self.percDown(i)\n i = i - 1\n print(self.heapList,i)\n \n def percDown(self,i):\n while (i * 2) <= self.currentSize:\n mc = self.minChild(i)\n if self.heapList[i] > self.heapList[mc]:\n tmp = self.heapList[i]\n self.heapList[i] = self.heapList[mc]\n self.heapList[mc] = tmp\n i = mc\n \n def minChild(self,i):\n if i * 2 + 1 > self.currentSize:\n return i * 2\n else:\n if self.heapList[i * 2] < self.heapList[i * 2 + 1]:\n return i * 2\n else:\n return i * 2 + 1\n\n def percUp(self,i):\n while i // 2 > 0:\n if self.heapList[i] < self.heapList[i//2]:\n tmp = self.heapList[i // 2]\n self.heapList[i // 2] = self.heapList[i]\n self.heapList[i] = tmp\n i = i // 2\n \n def insert(self,k):\n self.heapList.append(k)\n self.currentSize = self.currentSize + 1\n self.percUp(self.currentSize)\n\n def delMin(self):\n retval = self.heapList[1]\n self.heapList[1] = self.heapList[self.currentSize]\n self.currentSize = self.currentSize - 1\n self.heapList.pop()\n self.percDown(1)\n return retval\n \n def isEmpty(self):\n if currentSize == 0:\n return True\n else:\n return False\n","src/lib/pythonds/trees/bst.py":"#!/bin/env python3.1\n# Bradley N. Miller, David L. Ranum\n# Introduction to Data Structures and Algorithms in Python\n# Copyright 2005, 2010\n# \n\nclass BinarySearchTree:\n '''\n Author: Brad Miller\n Date: 1/15/2005\n Description: Imlement a binary search tree with the following interface\n functions: \n __contains__(y) <==> y in x\n __getitem__(y) <==> x[y]\n __init__()\n __len__() <==> len(x)\n __setitem__(k,v) <==> x[k] = v\n clear()\n get(k)\n items() \n keys() \n values()\n put(k,v)\n in\n del <==> \n '''\n\n def __init__(self):\n self.root = None\n self.size = 0\n \n def put(self,key,val):\n if self.root:\n self._put(key,val,self.root)\n else:\n self.root = TreeNode(key,val)\n self.size = self.size + 1\n\n def _put(self,key,val,currentNode):\n if key < currentNode.key:\n if currentNode.hasLeftChild():\n self._put(key,val,currentNode.leftChild)\n else:\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\n else:\n if currentNode.hasRightChild():\n self._put(key,val,currentNode.rightChild)\n else:\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\n \n def __setitem__(self,k,v):\n self.put(k,v)\n\n def get(self,key):\n if self.root:\n res = self._get(key,self.root)\n if res:\n return res.payload\n else:\n return None\n else:\n return None\n \n def _get(self,key,currentNode):\n if not currentNode:\n return None\n elif currentNode.key == key:\n return currentNode\n elif key < currentNode.key:\n return self._get(key,currentNode.leftChild)\n else:\n return self._get(key,currentNode.rightChild)\n \n \n def __getitem__(self,key):\n res = self.get(key)\n if res:\n return res\n else:\n raise KeyError('Error, key not in tree')\n \n\n def __contains__(self,key):\n if self._get(key,self.root):\n return True\n else:\n return False\n \n def length(self):\n return self.size\n\n def __len__(self):\n return self.size\n\n def __iter__(self):\n return self.root.__iter__()\n \n def delete(self,key):\n if self.size > 1:\n nodeToRemove = self._get(key,self.root)\n if nodeToRemove:\n self.remove(nodeToRemove)\n self.size = self.size-1\n else:\n raise KeyError('Error, key not in tree')\n elif self.size == 1 and self.root.key == key:\n self.root = None\n self.size = self.size - 1\n else:\n raise KeyError('Error, key not in tree')\n\n def __delitem__(self,key):\n self.delete(key)\n \n def remove(self,currentNode):\n if currentNode.isLeaf(): #leaf\n if currentNode == currentNode.parent.leftChild:\n currentNode.parent.leftChild = None\n else:\n currentNode.parent.rightChild = None\n elif currentNode.hasBothChildren(): #interior\n succ = currentNode.findSuccessor()\n succ.spliceOut()\n currentNode.key = succ.key\n currentNode.payload = succ.payload\n else: # this node has one child\n if currentNode.hasLeftChild():\n if currentNode.isLeftChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.leftChild\n elif currentNode.isRightChild():\n currentNode.leftChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.leftChild\n else:\n currentNode.replaceNodeData(currentNode.leftChild.key,\n currentNode.leftChild.payload,\n currentNode.leftChild.leftChild,\n currentNode.leftChild.rightChild)\n else:\n if currentNode.isLeftChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.leftChild = currentNode.rightChild\n elif currentNode.isRightChild():\n currentNode.rightChild.parent = currentNode.parent\n currentNode.parent.rightChild = currentNode.rightChild\n else:\n currentNode.replaceNodeData(currentNode.rightChild.key,\n currentNode.rightChild.payload,\n currentNode.rightChild.leftChild,\n currentNode.rightChild.rightChild)\n\n def inorder(self):\n self._inorder(self.root)\n\n def _inorder(self,tree):\n if tree != None:\n self._inorder(tree.leftChild)\n print(tree.key)\n self._inorder(tree.rightChild)\n\n def postorder(self):\n self._postorder(self.root)\n\n def _postorder(self, tree):\n if tree:\n self._postorder(tree.rightChild)\n self._postorder(tree.leftChild)\n print(tree.key) \n\n def preorder(self):\n self._preorder(self,self.root)\n\n def _preorder(self,tree):\n if tree:\n print(tree.key) \n self._preorder(tree.leftChild)\n self._preorder(tree.rightChild)\n\n \nclass TreeNode:\n def __init__(self,key,val,left=None,right=None,parent=None):\n self.key = key\n self.payload = val\n self.leftChild = left\n self.rightChild = right\n self.parent = parent\n self.balanceFactor = 0\n \n def hasLeftChild(self):\n return self.leftChild\n\n def hasRightChild(self):\n return self.rightChild\n \n def isLeftChild(self):\n return self.parent and self.parent.leftChild == self\n\n def isRightChild(self):\n return self.parent and self.parent.rightChild == self\n\n def isRoot(self):\n return not self.parent\n\n def isLeaf(self):\n return not (self.rightChild or self.leftChild)\n\n def hasAnyChildren(self):\n return self.rightChild or self.leftChild\n\n def hasBothChildren(self):\n return self.rightChild and self.leftChild\n \n def replaceNodeData(self,key,value,lc,rc):\n self.key = key\n self.payload = value\n self.leftChild = lc\n self.rightChild = rc\n if self.hasLeftChild():\n self.leftChild.parent = self\n if self.hasRightChild():\n self.rightChild.parent = self\n \n def findSuccessor(self):\n succ = None\n if self.hasRightChild():\n succ = self.rightChild.findMin()\n else:\n if self.parent:\n if self.isLeftChild():\n succ = self.parent\n else:\n self.parent.rightChild = None\n succ = self.parent.findSuccessor()\n self.parent.rightChild = self\n return succ\n\n\n def spliceOut(self):\n if self.isLeaf():\n if self.isLeftChild():\n self.parent.leftChild = None\n else:\n self.parent.rightChild = None\n elif self.hasAnyChildren():\n if self.hasLeftChild():\n if self.isLeftChild():\n self.parent.leftChild = self.leftChild\n else:\n self.parent.rightChild = self.leftChild\n self.leftChild.parent = self.parent\n else:\n if self.isLeftChild():\n self.parent.leftChild = self.rightChild\n else:\n self.parent.rightChild = self.rightChild\n self.rightChild.parent = self.parent\n\n def findMin(self):\n current = self\n while current.hasLeftChild():\n current = current.leftChild\n return current\n\n def __iter__(self):\n \"\"\"The standard inorder traversal of a binary tree.\"\"\"\n if self:\n if self.hasLeftChild():\n for elem in self.leftChild:\n yield elem\n yield self.key\n if self.hasRightChild():\n for elem in self.rightChild:\n yield elem\n\n \n","src/lib/pythonds3/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3 import statement\n"""\n\nfrom pythonds3.basic import Stack, Queue, Deque\nfrom pythonds3.graphs import Graph, Vertex\nfrom pythonds3.searching import HashTable\nfrom pythonds3.trees import (\n BinaryTree,\n AVLTree,\n BinarySearchTree,\n BinaryHeap,\n PriorityQueue,\n)\n\n__all__ = [\n "Stack",\n "Queue",\n "Deque",\n "Graph",\n "Vertex",\n "HashTable",\n "BinaryTree",\n "AVLTree",\n "BinarySearchTree",\n "BinaryHeap",\n "BinaryTree",\n "PriorityQueue",\n]\n',"src/lib/pythonds3/basic/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.basic import statement\n"""\nfrom pythonds3.basic.stack import Stack\nfrom pythonds3.basic.queue import Queue\nfrom pythonds3.basic.deque import Deque\nfrom pythonds3.basic.linked_list import OrderedList\nfrom pythonds3.basic.linked_list import UnorderedList\n\n__all__ = ["Stack", "Queue", "Deque", "OrderedList", "UnorderedList"]\n',"src/lib/pythonds3/basic/deque.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass Deque:\n """Queue implementation as a list"""\n\n def __init__(self):\n """Create new deque"""\n self._items = []\n\n def is_empty(self):\n """Check if the deque is empty"""\n return not bool(self._items)\n\n def add_front(self, item):\n """Add an item to the front of the deque"""\n self._items.append(item)\n\n def add_rear(self, item):\n """Add an item to the rear of the deque"""\n self._items.insert(0, item)\n\n def remove_front(self):\n """Remove an item from the front of the deque"""\n return self._items.pop()\n\n def remove_rear(self):\n """Remove an item from the rear of the deque"""\n return self._items.pop(0)\n\n def size(self):\n """Get the number of items in the deque"""\n return len(self._items)\n',"src/lib/pythonds3/basic/linked_list.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass LinkedListNode:\n """A node of a linked list"""\n\n def __init__(self, node_data):\n self._data = node_data\n self._next = None\n\n def get_data(self):\n """Get node data"""\n return self._data\n\n def set_data(self, node_data):\n """Set node data"""\n self._data = node_data\n\n data = property(get_data, set_data)\n\n def get_next(self):\n """Get next node"""\n return self._next\n\n def set_next(self, node_next):\n """Set next node"""\n self._next = node_next\n\n next = property(get_next, set_next)\n\n def __str__(self):\n """String"""\n return str(self._data)\n\n\nclass LinkedList:\n """Linked List class implementation"""\n\n def __init__(self):\n """Create a linked list"""\n self._head = None\n self._count = 0\n\n def is_empty(self):\n """Is the list empty"""\n return self._head is None\n\n def size(self):\n """Size of the list"""\n return self._count\n\n def __len__(self):\n """Size of the list"""\n return self._count\n\n def __str__(self):\n """List as a string"""\n list_str = "["\n current = self._head\n\n while current:\n list_str += str(current)\n if current.next:\n list_str += ", "\n current = current.next\n list_str += "]"\n return list_str\n\n def add(self, value):\n """Add a new node"""\n pass\n\n def remove(self, value):\n """Remove a node with a specific value"""\n pass\n\n def search(self, value):\n """Search for a node with a specific value"""\n pass\n\n\nclass UnorderedList(LinkedList):\n """Unordered linked list implementation"""\n\n def __init__(self):\n """Create an unordered linked list"""\n LinkedList.__init__(self)\n\n def add(self, value):\n """Add a new node"""\n new_node = LinkedListNode(value)\n new_node.set_next(self._head)\n self._head = new_node\n self._count = self._count + 1\n\n def remove(self, value):\n """Remove a node with a specific value"""\n current = self._head\n prev = None\n\n while current:\n if current.data == value:\n if prev is None:\n self._head = current.next\n else:\n prev.next = current.next\n self._count = self._count - 1\n return\n prev = current\n current = current.next\n raise ValueError("{} is not in the list".format(value))\n\n def search(self, value):\n """Search for a node with a specific value"""\n current = self._head\n\n while current:\n if current.data == value:\n return True\n current = current.next\n return False\n\n\nclass OrderedList(LinkedList):\n """Ordered linked list implementation"""\n\n def __init__(self):\n """Create an Ordered linked list"""\n LinkedList.__init__(self)\n\n def add(self, value):\n """Add a new node"""\n current = self._head\n prev = None\n new_node = LinkedListNode(value)\n\n while current and current.data < value:\n prev = current\n current = current.next\n\n if prev is None:\n new_node.next = self._head\n self._head = new_node\n else:\n new_node.next = current\n prev.next = new_node\n self._count = self._count + 1\n\n def remove(self, value):\n """Remove a node with a specific value"""\n # This is an exercise\n pass\n\n def search(self, value):\n """Search for a node with a specific value"""\n # This is an exercise\n pass\n',"src/lib/pythonds3/basic/queue.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass Queue:\n """Queue implementation as a list"""\n\n def __init__(self):\n """Create new queue"""\n self._items = []\n\n def is_empty(self):\n """Check if the queue is empty"""\n return not bool(self._items)\n\n def enqueue(self, item):\n """Add an item to the queue"""\n self._items.insert(0, item)\n\n def dequeue(self):\n """Remove an item from the queue"""\n return self._items.pop()\n\n def size(self):\n """Get the number of items in the queue"""\n return len(self._items)\n',"src/lib/pythonds3/basic/stack.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass Stack:\n """Stack implementation as a list"""\n\n def __init__(self):\n """Create new stack"""\n self._items = []\n\n def is_empty(self):\n """Check if the stack is empty"""\n return not bool(self._items)\n\n def push(self, item):\n """Add an item to the stack"""\n self._items.append(item)\n\n def pop(self):\n """Remove an item from the stack"""\n return self._items.pop()\n\n def peek(self):\n """Get the value of the top item in the stack"""\n return self._items[-1]\n\n def size(self):\n """Get the number of items in the stack"""\n return len(self._items)\n',"src/lib/pythonds3/graphs/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.graphs import statement\n"""\nfrom pythonds3.graphs.adjacency_graph import Graph\nfrom pythonds3.graphs.adjacency_graph import Vertex\n\n__all__ = ["Graph"]\n',"src/lib/pythonds3/graphs/adjacency_graph.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\nimport heapq\nimport sys\n\n\nclass Vertex:\n """Graph vertex class"""\n\n def __init__(self, key):\n """Create new vertex"""\n self._key = key\n self._neighbors = {}\n self._color = "white"\n self._distance = sys.maxsize\n self._previous = None\n self._discovery_time = 0\n self._closing_time = 0\n\n def __lt__(self, other):\n """Less than operator required for heapify"""\n return self.key < other.key\n\n def get_key(self):\n """Get vertex key"""\n return self._key\n\n key = property(get_key)\n\n def get_neighbor(self, other):\n """Get the distance (edge weight) to an adjacent node (neighbor)"""\n return self._neighbors.get(other, None)\n\n def set_neighbor(self, other, weight=0):\n """Set the distance (add an edge) to an adjacent node (neighbor)"""\n self._neighbors[other] = weight\n\n def get_neighbors(self):\n """Get all adjacent nodes (neighbors)"""\n return self._neighbors.keys()\n\n def get_color(self):\n """Get vertex color"""\n return self._color\n\n def set_color(self, color):\n """Set vertex color"""\n self._color = color\n\n color = property(get_color, set_color)\n\n def get_distance(self):\n """Get distance"""\n return self._distance\n\n def set_distance(self, distance):\n """Set distance"""\n self._distance = distance\n\n distance = property(get_distance, set_distance)\n\n def get_previous(self):\n """Get previous"""\n return self._previous\n\n def set_previous(self, previous):\n """Set previous"""\n self._previous = previous\n\n previous = property(get_previous, set_previous)\n\n def get_discovery_time(self):\n """Get discovery time"""\n return self._discovery_time\n\n def set_discovery_time(self, discovery_time):\n """Set discovery time"""\n self._discovery_time = discovery_time\n\n discovery_time = property(get_discovery_time, set_discovery_time)\n\n def get_closing_time(self):\n """Get closing time"""\n return self._closing_time\n\n def set_closing_time(self, closing_time):\n """Set closing time"""\n self._closing_time = closing_time\n\n closing_time = property(get_closing_time, set_closing_time)\n\n def __str__(self):\n return "{:^8}|{:^8}|{:^8}|{:^8}|{:^8}| {}".format(\n self._key,\n self._color,\n self._distance,\n self._discovery_time,\n self._closing_time,\n self._previous,\n )\n\n\nclass Graph:\n """Graph as an adjacency matrix"""\n\n def __init__(self):\n self._vertices = {}\n self._edges = {}\n self._time = 0\n\n def __iter__(self):\n """Iterator"""\n return iter(self._vertices.values())\n\n def size(self):\n """Graph\'s size"""\n return len(self._vertices)\n\n def __len__(self):\n """Graph\'s size"""\n return len(self._vertices)\n\n def __contains__(self, key):\n """in operator override"""\n return key in self._vertices\n\n def get_vertex(self, key):\n """Find the vertex in the graph named vert_key"""\n return self._vertices.get(key, None)\n\n def set_vertex(self, key):\n """Add an instance of Vertex to the graph"""\n self._vertices[key] = Vertex(key)\n\n def add_edge(self, from_vertex, to_vertex, weight=0):\n """Add a weighted and directed edge to the graph"""\n if from_vertex not in self._vertices:\n self.set_vertex(from_vertex)\n if to_vertex not in self._vertices:\n self.set_vertex(to_vertex)\n self._vertices[from_vertex].set_neighbor(self._vertices[to_vertex], weight)\n self._edges[(from_vertex, to_vertex)] = weight\n\n def get_vertices(self):\n """Return the list of all vertices in the graph"""\n return self._vertices.keys()\n\n def get_edges(self):\n """Return the list of all edges in the graph"""\n return self._edges.keys()\n\n def reset_distances(self, default_distance=sys.maxsize):\n """Reset distances to test Dijkstra\'s"""\n for vertex in self:\n vertex.distance = default_distance\n\n def bfs(self, start):\n """Breadth First Search"""\n start.distance = 0\n start.previous = None\n vert_queue = [start]\n while vert_queue:\n current_vert = vert_queue.pop(0)\n for neigh in current_vert.get_neighbors():\n if neigh.color == "white":\n neigh.color = "gray"\n neigh.distance = current_vert.distance + 1\n neigh.previous = current_vert\n vert_queue.append(neigh)\n current_vert.color = "black"\n\n def dfs(self):\n """Depth First search"""\n for vertex in self:\n if vertex.color == "white":\n self.dfs_visit(vertex)\n\n def dfs_visit(self, start):\n """DFS helper function"""\n start.color = "gray"\n self._time = self._time + 1\n start.discovery_time = self._time\n for next_vertex in start.get_neighbors():\n if next_vertex.color == "white":\n next_vertex.set_previous(start)\n self.dfs_visit(next_vertex)\n start.color = "black"\n self._time = self._time + 1\n start.closing_time = self._time\n\n def traverse(self, src, dst):\n """Traverse a graph"""\n path = []\n current = self.get_vertex(dst)\n while current:\n path.append(current)\n current = current.previous\n print(\n "Path from {} to {} ({}): {}".format(\n self.get_vertex(src).key,\n self.get_vertex(dst).key,\n self.get_vertex(dst).distance,\n " ".join(vertex.key for vertex in reversed(path)),\n )\n )\n\n def dijkstra(self, start):\n """Dijkstra\'s shortest path algorithm"""\n start.distance = 0\n not_yet_visited = [[start.distance, start]]\n heapq.heapify(not_yet_visited)\n while not_yet_visited:\n current_vertex = heapq.heappop(not_yet_visited)[1]\n for next_vertex in current_vertex.get_neighbors():\n new_distance = current_vertex.distance + current_vertex.get_neighbor(\n next_vertex\n )\n if new_distance < next_vertex.distance:\n next_vertex.distance = new_distance\n next_vertex.previous = current_vertex\n found = False\n for vertex in not_yet_visited:\n if vertex[1].key == next_vertex.key:\n vertex[0] = next_vertex.distance\n heapq.heapify(not_yet_visited)\n found = True\n if not found:\n heapq.heappush(\n not_yet_visited, [next_vertex.distance, next_vertex]\n )\n\n def bellman_ford(self, start):\n """Bellman-Ford shortest path algorithm"""\n start.distance = 0\n for _ in range(len(self._vertices)):\n for edge in self._edges:\n if (\n self.get_vertex(edge[0]).distance + self._edges[edge]\n < self.get_vertex(edge[1]).distance\n ):\n self.get_vertex(edge[1]).distance = (\n self.get_vertex(edge[0]).distance + self._edges[edge]\n )\n self.get_vertex(edge[1]).previous = self.get_vertex(edge[0])\n for edge in self._edges:\n if (\n self.get_vertex(edge[0]).distance + self._edges[edge]\n < self.get_vertex(edge[1]).distance\n ):\n raise ValueError("Graph contains a negative-weight cycle")\n\n def prim(self, start):\n """Prim\'s spanning tree algorithm"""\n start.distance = 0\n not_in_a_tree = [[vertex.distance, vertex] for vertex in self]\n heapq.heapify(not_in_a_tree)\n while not_in_a_tree:\n current_vertex = heapq.heappop(not_in_a_tree)[1]\n for next_vertex in current_vertex.get_neighbors():\n new_distance = current_vertex.get_neighbor(next_vertex)\n if (\n any(item[1] == next_vertex for item in not_in_a_tree)\n and new_distance < next_vertex.distance\n ):\n next_vertex.previous = current_vertex\n next_vertex.distance = new_distance\n for item in not_in_a_tree:\n if item[1] == next_vertex:\n item[0] = new_distance\n heapq.heapify(not_in_a_tree)\n break\n',"src/lib/pythonds3/intro/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.intro import statement\n"""\nfrom pythonds3.intro.oop import Fraction\n\n__all__ = ["Fraction"]\n',"src/lib/pythonds3/intro/oop.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\ndef gcd(number1, number2):\n """Helper function to simplify fractions"""\n if not isinstance(number1, int) or not isinstance(number2, int):\n raise TypeError("Numerator and denominator must be integers")\n while number1 % number2:\n number1, number2 = number2, number1 % number2\n return number2\n\n\nclass Fraction:\n """Fraction class"""\n\n def __init__(self, new_numer, new_denom):\n try:\n common = gcd(new_numer, new_denom)\n except TypeError:\n raise\n self._numer = new_numer // common\n self._denom = new_denom // common\n\n @property\n def numer(self):\n """Get numerator"""\n return self._numer\n\n @numer.setter\n def set_numer(self, new_numer):\n """Set numerator"""\n self._numer = new_numer\n\n def get_denom(self):\n """Get deniminator"""\n return self._denom\n\n def set_denom(self, new_denom):\n """Set deniminator"""\n self._denom = new_denom\n\n # Another way to create an attribute\n denom = property(get_denom, set_denom)\n\n def __str__(self):\n """Get the string value"""\n if self._numer > self._denom:\n return "{} {}/{}".format(\n self._numer // self._denom, self._numer % self._denom, self._denom\n )\n return "{}/{}".format(self._numer, self._denom)\n\n def __repr__(self):\n """Fraction representation"""\n return "Fraction({}, {})".format(self._numer, self._denom)\n\n def __eq__(self, other):\n """Equality comparison"""\n return self._numer * other.denom == other.numer * self._denom\n\n def __add__(self, other):\n """Add two fractions"""\n new_numer = self._numer * other.denom + self._denom * other.numer\n new_denom = self._denom * other.denom\n return Fraction(new_numer, new_denom)\n',"src/lib/pythonds3/searching/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.search import statement\n"""\nfrom pythonds3.searching.hash_table import HashTable\n\n__all__ = ["HashTable"]\n',"src/lib/pythonds3/searching/hash_table.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass HashTable:\n """Hash Table implementation"""\n\n def __init__(self, size=16):\n """Create a hash table"""\n self._size = size\n self._slots = [None] * self._size\n self._data = [None] * self._size\n\n def __getitem__(self, key):\n """Magic __get__"""\n return self.get(key)\n\n def __setitem__(self, key, data):\n """Magic __set__"""\n self.put(key, data)\n\n def __len__(self):\n """Magic __len__"""\n return self._size - self._slots.count(None)\n\n def __contains__(self, key):\n """Magin in"""\n return key in self._slots\n\n def _hash_function(self, key, size):\n """Simple hash function"""\n return key % size\n\n def _rehash(self, old_hash, size, step=1):\n """Simple rehash function"""\n return (old_hash + step) % size\n\n def is_empty(self):\n """Check if the table is empty"""\n return self._size == self._slots.count(None)\n\n def size(self):\n """Get number of items in the table"""\n return self._size - self._slots.count(None)\n\n def put(self, key, data):\n """Add an item to the table"""\n hash_value = self._hash_function(key, len(self._slots))\n\n if self._slots[hash_value] is None:\n self._slots[hash_value] = key\n self._data[hash_value] = data\n else:\n if self._slots[hash_value] == key:\n self._data[hash_value] = data # replace\n else:\n j = 0\n next_slot = self._rehash(hash_value, len(self._slots), j)\n while (\n self._slots[next_slot] is not None\n and self._slots[next_slot] != key\n and j < self._size\n ):\n j = j + 1\n next_slot = self._rehash(hash_value, len(self._slots), j)\n\n if self._slots[next_slot] is None:\n self._slots[next_slot] = key\n self._data[next_slot] = data\n elif j == self._size:\n raise Exception("Hash Table is full")\n else:\n self._data[next_slot] = data # replace\n\n def get(self, key):\n """Get an item from the table"""\n start_slot = self._hash_function(key, len(self._slots))\n position = start_slot\n j = 0\n\n while self._slots[position] is not None and j < self._size:\n if self._slots[position] == key:\n return self._data[position]\n j = j + 1\n position = self._rehash(start_slot, len(self._slots), j)\n\n raise KeyError("{} is not in the table".format(key))\n',"src/lib/pythonds3/sorting/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.sorting import statement\n"""\nfrom pythonds3.sorting.sorting_algorithms import bubble_sort\nfrom pythonds3.sorting.sorting_algorithms import select_sort\nfrom pythonds3.sorting.sorting_algorithms import insert_sort\nfrom pythonds3.sorting.sorting_algorithms import shell_sort\nfrom pythonds3.sorting.sorting_algorithms import merge_sort\nfrom pythonds3.sorting.sorting_algorithms import quick_sort\nfrom pythonds3.sorting.sorting_algorithms import heap_sort\n',"src/lib/pythonds3/sorting/sorting_algorithms.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\nimport heapq\n\n\ndef bubble_sort(lst):\n """Bubble sort"""\n for i in range(len(lst) - 1, 0, -1):\n exchanges = False\n for j in range(i):\n if lst[j] > lst[j + 1]:\n exchanges = True\n lst[j], lst[j + 1] = lst[j + 1], lst[j]\n if not exchanges:\n break\n\n\ndef select_sort(lst):\n """Selection sort"""\n for i, item in enumerate(lst):\n min_idx = len(lst) - 1\n for j in range(i, len(lst)):\n if lst[j] < lst[min_idx]:\n min_idx = j\n if min_idx != i:\n lst[min_idx], lst[i] = lst[i], lst[min_idx]\n\n\ndef insert_sort(lst):\n """Insertion sort"""\n for i in range(1, len(lst)):\n cur_val = lst[i]\n cur_pos = i\n\n while cur_pos > 0 and lst[cur_pos - 1] > cur_val:\n lst[cur_pos] = lst[cur_pos - 1]\n cur_pos = cur_pos - 1\n lst[cur_pos] = cur_val\n\n\ndef shell_sort(lst):\n """Shell sort"""\n sublist_count = len(lst) // 3\n while sublist_count > 0:\n for pos_start in range(sublist_count):\n _gap_insert_sort(lst, pos_start, sublist_count)\n sublist_count = sublist_count // 2\n\n\ndef _gap_insert_sort(lst, start, gap):\n """Shell sort helper function"""\n for i in range(start + gap, len(lst), gap):\n cur_val = lst[i]\n cur_pos = i\n while cur_pos >= gap and lst[cur_pos - gap] > cur_val:\n lst[cur_pos] = lst[cur_pos - gap]\n cur_pos = cur_pos - gap\n lst[cur_pos] = cur_val\n\n\ndef merge_sort(lst):\n """Merge sort"""\n if len(lst) > 1:\n mid = len(lst) // 2\n left_half = lst[:mid]\n right_half = lst[mid:]\n\n merge_sort(left_half)\n merge_sort(right_half)\n\n i, j, k = 0, 0, 0\n while i < len(left_half) and j < len(right_half):\n if left_half[i] <= right_half[j]:\n lst[k] = left_half[i]\n i = i + 1\n else:\n lst[k] = right_half[j]\n j = j + 1\n k = k + 1\n\n while i < len(left_half):\n lst[k] = left_half[i]\n i = i + 1\n k = k + 1\n\n while j < len(right_half):\n lst[k] = right_half[j]\n j = j + 1\n k = k + 1\n\n\ndef quick_sort(lst):\n """Quick sort"""\n _quick_sort_help(lst, 0, len(lst) - 1)\n\n\ndef _quick_sort_help(lst, mark_l, mark_r):\n """Quick sort helper"""\n if mark_l < mark_r:\n split = _quick_sort_part(lst, mark_l, mark_r)\n _quick_sort_help(lst, mark_l, split - 1)\n _quick_sort_help(lst, split + 1, mark_r)\n\n\ndef _quick_sort_part(lst, mark_l, mark_r):\n """Quick sort partition"""\n pivot_val = lst[mark_l]\n mark_l_cur = mark_l + 1\n mark_r_cur = mark_r\n done = False\n\n while not done:\n while mark_l_cur <= mark_r_cur and lst[mark_l_cur] <= pivot_val:\n mark_l_cur = mark_l_cur + 1\n while mark_l_cur <= mark_r_cur and lst[mark_r_cur] >= pivot_val:\n mark_r_cur = mark_r_cur - 1\n if mark_r_cur < mark_l_cur:\n done = True\n else:\n lst[mark_l_cur], lst[mark_r_cur] = lst[mark_r_cur], lst[mark_l_cur]\n lst[mark_l], lst[mark_r_cur] = lst[mark_r_cur], lst[mark_l]\n\n return mark_r_cur\n\n\ndef heap_sort(lst):\n """Heap sort"""\n res = []\n heapq.heapify(lst)\n while lst:\n res.append(heapq.heappop(lst))\n for i in res:\n lst.append(i)\n',"src/lib/pythonds3/trees/__init__.py":'#!/usr/bin/env python3\n"""\npythonds3.trees import statement\n"""\nfrom pythonds3.trees.avl_tree import AVLTree\nfrom pythonds3.trees.binary_search_tree import BinarySearchTree\nfrom pythonds3.trees.binary_heap import BinaryHeap\nfrom pythonds3.trees.binary_tree import BinaryTree\nfrom pythonds3.trees.priority_queue import PriorityQueue\n\n__all__ = ["BinaryTree", "BinaryHeap", "BinarySearchTree", "AVLTree", "PriorityQueue"]\n',"src/lib/pythonds3/trees/avl_tree.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005, 2010\nUpdated by Roman Yasinovskyy, 2017\n"""\n\nfrom pythonds3.trees.binary_search_tree import BinarySearchTree\nfrom pythonds3.trees.binary_search_tree import BinaryTreeNode\n\n\nclass AVLTreeNode(BinaryTreeNode):\n """AVL Tree Node"""\n\n def __init__(self, key, val, balance_factor, left=None, right=None, parent=None):\n """Create an AVL tree node"""\n BinaryTreeNode.__init__(self, key, val, left, right, parent)\n self._balance_factor = balance_factor\n\n def get_balance_factor(self):\n """Get the node balance factor"""\n return self._balance_factor\n\n def set_balance_factor(self, value):\n """Set the node balance factor"""\n self._balance_factor = value\n\n balance_factor = property(get_balance_factor, set_balance_factor)\n\n\nclass AVLTree(BinarySearchTree):\n """AVL tree implementation"""\n\n def __init__(self):\n """Create a new AVL tree"""\n BinarySearchTree.__init__(self)\n\n def put(self, key, value):\n """Add new node"""\n if self._root:\n self._put(key, value, self._root)\n else:\n self._root = AVLTreeNode(key, value, 0)\n self._size = self._size + 1\n\n def _put(self, key, value, current_node):\n """Add a new node to the tree (helper function)"""\n if key < current_node.key:\n if current_node.get_child_left():\n self._put(key, value, current_node.child_left)\n else:\n current_node.child_left = AVLTreeNode(\n key, value, 0, parent=current_node\n )\n self.update_balance(current_node.child_left)\n else:\n if current_node.get_child_right():\n self._put(key, value, current_node.child_right)\n else:\n current_node.child_right = AVLTreeNode(\n key, value, 0, parent=current_node\n )\n self.update_balance(current_node.child_right)\n\n def update_balance(self, node):\n """Update the tree balance"""\n if node.balance_factor > 1 or node.balance_factor < -1:\n self.rebalance(node)\n return\n if node.parent:\n if node.is_child_left():\n node.parent.balance_factor += 1\n elif node.is_child_right():\n node.parent.balance_factor -= 1\n\n if node.parent.balance_factor != 0:\n self.update_balance(node.parent)\n\n def rebalance(self, node):\n """Rebalance the tree"""\n if node.balance_factor < 0:\n if node.child_right.balance_factor > 0:\n # Do an LR Rotation\n self.rotate_right(node.child_right)\n self.rotate_left(node)\n else:\n # single left\n self.rotate_left(node)\n elif node.balance_factor > 0:\n if node.child_left.balance_factor < 0:\n # Do an RL Rotation\n self.rotate_left(node.child_left)\n self.rotate_right(node)\n else:\n # single right\n self.rotate_right(node)\n\n def rotate_left(self, rotation_root):\n """Left rotation"""\n new_root = rotation_root.child_right\n rotation_root.child_right = new_root.child_left\n if new_root.child_left:\n new_root.child_left.parent = rotation_root\n new_root.parent = rotation_root.parent\n if rotation_root.is_root():\n self._root = new_root\n else:\n if rotation_root.is_child_left():\n rotation_root.parent.child_left = new_root\n else:\n rotation_root.parent.child_right = new_root\n new_root.child_left = rotation_root\n rotation_root.parent = new_root\n rotation_root.balance_factor = (\n rotation_root.balance_factor + 1 - min(new_root.balance_factor, 0)\n )\n new_root.balance_factor = (\n new_root.balance_factor + 1 + max(rotation_root.balance_factor, 0)\n )\n\n def rotate_right(self, rotation_root):\n """Right rotation"""\n new_root = rotation_root.child_left\n rotation_root.child_left = new_root.child_right\n if new_root.child_right:\n new_root.child_right.parent = rotation_root\n new_root.parent = rotation_root.parent\n if rotation_root.is_root():\n self._root = new_root\n else:\n if rotation_root.is_child_right():\n rotation_root.parent.child_right = new_root\n else:\n rotation_root.parent.child_left = new_root\n new_root.child_right = rotation_root\n rotation_root.parent = new_root\n rotation_root.balance_factor = (\n rotation_root.balance_factor - 1 - max(new_root.balance_factor, 0)\n )\n new_root.balance_factor = (\n new_root.balance_factor - 1 + min(rotation_root.balance_factor, 0)\n )\n',"src/lib/pythonds3/trees/binary_heap.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass BinaryHeap:\n """Minimal Binary Heap"""\n\n def __init__(self):\n """Create a heap"""\n self._heap = []\n\n def _perc_up(self, cur_idx):\n """Move a node up"""\n while (cur_idx - 1) // 2 >= 0:\n parent_idx = (cur_idx - 1) // 2\n if self._heap[cur_idx] < self._heap[parent_idx]:\n self._heap[cur_idx], self._heap[parent_idx] = (\n self._heap[parent_idx],\n self._heap[cur_idx],\n )\n cur_idx = parent_idx\n\n def _perc_down(self, cur_idx):\n """Move a node down"""\n while 2 * cur_idx + 1 < len(self._heap):\n min_child_idx = self._get_min_child(cur_idx)\n if self._heap[cur_idx] > self._heap[min_child_idx]:\n self._heap[cur_idx], self._heap[min_child_idx] = (\n self._heap[min_child_idx],\n self._heap[cur_idx],\n )\n else:\n return\n cur_idx = min_child_idx\n\n def _get_min_child(self, parent_idx):\n """Get a smaller child"""\n if 2 * parent_idx + 2 > len(self._heap) - 1:\n return 2 * parent_idx + 1\n if self._heap[2 * parent_idx + 1] < self._heap[2 * parent_idx + 2]:\n return 2 * parent_idx + 1\n return 2 * parent_idx + 2\n\n def heapify(self, not_a_heap, show_details=False):\n """Build a heap from any list"""\n self._heap = not_a_heap[:]\n cur_idx = len(self._heap) // 2 - 1\n while cur_idx >= 0:\n self._perc_down(cur_idx)\n cur_idx = cur_idx - 1\n if show_details:\n print(self._heap)\n\n def insert(self, item):\n """Add a new item"""\n self._heap.append(item)\n self._perc_up(len(self._heap) - 1)\n\n def delete(self):\n """Remove an item"""\n self._heap[0], self._heap[-1] = self._heap[-1], self._heap[0]\n result = self._heap.pop()\n self._perc_down(0)\n return result\n\n def is_empty(self):\n """Check if the heap is empty"""\n return not bool(self._heap)\n\n def __len__(self):\n """Get heap size"""\n return len(self._heap)\n\n def __str__(self):\n """Heap as a string"""\n return str(self._heap)\n\n def __contains__(self, item):\n """__contains__in method override"""\n return item in self._heap\n',"src/lib/pythonds3/trees/binary_search_tree.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005, 2010\nUpdated by Roman Yasinovskyy, 2017\n"""\n\n\nclass BinaryTreeNode:\n """Binary Tree Node class"""\n\n def __init__(self, key, value, left=None, right=None, parent=None):\n """Create new Tree Node"""\n self._key = key\n self._value = value\n self._child_left = left\n self._child_right = right\n self._parent = parent\n\n def get_child_left(self):\n """Return the node\'s left child"""\n return self._child_left\n\n def set_child_left(self, node):\n """Assign the node\'s left child"""\n self._child_left = node\n\n child_left = property(get_child_left, set_child_left)\n\n def get_child_right(self):\n """Return the node\'s right child"""\n return self._child_right\n\n def set_child_right(self, node):\n """Assign the node\'s right child"""\n self._child_right = node\n\n child_right = property(get_child_right, set_child_right)\n\n def get_parent(self):\n """Return the node\'s parent"""\n return self._parent\n\n def set_parent(self, node):\n """Assign the node\'s parent"""\n self._parent = node\n\n parent = property(get_parent, set_parent)\n\n def is_child_left(self):\n """Check if the node is a left child"""\n return self._parent and self._parent.child_left == self\n\n def is_child_right(self):\n """Check if the node is a right child"""\n return self._parent and self._parent.child_right == self\n\n def is_root(self):\n """Check if the node is a tree root"""\n return not self._parent\n\n def is_leaf(self):\n """Check if the node is a leaf"""\n return not (self._child_right or self._child_left)\n\n def has_a_child(self):\n """Check if the node has any child"""\n return self._child_right or self._child_left\n\n def has_children(self):\n """Check if the node has both children"""\n return self._child_right and self._child_left\n\n def get_key(self):\n """Get node key"""\n return self._key\n\n def set_key(self, key):\n """Set node key"""\n self._key = key\n\n key = property(get_key, set_key)\n\n def get_value(self):\n """Get node value"""\n return self._value\n\n def set_value(self, value):\n """Set node value"""\n self._value = value\n\n value = property(get_value, set_value)\n\n def replace_payload(self, key, value, left, right):\n """Change node payload"""\n self._key = key\n self._value = value\n self._child_left = left\n self._child_right = right\n if self.child_left:\n self._child_left.parent = self\n if self.child_right:\n self._child_right.parent = self\n\n def find_successor(self):\n """Find the node\'s successor"""\n successor = None\n if self._child_right:\n successor = self._child_right.find_min()\n else:\n if self._parent:\n if self.is_child_left():\n successor = self._parent\n else:\n self._parent.child_right = None\n successor = self._parent.find_successor()\n self._parent.child_right = self\n return successor\n\n def find_min(self):\n """Find the smallest node in the right subtree"""\n current = self\n while current.child_left:\n current = current.child_left\n return current\n\n def splice_out(self):\n """Splice out"""\n if self.is_leaf():\n if self.is_child_left():\n self._parent.child_left = None\n else:\n self._parent.child_right = None\n elif self.has_a_child():\n if self.child_left:\n if self.is_child_left():\n self._parent.child_left = self._child_left\n else:\n self._parent.child_right = self._child_left\n self._child_left.parent = self._parent\n else:\n if self.is_child_left():\n self._parent.child_left = self._child_right\n else:\n self._parent.child_right = self._child_right\n self._child_right.parent = self._parent\n\n def __iter__(self):\n """The standard inorder traversal of a binary tree"""\n if self:\n if self._child_left:\n for elem in self._child_left:\n yield elem\n yield self._key\n if self._child_right:\n for elem in self._child_right:\n yield elem\n\n\nclass BinarySearchTree:\n """Binary search tree implementation"""\n\n def __init__(self):\n self._root = None\n self._size = 0\n\n def __len__(self):\n """Tree size"""\n return self._size\n\n def size(self):\n """Tree size"""\n return self._size\n\n def __iter__(self):\n """Iterator"""\n return self._root.__iter__()\n\n def __getitem__(self, key):\n """[] getter operator override"""\n result = self.get(key)\n if result:\n return result\n raise KeyError("Error, key not in tree")\n\n def get_root(self):\n """Get tree root"""\n return self._root\n\n def set_root(self, node):\n """Set tree root"""\n self._root = node\n\n root = property(get_root, set_root)\n\n def get(self, key):\n """Retrieve a value by the key"""\n if self._root:\n result = self._get(key, self._root)\n if result:\n return result.value\n return None\n else:\n return None\n\n def _get(self, key, current_node):\n """Retrieve a value by the key (helper function)"""\n if not current_node:\n return None\n if current_node.key == key:\n return current_node\n elif key < current_node.key:\n return self._get(key, current_node.child_left)\n else:\n return self._get(key, current_node.child_right)\n\n def __setitem__(self, key, value):\n """[] setter operator override"""\n self.put(key, value)\n\n def put(self, key, value):\n """Add new node"""\n if self._root:\n self._put(key, value, self._root)\n else:\n self._root = BinaryTreeNode(key, value)\n self._size = self._size + 1\n\n def _put(self, key, value, current_node):\n """Add new node (helper function)"""\n if key < current_node.key:\n if current_node.child_left:\n self._put(key, value, current_node.child_left)\n else:\n current_node.child_left = BinaryTreeNode(\n key, value, parent=current_node\n )\n else:\n if current_node.child_right:\n self._put(key, value, current_node.child_right)\n else:\n current_node.child_right = BinaryTreeNode(\n key, value, parent=current_node\n )\n\n def __contains__(self, key):\n """in operator override"""\n return bool(self._get(key, self._root))\n\n def __delitem__(self, key):\n """del operator override"""\n self.delete(key)\n\n def delete(self, key):\n """Remove a node by its key"""\n if self._size > 1:\n node_to_remove = self._get(key, self._root)\n if node_to_remove:\n self._delete(node_to_remove)\n self._size = self._size - 1\n else:\n raise KeyError("Error, key not in tree")\n elif self._size == 1 and self._root.key == key:\n self._root = None\n self._size = self._size - 1\n else:\n raise KeyError("Error, key not in tree")\n\n def _delete(self, current_node):\n """Remove a node by its key (helper function)"""\n if current_node.is_leaf(): # removing a leaf\n if current_node == current_node.parent.child_left:\n current_node.parent.child_left = None\n else:\n current_node.parent.child_right = None\n elif current_node.has_children(): # removing a node with two children\n successor = current_node.find_successor()\n successor.splice_out()\n current_node.key = successor.key\n current_node.value = successor.value\n else: # removing a node with one child\n if current_node.get_child_left():\n if current_node.is_child_left():\n current_node.child_left.parent = current_node.parent\n current_node.parent.child_left = current_node.child_left\n elif current_node.is_child_right():\n current_node.child_left.parent = current_node.parent\n current_node.parent.child_right = current_node.child_left\n else:\n current_node.replace_payload(\n current_node.child_left.key,\n current_node.child_left.value,\n current_node.child_left.child_left,\n current_node.child_left.child_right,\n )\n else:\n if current_node.is_child_left():\n current_node.child_right.parent = current_node.parent\n current_node.parent.child_left = current_node.child_right\n elif current_node.is_child_right():\n current_node.child_right.parent = current_node.parent\n current_node.parent.child_right = current_node.child_right\n else:\n current_node.replace_payload(\n current_node.child_right.key,\n current_node.child_right.value,\n current_node.child_right.child_left,\n current_node.child_right.child_right,\n )\n\n def inorder(self):\n """In-order tree traversal"""\n self._inorder(self._root)\n\n def _inorder(self, tree):\n """In-order tree traversal (helper function)"""\n if tree:\n self._inorder(tree.child_left)\n print(tree.key, end=" ")\n self._inorder(tree.child_right)\n\n def postorder(self):\n """Post-order tree traversal"""\n self._postorder(self._root)\n\n def _postorder(self, tree):\n """Post-order tree traversal (helper function)"""\n if tree:\n self._postorder(tree.child_left)\n self._postorder(tree.child_right)\n print(tree.key, end=" ")\n\n def preorder(self):\n """Pre-order tree traversal"""\n self._preorder(self._root)\n\n def _preorder(self, tree):\n """Pre-order tree traversal (helper function)"""\n if tree:\n print(tree.key, end=" ")\n self._preorder(tree.child_left)\n self._preorder(tree.child_right)\n\n def clear(self):\n """Remove all nodes"""\n while self._root:\n self.delete(self._root.key)\n',"src/lib/pythonds3/trees/binary_tree.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\nimport operator\n\n\nclass BinaryTree:\n """\n A recursive implementation of Binary Tree\n Using links and Nodes approach.\n\n Modified to allow for trees to be constructed from other trees\n rather than always creating a new tree in the insert_feft or insert_right\n """\n\n def __init__(self, key):\n """Create new tree"""\n self._key = key\n self._child_left = None\n self._child_right = None\n\n def get_root_val(self):\n """Get root key value"""\n return self._key\n\n def set_root_val(self, key):\n """Set root key value"""\n self._key = key\n\n root = property(get_root_val, set_root_val)\n\n def get_child_left(self):\n """Get left child"""\n return self._child_left\n\n def set_child_left(self, node):\n """Set left child"""\n self._child_left = node\n\n child_left = property(get_child_left, set_child_left)\n\n def get_child_right(self):\n """Get right child"""\n return self._child_right\n\n def set_child_right(self, node):\n """Set right child"""\n self._child_right = node\n\n child_right = property(get_child_right, set_child_right)\n\n def is_leaf(self):\n """Check if a node is leaf"""\n return (not self._child_left) and (not self._child_right)\n\n def insert_left(self, new_node):\n """Insert left subtree"""\n if isinstance(new_node, BinaryTree):\n new_subtree = new_node\n else:\n new_subtree = BinaryTree(new_node)\n\n if self._child_left:\n new_subtree.set_child_left(self._child_left)\n\n self._child_left = new_subtree\n\n def insert_right(self, new_node):\n """Insert right subtree"""\n if isinstance(new_node, BinaryTree):\n new_subtree = new_node\n else:\n new_subtree = BinaryTree(new_node)\n\n if self._child_right:\n new_subtree.set_child_right(self._child_right)\n self._child_right = new_subtree\n\n def preorder(self):\n """Pre-order tree traversal"""\n print(self._key, end=" ")\n if self._child_left:\n self._child_left.preorder()\n if self._child_right:\n self._child_right.preorder()\n\n def inorder(self):\n """In-order tree traversal"""\n if self._child_left:\n self._child_left.inorder()\n print(self._key, end=" ")\n if self._child_right:\n self._child_right.inorder()\n\n def postorder(self):\n """Post-order tree traversal"""\n if self._child_left:\n self._child_left.postorder()\n if self._child_right:\n self._child_right.postorder()\n print(self._key, end=" ")\n\n def print_exp(self):\n """Print an expression"""\n if self._child_left:\n print("(", end=" ")\n self._child_left.print_exp()\n print(self._key, end=" ")\n if self._child_right:\n self._child_right.print_exp()\n print(")", end=" ")\n\n def postorder_eval(self):\n """Postorder evaluation"""\n operations = {\n "+": operator.add,\n "-": operator.sub,\n "*": operator.mul,\n "/": operator.truediv,\n }\n result_1 = None\n result_2 = None\n if self._child_left:\n result_1 = self._child_left.postorder_eval()\n if self._child_right:\n result_2 = self._child_right.postorder_eval()\n if result_1 and result_2:\n return operations[self._key](result_1, result_2)\n return self._key\n\n def height(self):\n """Height of a tree"""\n if not self._key:\n return -1\n if self._child_left:\n height_left = self._child_left.height()\n else:\n height_left = -1\n\n if self._child_right:\n height_right = self._child_right.height()\n else:\n height_right = -1\n\n return 1 + max(height_left, height_right)\n\n def __len__(self):\n """Size of a tree"""\n return self.size()\n\n def size(self):\n """Count nodes in a tree"""\n if not self._key:\n return 0\n if self._child_left:\n children_left = self._child_left.size()\n else:\n children_left = 0\n\n if self._child_right:\n children_right = self._child_right.size()\n else:\n children_right = 0\n\n return 1 + children_left + children_right\n',"src/lib/pythonds3/trees/priority_queue.py":'#!/usr/bin/env python3\n"""\nBradley N. Miller, David L. Ranum\nProblem Solving with Algorithms and Data Structures using Python\nCopyright 2005\nUpdated by Roman Yasinovskyy, 2017\n"""\n\nfrom pythonds3.trees.binary_heap import BinaryHeap\n\n\nclass PriorityQueue(BinaryHeap):\n """\n This implementation of binary heap takes (key, value) pairs where key signifies priority\n We will assume that the keys are all comparable.\n """\n\n def change_priority(self, new_priority, value):\n """Change the priority"""\n key_to_move = 0\n for i in range(len(self._heap)):\n if self._heap[i][1] == value:\n key_to_move = i\n break\n if key_to_move > -1:\n self._heap[key_to_move] = (new_priority, self._heap[key_to_move][1])\n self._perc_up(key_to_move)\n',"src/lib/pythoned/__init__.py":"","src/lib/pythoned/arboles/__init__.py":"\n\n\nfrom .avl import ArbolAVL\nfrom .abb import ArbolBinarioBusqueda\nfrom .monticuloBinario import MonticuloBinario\n\n\n","src/lib/pythoned/arboles/abb.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n#\n#abb.py\n\nclass ArbolBinarioBusqueda:\n\n def __init__(self):\n self.raiz = None\n self.tamano = 0\n\n def agregar(self,clave,valor):\n if self.raiz:\n self._agregar(clave,valor,self.raiz)\n else:\n self.raiz = NodoArbol(clave,valor)\n self.tamano = self.tamano + 1\n\n def _agregar(self,clave,valor,nodoActual):\n if clave < nodoActual.clave:\n if nodoActual.tieneHijoIzquierdo():\n self._agregar(clave,valor,nodoActual.hijoIzquierdo)\n else:\n nodoActual.hijoIzquierdo = NodoArbol(clave,valor,padre=nodoActual)\n else:\n if nodoActual.tieneHijoDerecho():\n self._agregar(clave,valor,nodoActual.hijoDerecho)\n else:\n nodoActual.hijoDerecho = NodoArbol(clave,valor,padre=nodoActual)\n \n def __setitem__(self,c,v):\n self.agregar(c,v)\n\n def obtener(self,clave):\n if self.raiz:\n res = self._obtener(clave,self.raiz)\n if res:\n return res.cargaUtil\n else:\n return None\n else:\n return None\n\n def _obtener(self,clave,nodoActual):\n \tif not nodoActual:\n \t return None\n \telif nodoActual.clave == clave:\n \t return nodoActual\n \telif clave < nodoActual.clave:\n \t return self._obtener(clave,nodoActual.hijoIzquierdo)\n \telse:\n \t return self._obtener(clave,nodoActual.hijoDerecho) \n\n def __getitem__(self,clave):\n res = self.obtener(clave) \n if res:\n return res\n else:\n raise KeyError('Error, la clave no está en el árbol')\n\n def __contains__(self,clave):\n \tif self._obtener(clave,self.raiz):\n \t return True\n \telse:\n \t return False\n \n def longitud(self):\n return self.tamano\n\n def __len__(self):\n return self.tamano\n\n def __iter__(self):\n return self.raiz.__iter__()\n\n def eliminar(self,clave):\n if self.tamano > 1:\n nodoAEliminar = self._obtener(clave,self.raiz)\n \t if nodoAEliminar:\n \t self.remover(nodoAEliminar)\n \t self.tamano = self.tamano-1\n \t else:\n \t raise KeyError('Error, la clave no está en el árbol')\n elif self.tamano == 1 and self.raiz.clave == clave:\n \t self.raiz = None\n \t self.tamano = self.tamano - 1\n else:\n \t raise KeyError('Error, la clave no está en el árbol')\n\n def __delitem__(self,clave):\n self.eliminar(clave)\n\n def remover(self,nodoActual):\n if nodoActual.esHoja(): #hoja\n if nodoActual == nodoActual.padre.hijoIzquierdo:\n nodoActual.padre.hijoIzquierdo = None\n else:\n nodoActual.padre.hijoDerecho = None\n elif nodoActual.tieneAmbosHijos(): #interior\n suc = nodoActual.encontrarSucesor()\n suc.empalmar()\n nodoActual.clave = suc.clave\n nodoActual.cargaUtil = suc.cargaUtil\n\n else: # este nodo tiene un (1) hijo\n if nodoActual.tieneHijoIzquierdo():\n if nodoActual.esHijoIzquierdo():\n nodoActual.hijoIzquierdo.padre = nodoActual.padre\n nodoActual.padre.hijoIzquierdo = nodoActual.hijoIzquierdo\n elif nodoActual.esHijoDerecho():\n nodoActual.hijoIzquierdo.padre = nodoActual.padre\n nodoActual.padre.hijoDerecho = nodoActual.hijoIzquierdo\n else:\n nodoActual.reemplazarDatoDeNodo(nodoActual.hijoIzquierdo.clave, nodoActual.hijoIzquierdo.cargaUtil, nodoActual.hijoIzquierdo.hijoIzquierdo, nodoActual.hijoIzquierdo.hijoDerecho)\n else:\n if nodoActual.esHijoIzquierdo():\n nodoActual.hijoDerecho.padre = nodoActual.padre\n nodoActual.padre.hijoIzquierdo = nodoActual.hijoDerecho\n elif nodoActual.esHijoDerecho():\n nodoActual.hijoDerecho.padre = nodoActual.padre\n nodoActual.padre.hijoDerecho = nodoActual.hijoDerecho\n else:\n nodoActual.reemplazarDatoDeNodo(nodoActual.hijoDerecho.clave, nodoActual.hijoDerecho.cargaUtil, nodoActual.hijoDerecho.hijoIzquierdo, nodoActual.hijoDerecho.hijoDerecho)\n\n def inorden(self):\n self._inorden(self.raiz)\n\n def _inorden(self,arbol):\n if arbol != None:\n self._inorden(arbol.hijoIzquierdo)\n print(arbol.clave)\n self._inorden(arbol.hijoDerecho)\n\n def postorden(self):\n self._postorden(self.raiz)\n\n def _postorden(self, arbol):\n if arbol:\n self._postorden(arbol.hijoDerecho)\n self._postorden(arbol.hijoIzquierdo)\n print(arbol.clave) \n\n def preorden(self):\n self._preorden(self,self.raiz)\n\n def _preorden(self,arbol):\n if arbol:\n print(arbol.clave) \n self._preorden(arbol.hijoIzquierdo)\n self._preorden(arbol.hijoDerecho)\n\n\nclass NodoArbol:\n def __init__(self,clave,valor,izquierdo=None,derecho=None,padre=None):\n self.clave = clave\n self.cargaUtil = valor\n self.hijoIzquierdo = izquierdo\n self.hijoDerecho = derecho\n self.padre = padre\n self.factorEquilibrio = 0\n\n def tieneHijoIzquierdo(self):\n return self.hijoIzquierdo\n \n def tieneHijoDerecho(self):\n return self.hijoDerecho\n\n def esHijoIzquierdo(self):\n return self.padre and self.padre.hijoIzquierdo == self\n \n def esHijoDerecho(self):\n return self.padre and self.padre.hijoDerecho == self\n\n def esRaiz(self):\n return not self.padre\n\n def esHoja(self):\n return not (self.hijoDerecho or self.hijoIzquierdo)\n\n def tieneAlgunHijo(self):\n return self.hijoDerecho or self.hijoIzquierdo\n\n def tieneAmbosHijos(self):\n return self.hijoDerecho and self.hijoIzquierdo\n\n def reemplazarDatoDeNodo(self,clave,valor,hizq,hder):\n self.clave = clave\n self.cargaUtil = valor\n self.hijoIzquierdo = hizq\n self.hijoDerecho = hder\n if self.tieneHijoIzquierdo():\n self.hijoIzquierdo.padre = self\n if self.tieneHijoDerecho():\n self.hijoDerecho.padre = self \n\n def encontrarSucesor(self):\n suc = None\n if self.tieneHijoDerecho():\n suc = self.hijoDerecho.encontrarMin()\n else:\n if self.padre:\n if self.esHijoIzquierdo():\n suc = self.padre\n else:\n self.padre.hijoDerecho = None\n suc = self.padre.encontrarSucesor()\n self.padre.hijoDerecho = self\n return suc\n\n def empalmar(self):\n if self.esHoja():\n if self.esHijoIzquierdo():\n self.padre.hijoIzquierdo = None\n else:\n self.padre.hijoDerecho = None\n elif self.tieneAlgunHijo():\n if self.tieneHijoIzquierdo():\n if self.esHijoIzquierdo():\n self.padre.hijoIzquierdo = self.hijoIzquierdo\n else:\n self.padre.hijoDerecho = self.hijoIzquierdo\n self.hijoIzquierdo.padre = self.padre\n else:\n if self.esHijoIzquierdo():\n self.padre.hijoIzquierdo = self.hijoDerecho\n else:\n self.padre.hijoDerecho = self.hijoDerecho\n self.hijoDerecho.padre = self.padre\n\n def encontrarMin(self):\n actual = self\n while actual.tieneHijoIzquierdo():\n actual = actual.hijoIzquierdo\n return actual\n\n def __iter__(self):\n if self:\n \t if self.tieneHijoIzquierdo():\n \t for elem in self.hijoIzquierdo:\n \t\t yield elem\n yield self.clave\n \t if self.tieneHijoDerecho():\n for elem in self.hijoDerecho:\n \t\t yield elem\n","src/lib/pythoned/arboles/arbolBinario.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n# \n#arbolBinario.py\n\nclass ArbolBinario:\n def __init__(self,objetoRaiz):\n self.clave = objetoRaiz\n self.hijoIzquierdo = None\n self.hijoDerecho = None\n \n def insertarIzquierdo(self,nuevoNodo):\n if self.hijoIzquierdo == None:\n self.hijoIzquierdo = ArbolBinario(nuevoNodo)\n else: \n t = ArbolBinario(nuevoNodo)\n t.hijoIzquierdo = self.hijoIzquierdo\n self.hijoIzquierdo = t\n\n def insertarDerecho(self,nuevoNodo):\n if self.hijoDerecho == None:\n self.hijoDerecho = ArbolBinario(nuevoNodo)\n else:\n t = ArbolBinario(nuevoNodo)\n t.hijoDerecho = self.hijoDerecho\n self.hijoDerecho = t\n\n def esHoja(self):\n return ((not self.hijoIzquierdo) and (not self.hijoDerecho))\n\n def obtenerHijoDerecho(self):\n return self.hijoDerecho\n \n def obtenerHijoIzquierdo(self):\n return self.hijoIzquierdo\n \n def asignarValorRaiz(self,obj):\n self.clave = obj\n\n def obtenerValorRaiz(self):\n return self.clave\n\n def inorden(self):\n if self.hijoIzquierdo:\n self.hijoIzquierdo.inorden()\n print(self.clave)\n if self.hijoDerecho:\n self.hijoDerecho.inorden()\n\n def postorden(self):\n if self.hijoIzquierdo:\n self.hijoIzquierdo.postorden()\n if self.hijoDerecho:\n self.hijoDerecho.postorden()\n print(self.clave)\n\n def preorden(self):\n print(self.clave)\n if self.hijoIzquierdo:\n self.hijoIzquierdo.preorden()\n if self.hijoDerecho:\n self.hijoDerecho.preorden()\n\n def imprimirExpresion(self):\n if self.hijoIzquierdo:\n print('(', end=' ')\n self.hijoIzquierdo.imprimirExpresion()\n print(self.clave, end=' ')\n if self.hijoDerecho:\n self.hijoDerecho.imprimirExpresion()\n print(')', end=' ')\n\n def evalPostorden(self):\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if self.hijoIzquierdo:\n res1 = self.hijoIzquierdo.evalPostorden() #// \\label{peleft}\n if self.hijoDerecho:\n res2 = self.hijoDerecho.evalPostorden() #// \\label{peright}\n if res1 and res2:\n return opers[self.clave](res1,res2) #// \\label{peeval}\n else:\n return self.clave\n\ndef inorden(arbol):\n if arbol != None:\n inorden(arbol.obtenerHijoIzquierdo())\n print(arbol.obtenerValorRaiz())\n inorden(arbol.obtenerHijoDerecho())\n\ndef imprimirExpresion(arbol):\n if arbol.hijoIzquierdo:\n print('(', end=' ')\n imprimirExpresion(arbol.obtenerHijoIzquierdo())\n print(arbol.obtenerValorRaiz(), end=' ')\n if arbol.hijoDerecho:\n imprimirExpresion(arbol.obtenerHijoDerecho())\n print(')', end=' ') \n\ndef imprimirExpresion(arbol):\n valorCadena = \"\"\n if arbol:\n valorCadena = '(' + imprimirExpresion(arbol.obtenerHijoIzquierdo())\n valorCadena = valorCadena + str(arbol.obtenerValorRaiz())\n valorCadena = valorCadena + imprimirExpresion(arbol.obtenerHijoDerecho())+')'\n return valorCadena\n\ndef evalPostorden(arbol):\n operadores = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\n res1 = None\n res2 = None\n if arbol:\n res1 = evalPostorden(arbol.obtenerHijoIzquierdo()) #// \\label{peleft}\n res2 = evalPostorden(arbol.obtenerHijoDerecho()) #// \\label{peright}\n if res1 and res2:\n return operadores[arbol.obtenerValorRaiz()](res1,res2) #// \\label{peeval}\n else:\n return arbol.obtenerValorRaiz()\n\ndef altura(arbol):\n if arbol == None:\n return -1\n else:\n return 1 + max(altura(arbol.hijoIzquierdo),altura(arbol.hijoDerecho))\n\nt = ArbolBinario(7)\nt.insertarIzquierdo(3)\nt.insertarDerecho(9)\ninorden(t)\nimport operator\nx = ArbolBinario('*')\nx.insertarIzquierdo('+')\nl = x.obtenerHijoIzquierdo()\nl.insertarIzquierdo(4)\nl.insertarDerecho(5)\nx.insertarDerecho(7)\nprint(imprimirExpresion(x))\nprint(evalPostorden(x))\nprint(altura(x))\n","src/lib/pythoned/arboles/avl.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n#\n#avl.py\n\nfrom .abb import ArbolBinarioBusqueda, NodoArbol\n\nclass ArbolAVL(ArbolBinarioBusqueda):\n\n def _agregar(self,clave,valor,nodoActual):\n \tif clave < nodoActual.clave:\n \t if nodoActual.tieneHijoIzquierdo():\n \t\tself._agregar(clave,valor,nodoActual.hijoIzquierdo)\n \t else:\n \t\tnodoActual.hijoIzquierdo = NodoArbol(clave,valor,padre=nodoActual)\n \t\tself.actualizarEquilibrio(nodoActual.hijoIzquierdo)\n \telse:\n \t if nodoActual.tieneHijoDerecho():\n \t\tself._agregar(clave,valor,nodoActual.hijoDerecho)\n \t else:\n \t\tnodoActual.hijoDerecho = NodoArbol(clave,valor,padre=nodoActual)\n \t\tself.actualizarEquilibrio(nodoActual.hijoDerecho)\n\n def actualizarEquilibrio(self,nodo):\n \tif nodo.factorEquilibrio > 1 or nodo.factorEquilibrio < -1:\n \t self.reequilibrar(nodo) \n \t return\n \tif nodo.padre != None:\n \t if nodo.esHijoIzquierdo():\n \t\t nodo.padre.factorEquilibrio += 1\n \t elif nodo.esHijoDerecho():\n \t\t nodo.padre.factorEquilibrio -= 1\n\n \t if nodo.padre.factorEquilibrio != 0:\n \t\t self.actualizarEquilibrio(nodo.padre)\n\n def reequilibrar(self,nodo):\n if nodo.factorEquilibrio < 0:\n\t if nodo.hijoDerecho.factorEquilibrio > 0:\n\t self.rotarDerecha(nodo.hijoDerecho)\n\t self.rotarIzquierda(nodo)\n\t else:\n\t self.rotarIzquierda(nodo)\n elif nodo.factorEquilibrio > 0:\n\t if nodo.hijoIzquierdo.factorEquilibrio < 0:\n\t self.rotarIzquierda(nodo.hijoIzquierdo)\n\t self.rotarDerecha(nodo)\n\t else:\n\t self.rotarDerecha(nodo)\n \n def rotarIzquierda(self,rotRaiz):\n \tnuevaRaiz = rotRaiz.hijoDerecho\n \trotRaiz.hijoDerecho = nuevaRaiz.hijoIzquierdo\n \tif nuevaRaiz.hijoIzquierdo != None:\n \t nuevaRaiz.hijoIzquierdo.padre = rotRaiz\n \tnuevaRaiz.padre = rotRaiz.padre\n \tif rotRaiz.esRaiz():\n \t self.raiz = nuevaRaiz\n \telse:\n \t if rotRaiz.esHijoIzquierdo():\n \t rotRaiz.padre.hijoIzquierdo = nuevaRaiz\n \t else:\n \t \trotRaiz.padre.hijoDerecho = nuevaRaiz\n \tnuevaRaiz.hijoIzquierdo = rotRaiz\n \trotRaiz.padre = nuevaRaiz\n \trotRaiz.factorEquilibrio = rotRaiz.factorEquilibrio + 1 - min(nuevaRaiz.factorEquilibrio, 0)\n \tnuevaRaiz.factorEquilibrio = nuevaRaiz.factorEquilibrio + 1 + max(rotRaiz.factorEquilibrio, 0)\n\n def rotarDerecha(self,rotRaiz):\n nuevaRaiz = rotRaiz.hijoIzquierdo\n rotRaiz.hijoIzquierdo = nuevaRaiz.hijoDerecho\n if nuevaRaiz.hijoDerecho != None:\n nuevaRaiz.hijoDerecho.padre = rotRaiz\n nuevaRaiz.padre = rotRaiz.padre\n if rotRaiz.esRaiz():\n self.raiz = nuevaRaiz\n else:\n if rotRaiz.esHijoDerecho():\n rotRaiz.padre.hijoDerecho = nuevaRaiz\n else:\n rotRaiz.padre.hijoIzquierdo = nuevaRaiz\n nuevaRaiz.hijoDerecho = rotRaiz\n rotRaiz.padre = nuevaRaiz\n rotRaiz.factorEquilibrio = rotRaiz.factorEquilibrio - 1 - max(nuevaRaiz.factorEquilibrio, 0)\n nuevaRaiz.factorEquilibrio = nuevaRaiz.factorEquilibrio - 1 + min(rotRaiz.factorEquilibrio, 0) \n\n","src/lib/pythoned/arboles/monticuloBinario.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n# \n#monticuloBinario.py\n\nclass MonticuloBinario:\n def __init__(self):\n self.listaMonticulo = [0]\n self.tamanoActual = 0\n\n def construirMonticulo(self,unaLista):\n i = len(unaLista) // 2\n self.tamanoActual = len(unaLista)\n self.listaMonticulo = [0] + unaLista[:]\n print(len(self.listaMonticulo), i)\n while (i > 0):\n print(self.listaMonticulo, i)\n self.infiltAbajo(i)\n i = i - 1\n print(self.listaMonticulo,i)\n \n def infiltAbajo(self,i):\n while (i * 2) <= self.tamanoActual:\n hm = self.hijoMin(i)\n if self.listaMonticulo[i] > self.listaMonticulo[hm]:\n tmp = self.listaMonticulo[i]\n self.listaMonticulo[i] = self.listaMonticulo[hm]\n self.listaMonticulo[hm] = tmp\n i = hm\n \n def hijoMin(self,i):\n if i * 2 + 1 > self.tamanoActual:\n return i * 2\n else:\n if self.listaMonticulo[i * 2] < self.listaMonticulo[i * 2 + 1]:\n return i * 2\n else:\n return i * 2 + 1\n\n def infiltArriba(self,i):\n while i // 2 > 0:\n if self.listaMonticulo[i] < self.listaMonticulo[i//2]:\n tmp = self.listaMonticulo[i // 2]\n self.listaMonticulo[i // 2] = self.listaMonticulo[i]\n self.listaMonticulo[i] = tmp\n i = i // 2\n \n def insertar(self,k):\n self.listaMonticulo.append(k)\n self.tamanoActual = self.tamanoActual + 1\n self.infiltArriba(self.tamanoActual)\n\n def eliminarMin(self):\n valorSacado = self.listaMonticulo[1]\n self.listaMonticulo[1] = self.listaMonticulo[self.tamanoActual]\n self.tamanoActual = self.tamanoActual - 1\n self.listaMonticulo.pop()\n self.infiltAbajo(1)\n return valorSacado\n \n def estaVacio(self):\n if tamanoActual == 0:\n return True\n else:\n return False\n","src/lib/pythoned/basicas/__init__.py":'\n#__all__ = ["pila"]\n\n\nfrom .pila import Pila\nfrom .cola import Cola\nfrom .coladoble import ColaDoble\n\n\n',"src/lib/pythoned/basicas/cola.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n#\n#cola.py\n\nclass Cola:\n def __init__(self):\n self.items = []\n\n def estaVacia(self):\n return self.items == []\n\n def agregar(self, item):\n self.items.insert(0,item)\n\n def avanzar(self):\n return self.items.pop()\n\n def tamano(self):\n return len(self.items)\n","src/lib/pythoned/basicas/coladoble.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n# \n#coladoble.py\n\nclass ColaDoble:\n def __init__(self):\n self.items = []\n\n def estaVacia(self):\n return self.items == []\n\n def agregarFrente(self, item):\n self.items.append(item)\n\n def agregarFinal(self, item):\n self.items.insert(0,item)\n\n def removerFrente(self):\n return self.items.pop()\n\n def removerFinal(self):\n return self.items.pop(0)\n\n def tamano(self):\n return len(self.items)\n","src/lib/pythoned/basicas/pila.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n# \n#pila.py\n\nclass Pila:\n def __init__(self):\n self.items = []\n\n def estaVacia(self):\n return self.items == []\n\n def incluir(self, item):\n self.items.append(item)\n\n def extraer(self):\n return self.items.pop()\n\n def inspeccionar(self):\n return self.items[len(self.items)-1]\n\n def tamano(self):\n return len(self.items)\n","src/lib/pythoned/grafos/__init__.py":"\n\nfrom .grafoAdy import Grafo\nfrom .grafoAdy import Vertice\nfrom .colaPrioridad import ColaPrioridad\n","src/lib/pythoned/grafos/colaPrioridad.py":"# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n# \n#colaPrioridad.py\n\nclass ColaPrioridad:\n def __init__(self):\n self.arregloMonticulo = [(0,0)]\n self.tamanoActual = 0\n\n def construirMonticulo(self,unaLista):\n self.tamanoActual = len(unaLista)\n self.arregloMonticulo = [(0,0)]\n for i in unaLista:\n self.arregloMonticulo.append(i)\n i = len(unaLista) // 2 \n while (i > 0):\n self.infiltAbajo(i)\n i = i - 1\n \n def infiltAbajo(self,i):\n while (i * 2) <= self.tamanoActual:\n hm = self.hijoMin(i)\n if self.arregloMonticulo[i][0] > self.arregloMonticulo[hm][0]:\n tmp = self.arregloMonticulo[i]\n self.arregloMonticulo[i] = self.arregloMonticulo[hm]\n self.arregloMonticulo[hm] = tmp\n i = hm\n \n def hijoMin(self,i):\n if i*2 > self.tamanoActual:\n return -1\n else:\n if i*2 + 1 > self.tamanoActual:\n return i*2\n else:\n if self.arregloMonticulo[i*2][0] < self.arregloMonticulo[i*2+1][0]:\n return i*2\n else:\n return i*2+1\n\n def infiltArriba(self,i):\n while i // 2 > 0:\n if self.arregloMonticulo[i][0] < self.arregloMonticulo[i//2][0]:\n tmp = self.arregloMonticulo[i//2]\n self.arregloMonticulo[i//2] = self.arregloMonticulo[i]\n self.arregloMonticulo[i] = tmp\n i = i//2\n \n def insertar(self,k):\n self.arregloMonticulo.append(k)\n self.tamanoActual = self.tamanoActual + 1\n self.infiltArriba(self.tamanoActual)\n\n def eliminarMin(self):\n valorSacado = self.arregloMonticulo[1][1]\n self.arregloMonticulo[1] = self.arregloMonticulo[self.tamanoActual]\n self.tamanoActual = self.tamanoActual - 1\n self.arregloMonticulo.pop()\n self.infiltAbajo(1)\n return valorSacado\n \n def estaVacia(self):\n if self.tamanoActual == 0:\n return True\n else:\n return False\n\n def decrementarClave(self,valor,nuevo):\n hecho = False\n i = 1\n miClave = 0\n while not hecho and i <= self.tamanoActual:\n if self.arregloMonticulo[i][1] == valor:\n hecho = True\n miClave = i\n else:\n i = i + 1\n if miClave > 0:\n self.arregloMonticulo[miClave] = (nuevo,self.arregloMonticulo[miClave][1])\n self.infiltArriba(miClave)\n \n def __contains__(self,vertice):\n for pareja in self.arregloMonticulo:\n if pareja[1] == vertice:\n return True\n return False \n\n","src/lib/pythoned/grafos/grafoAdy.py":'# Bradley N. Miller, David L. Ranum\n# Solución de problemas con algoritmos y estructuras de datos usando Python\n# Copyright 2014\n#\n#grafoAdy.py\n\n\nimport sys\n\nclass Grafo:\n def __init__(self):\n self.listaVertices = {}\n self.numVertices = 0\n \n def agregarVertice(self,clave):\n self.numVertices = self.numVertices + 1\n nuevoVertice = Vertice(clave)\n self.listaVertices[clave] = nuevoVertice\n return nuevoVertice\n \n def obtenerVertice(self,n):\n if n in self.listaVertices:\n return self.listaVertices[n]\n else:\n return None\n\n def __contains__(self,n):\n return n in self.listaVertices\n \n def agregarArista(self,de,a,costo=0):\n if de not in self.listaVertices:\n nv = self.agregarVertice(de)\n if a not in self.listaVertices:\n nv = self.agregarVertice(a)\n self.listaVertices[de].agregarVecino(self.listaVertices[a],costo)\n \n def obtenerVertices(self):\n return list(self.listaVertices.keys())\n \n def __iter__(self):\n return iter(self.listaVertices.values())\n \nclass Vertice:\n def __init__(self,clave):\n self.id = clave\n self.conectadoA = {}\n self.color = \'blanco\'\n self.dist = sys.maxsize\n self.predecesor = None\n self.desc = 0\n self.fin = 0\n\n # def __lt__(self,o):\n # return self.id < o.id\n \n def agregarVecino(self,vecino,ponderacion=0):\n self.conectadoA[vecino] = ponderacion\n \n def asignarColor(self,color):\n self.color = color\n \n def asignarDistancia(self,d):\n self.dist = d\n\n def asignarPredecesor(self,p):\n self.predecesor = p\n\n def asignarDescubrimiento(self,tiempoDescubrimiento):\n self.desc = tiempoDescubrimiento\n \n def asignarFinalizacion(self,tiempoFinalizacion):\n self.fin = tiempoFinalizacion\n \n def obtenerFinalizacion(self):\n return self.fin\n \n def obtenerDescubrimiento(self):\n return self.desc\n \n def obtenerPredecesor(self):\n return self.predecesor\n \n def obtenerDistancia(self):\n return self.dist\n \n def obtenerColor(self):\n return self.color\n \n def obtenerConexiones(self):\n return self.conectadoA.keys()\n \n def obtenerPonderacion(self,vecino):\n return self.conectadoA[vecino]\n \n def __str__(self):\n return str(self.id) + ":color " + self.color + ":desc " + str(self.desc) + ":fin " + str(self.fin) + ":distancia " + str(self.dist) + ":predecesor \\n\\t[" + str(self.predecesor)+ "]\\n"\n \n def obtenerId(self):\n return self.id\n',"src/lib/quopri.py":'import _sk_fail; _sk_fail._("quopri")\n',"src/lib/random.py":"from _random import *\nfrom math import floor as _floor, isfinite as _isfinite\nfrom itertools import accumulate as _accumulate, repeat as _repeat\nfrom bisect import bisect as _bisect\n\ndef choices(population, weights=None, *, cum_weights=None, k=1):\n '''Return a k sized list of population elements chosen with replacement.\n\n If the relative weights or cumulative weights are not specified,\n the selections are made with equal probability.\n\n '''\n n = len(population)\n if cum_weights is None:\n if weights is None:\n floor = _floor\n n += 0.0 # convert to float for a small speed improvement\n return [population[floor(random() * n)] for i in _repeat(None, k)]\n try:\n cum_weights = list(_accumulate(weights))\n except TypeError:\n if not isinstance(weights, int):\n raise\n k = weights\n raise TypeError(\n 'The number of choices must be a keyword argument: k=' + k\n )\n elif weights is not None:\n raise TypeError('Cannot specify both weights and cumulative weights')\n if len(cum_weights) != n:\n raise ValueError('The number of weights does not match the population')\n total = cum_weights[-1] + 0.0 # convert to float\n if total <= 0.0:\n raise ValueError('Total of weights must be greater than zero')\n if not _isfinite(total):\n raise ValueError('Total of weights must be finite')\n bisect = _bisect\n hi = n - 1\n return [population[bisect(cum_weights, random() * total, 0, hi)]\n for i in _repeat(None, k)]","src/lib/repr.py":'import _sk_fail; _sk_fail._("repr")\n',"src/lib/requests.py":'# most restricted version\n"""\nThis solution works in runestone - however it is much more limited.\nAn error does not occur in the same way in the textbook as it does\nfor the command line. Since HTTPError is not currently available in\nRunestone, I had to change the exception.\nDecode and Encode are not available in Runestone, so there might be\nissues with reponses.\nDoes not use the status attribute for urlopen, would be nice to have\nthat back.\nDoes not work on regular web pages (like google or the michigan daily) because of cross-site scripting limits.\n"""\nfrom urllib.request import urlopen\nimport json\n\nclass Response:\n def __init__(self, data, url):\n self.text = data\n self.url = url\n\n def json(self):\n try:\n return json.loads(self.text)\n except:\n return {"error": "Response not interpretable as json. Try printing the .text attribute"}\n\n def __str__(self):\n return "".format(self.url)\n\n\nurl_subs = {" ": "+",\n "!": "%21",\n \'"\': "%22",\n "#": "%23",\n "$": "%24",\n "\'": "%27",\n "(": "%28",\n ")": "%29",\n "*": "%2A",\n "+": "%2B",\n ",": "%2C",\n "/": "%2F",\n ":": "%3A",\n ";": "%3B",\n "=": "%3D",\n "?": "%3F",\n "@": "%40",\n "[": "%5B",\n "]": "%5D",\n }\n\ndef _subst(s, substitutions=url_subs):\n res = ""\n for c in str(s):\n if c in substitutions:\n res += substitutions[c]\n else:\n res += c\n return res\n\n\ndef requestURL(baseurl, params={}):\n try:\n if len(params) == 0:\n return baseurl\n complete_url = baseurl + "?"\n pairs = ["{}={}".format(_subst(k), _subst(params[k])) for k in params]\n complete_url += "&".join(pairs)\n return complete_url\n except:\n return None\n\ndef get(baseurl, params={}):\n full_url = requestURL(baseurl, params)\n if not full_url:\n text_data = "

    invalid request

    "\n full_url = "Couldn’t generate a valid URL"\n else:\n data = urlopen(full_url)\n text_data = data.read().strip()\n if len(text_data) == 0:\n text_data = "Failed to retrieve that URL"\n return Response(text_data, full_url)',"src/lib/requests_with_caching.py":'import requests\nimport json\n\nPERMANENT_CACHE_FNAME = "permanent_cache.txt"\nTEMP_CACHE_FNAME = "this_page_cache.txt"\n\ndef _write_to_file(cache, fname):\n with open(fname, \'w\') as outfile:\n outfile.write(json.dumps(cache, indent=2))\n\ndef _read_from_file(fname):\n try:\n with open(fname, \'r\') as infile:\n res = infile.read()\n return json.loads(res)\n except:\n return {}\n\ndef add_to_cache(cache_file, cache_key, cache_value):\n temp_cache = _read_from_file(cache_file)\n temp_cache[cache_key] = cache_value\n _write_to_file(temp_cache, cache_file)\n\ndef clear_cache(cache_file=TEMP_CACHE_FNAME):\n _write_to_file({}, cache_file)\n\ndef make_cache_key(baseurl, params_d, private_keys=["api_key", "apikey"]):\n """Makes a long string representing the query.\n Alphabetize the keys from the params dictionary so we get the same order each time.\n Omit keys with private info."""\n alphabetized_keys = sorted(params_d.keys())\n res = []\n for k in alphabetized_keys:\n if k not in private_keys:\n res.append("{}-{}".format(k, params_d[k]))\n return baseurl + "_".join(res)\n\ndef get(baseurl, params={}, private_keys_to_ignore=["api_key", "apikey"], permanent_cache_file=PERMANENT_CACHE_FNAME, temp_cache_file=TEMP_CACHE_FNAME):\n full_url = requests.requestURL(baseurl, params)\n cache_key = make_cache_key(baseurl, params, private_keys_to_ignore)\n # Load the permanent and page-specific caches from files\n permanent_cache = _read_from_file(permanent_cache_file)\n temp_cache = _read_from_file(temp_cache_file)\n if cache_key in temp_cache:\n print("found in page-specific cache")\n # make a Response object containing text from the change, and the full_url that would have been fetched\n return requests.Response(temp_cache[cache_key], full_url)\n elif cache_key in permanent_cache:\n print("found in permanent_cache")\n # make a Response object containing text from the change, and the full_url that would have been fetched\n return requests.Response(permanent_cache[cache_key], full_url)\n else:\n print("new; adding to cache")\n # actually request it\n resp = requests.get(baseurl, params)\n # save it\n add_to_cache(temp_cache_file, cache_key, resp.text)\n return resp',"src/lib/rexec.py":'import _sk_fail; _sk_fail._("rexec")\n',"src/lib/rfc822.py":'import _sk_fail; _sk_fail._("rfc822")\n',"src/lib/rlcompleter.py":'import _sk_fail; _sk_fail._("rlcompleter")\n',"src/lib/robotparser.py":'import _sk_fail; _sk_fail._("robotparser")\n',"src/lib/runpy.py":'import _sk_fail; _sk_fail._("runpy")\n',"src/lib/sched.py":'import _sk_fail; _sk_fail._("sched")\n',"src/lib/sets.py":'import _sk_fail; _sk_fail._("sets")\n',"src/lib/sgmllib.py":'import _sk_fail; _sk_fail._("sgmllib")\n',"src/lib/sha.py":'import _sk_fail; _sk_fail._("sha")\n',"src/lib/shelve.py":'import _sk_fail; _sk_fail._("shelve")\n',"src/lib/shlex.py":'import _sk_fail; _sk_fail._("shlex")\n',"src/lib/shutil.py":'import _sk_fail; _sk_fail._("shutil")\n',"src/lib/site.py":'import _sk_fail; _sk_fail._("site")\n',"src/lib/smtpd.py":'import _sk_fail; _sk_fail._("smtpd")\n',"src/lib/smtplib.py":'import _sk_fail; _sk_fail._("smtplib")\n',"src/lib/sndhdr.py":'import _sk_fail; _sk_fail._("sndhdr")\n',"src/lib/socket.py":'import _sk_fail; _sk_fail._("socket")\n',"src/lib/sqlite3/__init__.py":'import _sk_fail; _sk_fail._("sqlite3")\n',"src/lib/sre.py":'import _sk_fail; _sk_fail._("sre")\n',"src/lib/sre_compile.py":'import _sk_fail; _sk_fail._("sre_compile")\n',"src/lib/sre_constants.py":'import _sk_fail; _sk_fail._("sre_constants")\n',"src/lib/sre_parse.py":'import _sk_fail; _sk_fail._("sre_parse")\n',"src/lib/ssl.py":'import _sk_fail; _sk_fail._("ssl")\n',"src/lib/stat.py":'import _sk_fail; _sk_fail._("stat")\n',"src/lib/statistics.py":"\"\"\"\nBasic statistics module.\n\nThis module provides functions for calculating statistics of data, including\naverages, variance, and standard deviation.\n\nCalculating averages\n--------------------\n\n================== =============================================\nFunction Description\n================== =============================================\nmean Arithmetic mean (average) of data.\nharmonic_mean Harmonic mean of data.\nmedian Median (middle value) of data.\nmedian_low Low median of data.\nmedian_high High median of data.\nmedian_grouped Median, or 50th percentile, of grouped data.\nmode Mode (most common value) of data.\n================== =============================================\n\nCalculate the arithmetic mean (\"the average\") of data:\n\n>>> mean([-1.0, 2.5, 3.25, 5.75])\n2.625\n\n\nCalculate the standard median of discrete data:\n\n>>> median([2, 3, 4, 5])\n3.5\n\n\nCalculate the median, or 50th percentile, of data grouped into class intervals\ncentred on the data values provided. E.g. if your data points are rounded to\nthe nearest whole number:\n\n>>> median_grouped([2, 2, 3, 3, 3, 4]) #doctest: +ELLIPSIS\n2.8333333333...\n\nThis should be interpreted in this way: you have two data points in the class\ninterval 1.5-2.5, three data points in the class interval 2.5-3.5, and one in\nthe class interval 3.5-4.5. The median of these data points is 2.8333...\n\n\nCalculating variability or spread\n---------------------------------\n\n================== =============================================\nFunction Description\n================== =============================================\npvariance Population variance of data.\nvariance Sample variance of data.\npstdev Population standard deviation of data.\nstdev Sample standard deviation of data.\n================== =============================================\n\nCalculate the standard deviation of sample data:\n\n>>> stdev([2.5, 3.25, 5.5, 11.25, 11.75]) #doctest: +ELLIPSIS\n4.38961843444...\n\nIf you have previously calculated the mean, you can pass it as the optional\nsecond argument to the four \"spread\" functions to avoid recalculating it:\n\n>>> data = [1, 2, 2, 4, 4, 4, 5, 6]\n>>> mu = mean(data)\n>>> pvariance(data, mu)\n2.5\n\n\nExceptions\n----------\n\nA single exception is defined: StatisticsError is a subclass of ValueError.\n\n\"\"\"\n\n__all__ = [ 'StatisticsError',\n 'pstdev', 'pvariance', 'stdev', 'variance',\n 'median', 'median_low', 'median_high', 'median_grouped',\n 'mean', 'mode', 'harmonic_mean',\n ]\n\nfrom collections import Counter\nfrom math import sqrt\n\ndef mean(data):\n return sum(data) / len(data)\n\ndef harmonic_mean(data):\n raise NotImplementedError\n\n\ndef median(data):\n _data = sorted(data)\n l = len(_data)\n if l % 2 == 0:\n _median = (_data[l//2] + _data[l//2-1]) / 2\n else:\n _median = _data[l//2]\n return _median\n\ndef median_low(data):\n _data = sorted(data)\n l = len(_data)\n if l % 2 == 0:\n _median = _data[l//2-1]\n else:\n _median = _data[l//2]\n return _median\n\n\ndef median_high(data):\n _data = sorted(data)\n l = len(_data)\n if l % 2 == 0:\n _median = _data[l//2]\n else:\n _median = _data[l//2]\n return _median\n\n\ndef median_grouped(data):\n return median(data)\n\ndef mode(data):\n counter = Counter(data)\n max_count = max(counter.values())\n _mode = [k for k,v in counter.items() if v == max_count]\n if len(_mode) > 1:\n raise ValueError(\"No Unique Mode, found {} equally common values\".format(len(_mode)))\n else:\n return _mode[0]\n\n\ndef variance(data):\n average=mean(data)\n _variance=0\n for d in data:\n _variance += ((average-d)**2)\n final_variance=_variance/len(data)\n return final_variance\n\ndef pvariance(data):\n average=mean(data)\n _variance=0\n for d in data:\n _variance += ((average-d)**2)\n final_variance=_variance/len(data)\n return final_variance\n\ndef variance(data):\n average=mean(data)\n _variance=0\n for d in data:\n _variance += ((average-d)**2)\n final_variance=_variance/(len(data) -1)\n return final_variance\n\ndef pstdev(data):\n return sqrt(pvariance(data))\n\ndef stdev(data):\n return sqrt(variance(data))\n\n","src/lib/statvfs.py":'import _sk_fail; _sk_fail._("statvfs")\n',"src/lib/stringold.py":'import _sk_fail; _sk_fail._("stringold")\n',"src/lib/stringprep.py":'import _sk_fail; _sk_fail._("stringprep")\n',"src/lib/struct.py":'import _sk_fail; _sk_fail._("struct")\n',"src/lib/subprocess.py":'import _sk_fail; _sk_fail._("subprocess")\n',"src/lib/sunau.py":'import _sk_fail; _sk_fail._("sunau")\n',"src/lib/sunaudio.py":'import _sk_fail; _sk_fail._("sunaudio")\n',"src/lib/symbol.py":'import _sk_fail; _sk_fail._("symbol")\n',"src/lib/symtable.py":'import _sk_fail; _sk_fail._("symtable")\n',"src/lib/tabnanny.py":'import _sk_fail; _sk_fail._("tabnanny")\n',"src/lib/tarfile.py":'import _sk_fail; _sk_fail._("tarfile")\n',"src/lib/telnetlib.py":'import _sk_fail; _sk_fail._("telnetlib")\n',"src/lib/tempfile.py":'import _sk_fail; _sk_fail._("tempfile")\n',"src/lib/test/__init__.py":"__author__ = 'bmiller'\n\ndef testEqual(actual, expected, places=5):\n if isinstance(expected,int):\n if actual == expected:\n print('Pass')\n return True\n elif isinstance(expected,float):\n if abs(actual-expected) < 10**(-places):\n print('Pass')\n return True\n else:\n if actual == expected:\n print('Pass')\n return True\n print('Test Failed: expected ' + str(expected) + ' but got ' + str(actual))\n return False\n\ndef testNotEqual(actual, expected):\n pass\n\n","src/lib/test/ann_module.py":"\n\n\"\"\"\nThe module for testing variable annotations.\nEmpty lines above are for good reason (testing for correct line numbers)\n\"\"\"\n\n# from typing import Optional\n# from functools import wraps\n\n__annotations__[1] = 2\n\nclass C:\n\n x = 5; #y: Optional['C'] = None\n\n# from typing import Tuple\nx: int = 5; y: str = x;# f: Tuple[int, int]\n\nclass M(type):\n\n __annotations__['123'] = 123\n o: type = object\n\n(pars): bool = True\n\nclass D(C):\n j: str = 'hi'; k: str= 'bye'\n\n# from types import new_class\n# h_class = new_class('H', (C,))\n# j_class = new_class('J')\n\nclass F():\n z: int = 5\n def __init__(self, x):\n pass\n\nclass Y(F):\n def __init__(self):\n super(F, self).__init__(123)\n\nclass Meta(type):\n def __new__(meta, name, bases, namespace):\n return super().__new__(meta, name, bases, namespace)\n\nclass S(metaclass = Meta):\n x: str = 'something'\n y: str = 'something else'\n\n# def foo(x: int = 10):\n# def bar(y: List[str]):\n# x: str = 'yes'\n# bar()\n\n# def dec(func):\n# @wraps(func)\n# def wrapper(*args, **kwargs):\n# return func(*args, **kwargs)\n# return wrapper\n","src/lib/test/ann_module2.py":'"""\nSome correct syntax for variable annotation here.\nMore examples are in test_grammar and test_parser.\n"""\n\n# from typing import no_type_check, ClassVar\n\ni: int = 1\nj: int\nx: float = i/10\n\ndef f():\n # class C: ...\n class C: pass\n return C()\n\nf().new_attr: object = object()\n\nclass C:\n def __init__(self, x: int) -> None:\n self.x = x\n\nc = C(5)\nc.new_attr: int = 10\n\n__annotations__ = {}\n\n\n# @no_type_check\n# class NTC:\n# def meth(self, param: complex) -> None:\n# ...\n\n# class CV:\n# var: ClassVar[\'CV\']\n\n# CV.var = CV()\n',"src/lib/test/ann_module3.py":'"""\nCorrect syntax for variable annotation that should fail at runtime\nin a certain manner. More examples are in test_grammar and test_parser.\n"""\n\ndef f_bad_ann():\n __annotations__[1] = 2\n\nclass C_OK:\n def __init__(self, x: int) -> None:\n self.x: no_such_name = x # This one is OK as proposed by Guido\n\nclass D_bad_ann:\n def __init__(self, x: int) -> None:\n sfel.y: int = 0\n\ndef g_bad_ann():\n no_such_name.attr: int = 0\n',"src/lib/test/bad_getattr.py":'x = 1\n\n__getattr__ = "Surprise!"\n__dir__ = "Surprise again!"\n',"src/lib/test/bad_getattr2.py":'def __getattr__():\n "Bad one"\n\nx = 1\n\ndef __dir__(bad_sig):\n return []\n',"src/lib/test/bad_getattr3.py":"def __getattr__(name):\n global __getattr__\n if name != 'delgetattr':\n raise AttributeError\n del __getattr__\n raise AttributeError\n","src/lib/test/decimaltestdata/__init__.py":'import _sk_fail; _sk_fail._("decimaltestdata")\n',"src/lib/test/good_getattr.py":"x = 1\n\ndef __dir__():\n return ['a', 'b', 'c']\n\ndef __getattr__(name):\n if name == \"yolo\":\n raise AttributeError(\"Deprecated, use whatever instead\")\n return f\"There is {name}\"\n\ny = 2\n","src/lib/test/test_support.py":'"""Supporting definitions for the Python regression tests."""\n\nif __name__ != \'test.test_support\':\n raise ImportError(\'test_support must be imported from the test package\')\n\nimport unittest\n\n\n# def run_unittest(*classes):\n# """Run tests from unittest.TestCase-derived classes."""\n# valid_types = (unittest.TestSuite, unittest.TestCase)\n# suite = unittest.TestSuite()\n# for cls in classes:\n# if isinstance(cls, str):\n# if cls in sys.modules:\n# suite.addTest(unittest.findTestCases(sys.modules[cls]))\n# else:\n# raise ValueError("str arguments must be keys in sys.modules")\n# elif isinstance(cls, valid_types):\n# suite.addTest(cls)\n# else:\n# suite.addTest(unittest.makeSuite(cls))\n# _run_suite(suite)\n\ndef run_unittest(*classes):\n """Run tests from unittest.TestCase-derived classes."""\n for cls in classes:\n print cls\n if issubclass(cls, unittest.TestCase):\n cls().main()\n else:\n print "Don\'t know what to do with ", cls\n',"src/lib/textwrap.py":"\"\"\"Text wrapping and filling.\n\"\"\"\n\n# Copyright (C) 1999-2001 Gregory P. Ward.\n# Copyright (C) 2002, 2003 Python Software Foundation.\n# Written by Greg Ward \n\nimport re, string\n\n__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten']\n\n# Hardcode the recognized whitespace characters to the US-ASCII\n# whitespace characters. The main reason for doing this is that\n# some Unicode spaces (like \\u00a0) are non-breaking whitespaces.\n_whitespace = '\\t\\n\\x0b\\x0c\\r '\n\nclass TextWrapper:\n \"\"\"\n Object for wrapping/filling text. The public interface consists of\n the wrap() and fill() methods; the other methods are just there for\n subclasses to override in order to tweak the default behaviour.\n If you want to completely replace the main wrapping algorithm,\n you'll probably have to override _wrap_chunks().\n Several instance attributes control various aspects of wrapping:\n width (default: 70)\n the maximum width of wrapped lines (unless break_long_words\n is false)\n initial_indent (default: \"\")\n string that will be prepended to the first line of wrapped\n output. Counts towards the line's width.\n subsequent_indent (default: \"\")\n string that will be prepended to all lines save the first\n of wrapped output; also counts towards each line's width.\n expand_tabs (default: true)\n Expand tabs in input text to spaces before further processing.\n Each tab will become 0 .. 'tabsize' spaces, depending on its position\n in its line. If false, each tab is treated as a single character.\n tabsize (default: 8)\n Expand tabs in input text to 0 .. 'tabsize' spaces, unless\n 'expand_tabs' is false.\n replace_whitespace (default: true)\n Replace all whitespace characters in the input text by spaces\n after tab expansion. Note that if expand_tabs is false and\n replace_whitespace is true, every tab will be converted to a\n single space!\n fix_sentence_endings (default: false)\n Ensure that sentence-ending punctuation is always followed\n by two spaces. Off by default because the algorithm is\n (unavoidably) imperfect.\n break_long_words (default: true)\n Break words longer than 'width'. If false, those words will not\n be broken, and some lines might be longer than 'width'.\n break_on_hyphens (default: true)\n Allow breaking hyphenated words. If true, wrapping will occur\n preferably on whitespaces and right after hyphens part of\n compound words.\n drop_whitespace (default: true)\n Drop leading and trailing whitespace from lines.\n max_lines (default: None)\n Truncate wrapped lines.\n placeholder (default: ' [...]')\n Append to the last line of truncated text.\n \"\"\"\n\n unicode_whitespace_trans = {}\n # uspace = ord(' ')\n uspace = ' '\n for x in _whitespace:\n # unicode_whitespace_trans[ord(x)] = uspace\n unicode_whitespace_trans[x] = uspace\n\n # This funky little regex is just the trick for splitting\n # text up into word-wrappable chunks. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!\n # (after stripping out empty strings).\n wordsep_re = re.compile(\n r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W]))') # hyphenated words\n em_dash = re.compile(r'(\\s+|' # any whitespace\n r'[^\\s\\w]*\\w+[^0-9\\W]-(?=\\w+[^0-9\\W])|' # hyphenated words\n r'(?!^)-{2,}(?=\\w))') # em-dash\n\n \n # This less funky little regex just split on recognized spaces. E.g.\n # \"Hello there -- you goof-ball, use the -b option!\"\n # splits into\n # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/\n wordsep_simple_re = re.compile(r'(\\s+)')\n\n\n # XXX this is not locale- or charset-aware -- string.lowercase\n # is US-ASCII only (and therefore English-only)\n sentence_end_re = re.compile(r'[a-z]' # lowercase letter\n r'[\\.\\!\\?]' # sentence-ending punct.\n r'[\\\"\\']?' # optional end-of-quote\n r'\\Z') # end of chunk\n sentence_end_re = r'[a-z][\\.\\!\\?][\\\"\\']?'\n\n def __init__(self,\n width=70,\n initial_indent=\"\",\n subsequent_indent=\"\",\n expand_tabs=True,\n replace_whitespace=True,\n fix_sentence_endings=False,\n break_long_words=True,\n drop_whitespace=True,\n break_on_hyphens=True,\n tabsize=8,\n max_lines=None,\n placeholder=' [...]'):\n self.width = width\n self.initial_indent = initial_indent\n self.subsequent_indent = subsequent_indent\n self.expand_tabs = expand_tabs\n self.replace_whitespace = replace_whitespace\n self.fix_sentence_endings = fix_sentence_endings\n self.break_long_words = break_long_words\n self.drop_whitespace = drop_whitespace\n self.break_on_hyphens = break_on_hyphens\n self.tabsize = tabsize\n self.max_lines = max_lines\n self.placeholder = placeholder\n\n\n # -- Private methods -----------------------------------------------\n # (possibly useful for subclasses to override)\n\n def _munge_whitespace(self, text):\n \"\"\"_munge_whitespace(text : string) -> string\n Munge whitespace in text: expand tabs and convert all other\n whitespace characters to spaces. Eg. \" foo\\\\tbar\\\\n\\\\nbaz\"\n becomes \" foo bar baz\".\n \"\"\"\n if self.expand_tabs:\n text = text.expandtabs(self.tabsize)\n if self.replace_whitespace:\n for key, val in self.unicode_whitespace_trans.items():\n text = text.replace(key, val)\n return text\n\n\n def _split(self, text):\n \"\"\"_split(text : string) -> [string]\n Split the text to wrap into indivisible chunks. Chunks are\n not quite the same as words; see _wrap_chunks() for full\n details. As an example, the text\n Look, goof-ball -- use the -b option!\n breaks into the following chunks:\n 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', 'option!'\n if break_on_hyphens is True, or in:\n 'Look,', ' ', 'goof-ball', ' ', '--', ' ',\n 'use', ' ', 'the', ' ', '-b', ' ', option!'\n otherwise.\n \"\"\"\n if self.break_on_hyphens is True:\n chunks = self.wordsep_re.split(text)\n if \"--\" in text:\n chunks = [item \n for sublist in [self.em_dash.split(chunk) for chunk in chunks] \n for item in sublist]\n else:\n chunks = self.wordsep_simple_re.split(text)\n chunks = [c for c in chunks if c]\n return chunks\n\n def _fix_sentence_endings(self, chunks):\n \"\"\"_fix_sentence_endings(chunks : [string])\n Correct for sentence endings buried in 'chunks'. Eg. when the\n original text contains \"... foo.\\\\nBar ...\", munge_whitespace()\n and split() will convert that to [..., \"foo.\", \" \", \"Bar\", ...]\n which has one too few spaces; this method simply changes the one\n space to two.\n \"\"\"\n i = 0\n # patsearch = self.sentence_end_re.search\n while i < len(chunks)-1:\n if chunks[i+1] == \" \" and re.search(self.sentence_end_re, chunks[i]) and chunks[i][-1] in \".!?\\\"\\'\":\n chunks[i+1] = \" \"\n i += 2\n else:\n i += 1\n\n def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):\n \"\"\"_handle_long_word(chunks : [string],\n cur_line : [string],\n cur_len : int, width : int)\n Handle a chunk of text (most likely a word, not whitespace) that\n is too long to fit in any line.\n \"\"\"\n # Figure out when indent is larger than the specified width, and make\n # sure at least one character is stripped off on every pass\n if width < 1:\n space_left = 1\n else:\n space_left = width - cur_len\n\n # If we're allowed to break long words, then do so: put as much\n # of the next chunk onto the current line as will fit.\n if self.break_long_words:\n cur_line.append(reversed_chunks[-1][:space_left])\n reversed_chunks[-1] = reversed_chunks[-1][space_left:]\n\n # Otherwise, we have to preserve the long word intact. Only add\n # it to the current line if there's nothing already there --\n # that minimizes how much we violate the width constraint.\n elif not cur_line:\n cur_line.append(reversed_chunks.pop())\n\n # If we're not allowed to break long words, and there's already\n # text on the current line, do nothing. Next time through the\n # main loop of _wrap_chunks(), we'll wind up here again, but\n # cur_len will be zero, so the next line will be entirely\n # devoted to the long word that we can't handle right now.\n\n def _wrap_chunks(self, chunks):\n \"\"\"_wrap_chunks(chunks : [string]) -> [string]\n Wrap a sequence of text chunks and return a list of lines of\n length 'self.width' or less. (If 'break_long_words' is false,\n some lines may be longer than this.) Chunks correspond roughly\n to words and the whitespace between them: each chunk is\n indivisible (modulo 'break_long_words'), but a line break can\n come between any two chunks. Chunks should not have internal\n whitespace; ie. a chunk is either all whitespace or a \"word\".\n Whitespace chunks will be removed from the beginning and end of\n lines, but apart from that whitespace is preserved.\n \"\"\"\n lines = []\n if self.width <= 0:\n raise ValueError(\"invalid width %r (must be > 0)\" % self.width)\n if self.max_lines is not None:\n if self.max_lines > 1:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n if len(indent) + len(self.placeholder.lstrip()) > self.width:\n raise ValueError(\"placeholder too large for max width\")\n\n # Arrange in reverse order so items can be efficiently popped\n # from a stack of chucks.\n chunks.reverse()\n\n while chunks:\n\n # Start the list of chunks that will make up the current line.\n # cur_len is just the length of all the chunks in cur_line.\n cur_line = []\n cur_len = 0\n\n # Figure out which static string will prefix this line.\n if lines:\n indent = self.subsequent_indent\n else:\n indent = self.initial_indent\n\n # Maximum width for this line.\n width = self.width - len(indent)\n\n # First chunk on line is whitespace -- drop it, unless this\n # is the very beginning of the text (ie. no lines started yet).\n if self.drop_whitespace and chunks[-1].strip() == '' and lines:\n del chunks[-1]\n\n while chunks:\n l = len(chunks[-1])\n\n # Can at least squeeze this chunk onto the current line.\n if cur_len + l <= width:\n cur_line.append(chunks.pop())\n cur_len += l\n\n # Nope, this line is full.\n else:\n break\n\n # The current line is full, and the next chunk is too big to\n # fit on *any* line (not just this one).\n if chunks and len(chunks[-1]) > width:\n self._handle_long_word(chunks, cur_line, cur_len, width)\n cur_len = sum(map(len, cur_line))\n\n # If the last chunk on this line is all whitespace, drop it.\n if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n\n if cur_line:\n if (self.max_lines is None or\n len(lines) + 1 < self.max_lines or\n (not chunks or\n self.drop_whitespace and\n len(chunks) == 1 and\n not chunks[0].strip()) and cur_len <= width):\n # Convert current line back to a string and store it in\n # list of all lines (return value).\n lines.append(indent + ''.join(cur_line))\n else:\n while cur_line:\n if (cur_line[-1].strip() and\n cur_len + len(self.placeholder) <= width):\n cur_line.append(self.placeholder)\n lines.append(indent + ''.join(cur_line))\n break\n cur_len -= len(cur_line[-1])\n del cur_line[-1]\n else:\n if lines:\n prev_line = lines[-1].rstrip()\n if (len(prev_line) + len(self.placeholder) <=\n self.width):\n lines[-1] = prev_line + self.placeholder\n break\n lines.append(indent + self.placeholder.lstrip())\n break\n\n return lines\n\n def _split_chunks(self, text):\n text = self._munge_whitespace(text)\n return self._split(text)\n\n # -- Public interface ----------------------------------------------\n\n def wrap(self, text):\n \"\"\"wrap(text : string) -> [string]\n Reformat the single paragraph in 'text' so it fits in lines of\n no more than 'self.width' columns, and return a list of wrapped\n lines. Tabs in 'text' are expanded with string.expandtabs(),\n and all other whitespace characters (including newline) are\n converted to space.\n \"\"\"\n chunks = self._split_chunks(text)\n if self.fix_sentence_endings:\n self._fix_sentence_endings(chunks)\n return self._wrap_chunks(chunks)\n\n def fill(self, text):\n \"\"\"fill(text : string) -> string\n Reformat the single paragraph in 'text' to fit in lines of no\n more than 'self.width' columns, and return a new string\n containing the entire wrapped paragraph.\n \"\"\"\n return \"\\n\".join(self.wrap(text))\n\n\n# -- Convenience interface ---------------------------------------------\n\ndef wrap(text, width=70, **kwargs):\n \"\"\"Wrap a single paragraph of text, returning a list of wrapped lines.\n Reformat the single paragraph in 'text' so it fits in lines of no\n more than 'width' columns, and return a list of wrapped lines. By\n default, tabs in 'text' are expanded with string.expandtabs(), and\n all other whitespace characters (including newline) are converted to\n space. See TextWrapper class for available keyword args to customize\n wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.wrap(text)\n\ndef fill(text, width=70, **kwargs):\n \"\"\"Fill a single paragraph of text, returning a new string.\n Reformat the single paragraph in 'text' to fit in lines of no more\n than 'width' columns, and return a new string containing the entire\n wrapped paragraph. As with wrap(), tabs are expanded and other\n whitespace characters converted to space. See TextWrapper class for\n available keyword args to customize wrapping behaviour.\n \"\"\"\n w = TextWrapper(width=width, **kwargs)\n return w.fill(text)\n\ndef shorten(text, width, **kwargs):\n \"\"\"Collapse and truncate the given text to fit in the given width.\n The text first has its whitespace collapsed. If it then fits in\n the *width*, it is returned as is. Otherwise, as many words\n as possible are joined and then the placeholder is appended::\n >>> textwrap.shorten(\"Hello world!\", width=12)\n 'Hello world!'\n >>> textwrap.shorten(\"Hello world!\", width=11)\n 'Hello [...]'\n \"\"\"\n w = TextWrapper(width=width, max_lines=1, **kwargs)\n return w.fill(' '.join(text.strip().split()))\n\n\n# -- Loosely related functionality -------------------------------------\n\n# _whitespace_only_re = re.compile('^[ \\t]+$', re.MULTILINE)\n# _leading_whitespace_re = re.compile('(^[ \\t]*)(?:[^ \\t\\n])', re.MULTILINE)\n\ndef dedent(text):\n \"\"\"Remove any common leading whitespace from every line in `text`.\n This can be used to make triple-quoted strings line up with the left\n edge of the display, while still presenting them in the source code\n in indented form.\n Note that tabs and spaces are both treated as whitespace, but they\n are not equal: the lines \" hello\" and \"\\\\thello\" are\n considered to have no common leading whitespace.\n Entirely blank lines are normalized to a newline character.\n \"\"\"\n # Look for the longest leading string of spaces and tabs common to\n # all lines.\n margin = None\n\n indents = re.findall(r'(^[ \\t]*)(?:[^ \\t\\n])',text, re.MULTILINE)\n for indent in indents:\n if margin is None:\n margin = indent\n\n # Current line more deeply indented than previous winner:\n # no change (previous winner is still on top).\n elif indent.startswith(margin):\n pass\n\n # Current line consistent with and no deeper than previous winner:\n # it's the new winner.\n elif margin.startswith(indent):\n margin = indent\n\n # Find the largest common whitespace between current line and previous\n # winner.\n else:\n for i, (x, y) in enumerate(zip(margin, indent)):\n if x != y:\n margin = margin[:i]\n break\n # sanity check (testing/debugging only)\n if 0 and margin:\n for line in text.split(\"\\n\"):\n assert not line or line.startswith(margin), \\\n \"line = %r, margin = %r\" % (line, margin)\n\n if margin:\n lines = [line[len(margin):] \n if line.strip()\n else line.strip() \n for line in text.split(\"\\n\")]\n text = \"\\n\".join(lines)\n return text\n\n\ndef indent(text, prefix, predicate=None):\n \"\"\"Adds 'prefix' to the beginning of selected lines in 'text'.\n If 'predicate' is provided, 'prefix' will only be added to the lines\n where 'predicate(line)' is True. If 'predicate' is not provided,\n it will default to adding 'prefix' to all non-empty lines that do not\n consist solely of whitespace characters.\n \"\"\"\n if predicate is None:\n def predicate(line):\n return line.strip()\n\n def prefixed_lines():\n for line in text.splitlines(True):\n yield (prefix + line if predicate(line) else line)\n return ''.join(prefixed_lines())\n\n\nif __name__ == \"__main__\":\n #print dedent(\"\\tfoo\\n\\tbar\")\n #print dedent(\" \\thello there\\n \\t how are you?\")\n print(dedent(\"Hello there.\\n This is indented.\"))","src/lib/this.py":'\nprint("""\nThe Zen of Python, by Tim Peters\n\nBeautiful is better than ugly.\nExplicit is better than implicit.\nSimple is better than complex.\nComplex is better than complicated.\nFlat is better than nested.\nSparse is better than dense.\nReadability counts.\nSpecial cases aren\'t special enough to break the rules.\nAlthough practicality beats purity.\nErrors should never pass silently.\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to guess.\nThere should be one-- and preferably only one --obvious way to do it.\nAlthough that way may not be obvious at first unless you\'re Dutch.\nNow is better than never.\nAlthough never is often better than *right* now.\nIf the implementation is hard to explain, it\'s a bad idea.\nIf the implementation is easy to explain, it may be a good idea.\nNamespaces are one honking great idea -- let\'s do more of those!\n"""\n )\n',"src/lib/threading.py":'import _sk_fail; _sk_fail._("threading")\n',"src/lib/timeit.py":'import _sk_fail; _sk_fail._("timeit")\n',"src/lib/toaiff.py":'import _sk_fail; _sk_fail._("toaiff")\n',"src/lib/trace.py":'import _sk_fail; _sk_fail._("trace")\n',"src/lib/traceback.py":'import _sk_fail; _sk_fail._("traceback")\n',"src/lib/tty.py":'import _sk_fail; _sk_fail._("tty")\n',"src/lib/types.py":'"""\nThis file was modified from CPython.\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\n"""\n"""Define names for all type symbols known in the standard interpreter.\nTypes that are part of optional modules (e.g. array) are not listed.\n"""\nimport sys\n\n# Iterators in Python aren\'t a matter of type but of protocol. A large\n# and changing number of builtin types implement *some* flavor of\n# iterator. Don\'t check the type! Use hasattr to check for both\n# "__iter__" and "next" attributes instead.\nMappingProxyType = type(type.__dict__)\nWrapperDescriptorType = type(object.__init__)\nMethodWrapperType = type(object().__str__)\nMethodDescriptorType = type(str.join)\nClassMethodDescriptorType = type(dict.__dict__[\'fromkeys\'])\n\nNoneType = type(None)\nTypeType = type\nObjectType = object\nIntType = int\ntry:\n LongType = long\nexcept: pass\nFloatType = float\nBooleanType = bool\ntry:\n ComplexType = complex\nexcept NameError:\n pass\nStringType = str\n\n# StringTypes is already outdated. Instead of writing "type(x) in\n# types.StringTypes", you should use "isinstance(x, basestring)". But\n# we keep around for compatibility with Python 2.2.\ntry:\n UnicodeType = unicode\n StringTypes = (StringType, UnicodeType)\nexcept NameError:\n StringTypes = (StringType,)\n\nBufferType = buffer\n\nTupleType = tuple\nListType = list\nDictType = DictionaryType = dict\n\ndef _f(): pass\nFunctionType = type(_f)\nLambdaType = type(lambda: None) # Same as FunctionType\n#CodeType = type(_f.func_code)\n\ndef _g():\n yield 1\nGeneratorType = type(_g())\n\nclass _C:\n def _m(self): pass\nClassType = type(_C)\nUnboundMethodType = type(_C._m) # Same as MethodType\n_x = _C()\nInstanceType = type(_x)\nMethodType = type(_x._m)\nBuiltinFunctionType = type(len)\nBuiltinMethodType = type([].append) # Same as BuiltinFunctionType\n\nModuleType = type(sys)\nFileType = file\ntry:\n XRangeType = xrange\nexcept NameError:\n pass\n\n# try:\n# raise TypeError\n# except TypeError:\n# tb = sys.exc_info()[2]\n# TracebackType = type(tb)\n# FrameType = type(tb.tb_frame)\n# del tb\n\nSliceType = slice\nEllipsisType = type(Ellipsis)\n\n# DictProxyType = type(TypeType.__dict__)\nNotImplementedType = type(NotImplemented)\n\n# For Jython, the following two types are identical\n# GetSetDescriptorType = type(FunctionType.func_code)\n# MemberDescriptorType = type(FunctionType.func_globals)\n\ndel sys, _f, _g, _C, _x # Not for export\n__all__ = list(n for n in globals() if n[:1] != \'_\')\n\nGenericAlias = type(type[int])',"src/lib/unittest/__init__.py":'__author__ = \'bmiller\'\n\'\'\'\nThis is the start of something that behaves like\nthe unittest module from cpython.\n\n\'\'\'\nimport re\n\nclass _AssertRaisesContext(object):\n """A context manager used to implement TestCase.assertRaises* methods."""\n def __init__(self, expected, test_case, expected_regex=None):\n self.test_case = test_case\n self.expected = expected\n self.exception = None\n if expected_regex is not None:\n expected_regex = re.compile(expected_regex)\n self.expected_regex = expected_regex\n\n def _is_subtype(self, expected, basetype):\n if isinstance(expected, tuple):\n return all(self._is_subtype(e, basetype) for e in expected)\n return isinstance(expected, type) and issubclass(expected, basetype)\n\n def handle(self, name, args, kwargs):\n """\n If args is empty, assertRaises is being used as a\n context manager, so return self.\n If args is not empty, call a callable passing positional and keyword\n arguments.\n """\n try:\n if not self._is_subtype(self.expected, BaseException):\n raise TypeError(\'%s() arg 1 must be an exception type or tuple of exception types\'.format(name))\n if not args:\n return self\n\n callable_obj = args[0]\n args = args[1:]\n with self:\n callable_obj(*args, **kwargs) \n\n finally:\n # bpo-23890: manually break a reference cycle\n self = None\n\n def __enter__(self):\n return self\n\n def __exit__(self, exc_type, exc_value, tb):\n res = True\n feedback = ""\n self.exception = exc_value\n try:\n act_exc = exc_type.__name__\n except AttributeError:\n act_exc = str(exc_type)\n try:\n exp_exc = self.expected.__name__\n except AttributeError:\n exp_exc = str(self.expected)\n\n if exc_type is None:\n res = False\n feedback = "{} not raised".format(exp_exc)\n elif not issubclass(exc_type, self.expected):\n res = False\n feedback = "Expected {} but got {}".format(exp_exc, act_exc)\n\n elif self.expected_regex is not None:\n expected_regex = self.expected_regex\n if not expected_regex.search(str(exc_value)):\n res = False\n feedback = \'"{}" does not match "{}"\'.format(expected_regex.pattern, str(exc_value))\n\n self.test_case.appendResult(res, act_exc, exp_exc, feedback)\n\n return True\n\n\nclass TestCase(object):\n def __init__(self):\n self.numPassed = 0\n self.numFailed = 0\n self.assertPassed = 0\n self.assertFailed = 0\n self.verbosity = 1\n self.tlist = []\n testNames = {}\n for name in dir(self):\n if name[:4] == \'test\' and name not in testNames:\n self.tlist.append(getattr(self,name))\n testNames[name]=True\n\n def setUp(self):\n pass\n\n def tearDown(self):\n pass\n \n def cleanName(self,funcName):\n return funcName.__func__.__name__\n\n def main(self):\n\n for func in self.tlist:\n if self.verbosity > 1:\n print(\'Running %s\' % self.cleanName(func))\n try:\n self.setUp()\n self.assertPassed = 0\n self.assertFailed = 0\n func()\n self.tearDown()\n if self.assertFailed == 0:\n self.numPassed += 1\n else:\n self.numFailed += 1\n print(\'Tests failed in %s \' % self.cleanName(func))\n except Exception as e:\n self.assertFailed += 1\n self.numFailed += 1\n print(\'Test threw exception in %s (%s)\' % (self.cleanName(func), e))\n self.showSummary()\n\n def assertEqual(self, actual, expected, feedback=""):\n res = actual==expected\n if not res and feedback == "":\n feedback = "Expected %s to equal %s" % (str(actual),str(expected))\n self.appendResult(res, actual ,expected, feedback)\n\n def assertNotEqual(self, actual, expected, feedback=""):\n res = actual != expected\n if not res and feedback == "":\n feedback = "Expected %s to not equal %s" % (str(actual),str(expected))\n self.appendResult(res, actual, expected, feedback)\n\n def assertTrue(self,x, feedback=""):\n res = bool(x) is True\n if not res and feedback == "":\n feedback = "Expected %s to be True" % (str(x))\n self.appendResult(res, x, True, feedback)\n\n def assertFalse(self,x, feedback=""):\n res = not bool(x)\n if not res and feedback == "":\n feedback = "Expected %s to be False" % (str(x))\n self.appendResult(res, x, False, feedback)\n\n def assertIs(self,a,b, feedback=""):\n res = a is b\n if not res and feedback == "":\n feedback = "Expected %s to be the same object as %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNot(self,a,b, feedback=""):\n res = a is not b\n if not res and feedback == "":\n feedback = "Expected %s to not be the same object as %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsNone(self,x, feedback=""):\n res = x is None\n if not res and feedback == "":\n feedback = "Expected %s to be None" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIsNotNone(self,x, feedback=""):\n res = x is not None\n if not res and feedback == "":\n feedback = "Expected %s to not be None" % (str(x))\n self.appendResult(res, x, None, feedback)\n\n def assertIn(self, a, b, feedback=""):\n res = a in b\n if not res and feedback == "":\n feedback = "Expected %s to be in %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIn(self, a, b, feedback=""):\n res = a not in b\n if not res and feedback == "":\n feedback = "Expected %s to not be in %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertIsInstance(self,a,b, feedback=""):\n res = isinstance(a,b)\n if not res and feedback == "":\n feedback = "Expected %s to be an instance of %s" % (str(a), str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotIsInstance(self,a,b, feedback=""):\n res = not isinstance(a,b)\n if not res and feedback == "":\n feedback = "Expected %s to not be an instance of %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertRegex(self, text, expected_regex, feedback=""):\n """Fail the test unless the text matches the regular expression."""\n if isinstance(expected_regex, (str, )): #bytes\n assert expected_regex, "expected_regex must not be empty."\n expected_regex = re.compile(expected_regex)\n if not expected_regex.search(text):\n res = False\n if feedback == "":\n feedback = "Regex didn\'t match: %r not found in %r" % (\n repr(expected_regex), text)\n else:\n res = True\n self.appendResult(res, text, expected_regex, feedback)\n\n def assertNotRegex(self, text, unexpected_regex, feedback=""):\n """Fail the test if the text matches the regular expression."""\n if isinstance(unexpected_regex, (str, )): # bytes\n unexpected_regex = re.compile(unexpected_regex)\n match = unexpected_regex.search(text)\n if match:\n feedback = \'Regex matched: %r matches %r in %r\' % (\n text[match.start() : match.end()],\n repr(unexpected_regex),\n text)\n # _formatMessage ensures the longMessage option is respected\n self.appendResult(not bool(match), text, unexpected_regex, feedback)\n\n def assertAlmostEqual(self, a, b, places=7, feedback="", delta=None):\n\n if delta is not None:\n res = abs(a-b) <= delta\n else:\n if places is None:\n places = 7\n res = round(a-b, places) == 0\n \n if not res and feedback == "":\n feedback = "Expected %s to equal %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertNotAlmostEqual(self, a, b, places=7, feedback="", delta=None):\n\n if delta is not None:\n res = not (a == b) and abs(a - b) > delta\n else:\n if places is None:\n places = 7\n\n res = round(a-b, places) != 0\n\n if not res and feedback == "":\n feedback = "Expected %s to not equal %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreater(self,a,b, feedback=""):\n res = a > b\n if not res and feedback == "":\n feedback = "Expected %s to be greater than %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertGreaterEqual(self,a,b, feedback=""):\n res = a >= b\n if not res and feedback == "":\n feedback = "Expected %s to be >= %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLess(self, a, b, feedback=""):\n res = a < b\n if not res and feedback == "":\n feedback = "Expected %s to be less than %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def assertLessEqual(self,a,b, feedback=""):\n res = a <= b\n if not res and feedback == "":\n feedback = "Expected %s to be <= %s" % (str(a),str(b))\n self.appendResult(res, a, b, feedback)\n\n def appendResult(self,res,actual,expected,feedback):\n if res:\n msg = \'Pass\'\n self.assertPassed += 1\n else:\n msg = \'Fail: \' + feedback\n print(msg)\n self.assertFailed += 1\n\n def assertRaises(self, expected_exception, *args, **kwargs):\n context = _AssertRaisesContext(expected_exception, self)\n try:\n return context.handle(\'assertRaises\', args, kwargs)\n finally:\n # bpo-23890: manually break a reference cycle\n context = None\n\n def assertRaisesRegex(self, expected_exception, expected_regex,\n *args, **kwargs):\n context = _AssertRaisesContext(expected_exception, self, expected_regex)\n return context.handle(\'assertRaisesRegex\', args, kwargs)\n\n def fail(self, msg=None):\n if msg is None:\n msg = \'Fail\'\n else:\n msg = \'Fail: \' + msg\n print(msg)\n self.assertFailed += 1\n\n def showSummary(self):\n # don\'t divde by zero\n # pct = self.numPassed / (self.numPassed+self.numFailed) * 100\n print("Ran %d tests, passed: %d failed: %d\\n" % (self.numPassed+self.numFailed,\n self.numPassed, self.numFailed))\n\n\n\ndef main(verbosity=1):\n glob = globals() # globals() still needs work\n for name in glob:\n if type(glob[name]) == type and issubclass(glob[name], TestCase):\n try:\n tc = glob[name]()\n tc.verbosity = verbosity\n tc.main()\n except:\n print("Uncaught Error in: ", name)\n',"src/lib/unittest/gui.py":'import document\nfrom unittest import TestCase\nfrom urllib.request import urlopen\nfrom time import sleep\n\n\nclass TestCaseGui(TestCase):\n def __init__(self):\n TestCase.__init__(self)\n self.closestDiv = document.currentDiv()\n self.divid = document.currentGradingContainer()\n self.mydiv = document.getElementById(self.divid)\n # If there is no div then create a dummy to avoid errors when running\n # grading "off screen"\n if self.mydiv is None:\n self.mydiv = document.createElement("div")\n self.mydiv.id = self.divid + "_offscreen_unit_results"\n self.mydiv.style.display = "none"\n body = document.getElementsByTagName("body")[0]\n body.appendChild(self.mydiv)\n self.unit_results_divid = self.divid + "_offscreen_unit_results"\n\n res = document.getElementById(self.divid + "_unit_results")\n if res:\n self.resdiv = res\n res.innerHTML = ""\n self.unit_results_divid = self.divid + "_unit_results"\n else:\n self.resdiv = document.createElement("div")\n self.resdiv.id = self.divid + "_unit_results"\n self.resdiv.classList.add("unittest-results")\n self.mydiv.appendChild(self.resdiv)\n self.unit_results_divid = self.divid + "_unit_results"\n\n def main(self):\n t = document.createElement("table")\n self.resTable = t\n x = self.resdiv.closest(".timedComponent")\n if x:\n self.is_timed = True\n else:\n self.is_timed = False\n self.resdiv.appendChild(self.resTable)\n if self.is_timed:\n self.resdiv.style.display = "none"\n\n headers = ["Result", "Actual Value", "Expected Value", "Notes"]\n row = document.createElement("tr")\n for item in headers:\n head = document.createElement("th")\n head.classList.add("ac-feedback")\n head.innerHTML = item\n head.style.textAlign = "center"\n row.appendChild(head)\n self.resTable.appendChild(row)\n\n for func in self.tlist:\n try:\n self.setUp()\n func()\n self.tearDown()\n except Exception as e:\n self.appendResult("Error", None, None, str(e).split("on line")[0])\n self.numFailed += 1\n self.showSummary()\n\n def getOutput(self):\n sleep(0.2)\n # self.divid will be the gradingWrapper when in grading mode\n if self.closestDiv != self.divid:\n output = document.querySelector(\n "#{} #{}_stdout".format(self.divid, self.closestDiv)\n )\n else:\n output = document.getElementById(self.divid + "_stdout")\n return output.innerText\n\n def getEditorText(self):\n return document.getCurrentEditorValue()\n\n def appendResult(self, res, actual, expected, param):\n trimActual = False\n if len(str(actual)) > 15:\n trimActual = True\n actualType = type(actual)\n trimExpected = False\n if len(str(expected)) > 15:\n trimExpected = True\n expectedType = type(expected)\n row = document.createElement("tr")\n err = False\n if res == "Error":\n err = True\n msg = "Error: %s" % param\n errorData = document.createElement("td")\n errorData.classList.add("ac-feedback")\n errorData.innerHTML = "ERROR"\n errorData.style.backgroundColor = "#de8e96"\n errorData.style.textAlign = "center"\n row.appendChild(errorData)\n elif res:\n passed = document.createElement("td")\n passed.classList.add("ac-feedback")\n passed.innerHTML = "Pass"\n passed.style.backgroundColor = "#83d382"\n passed.style.textAlign = "center"\n row.appendChild(passed)\n self.numPassed += 1\n else:\n fail = document.createElement("td")\n fail.classList.add("ac-feedback")\n fail.innerHTML = "Fail"\n fail.style.backgroundColor = "#de8e96"\n fail.style.textAlign = "center"\n row.appendChild(fail)\n self.numFailed += 1\n\n act = document.createElement("td")\n act.classList.add("ac-feedback")\n if trimActual:\n actHTML = str(actual)[:5] + "..." + str(actual)[-5:]\n if actualType == str:\n actHTML = repr(actHTML)\n act.innerHTML = actHTML\n else:\n act.innerHTML = repr(actual)\n act.style.textAlign = "center"\n row.appendChild(act)\n\n expect = document.createElement("td")\n expect.classList.add("ac-feedback")\n\n if trimExpected:\n expectedHTML = str(expected)[:5] + "..." + str(expected)[-5:]\n if expectedType == str:\n expectedHTML = repr(expectedHTML)\n expect.innerHTML = expectedHTML\n else:\n expect.innerHTML = repr(expected)\n expect.style.textAlign = "center"\n row.appendChild(expect)\n inp = document.createElement("td")\n inp.classList.add("ac-feedback")\n\n if err:\n inp.innerHTML = msg\n else:\n inp.innerHTML = param\n inp.style.textAlign = "center"\n row.appendChild(inp)\n\n def foo(evt):\n document.popup(expandmsg)\n\n if trimActual or trimExpected:\n expandbutton = document.createElement("button")\n expandbutton.innerHTML = "Expand Differences"\n expandmsg = "Actual: " + str(actual) + "\\nExpected: " + str(expected)\n expandbutton.value = expandmsg\n expandbutton.type = "button"\n expandbutton.addEventListener("click", foo)\n expandbutton.classList.add("btn", "btn-info")\n row.appendChild(expandbutton)\n\n self.resTable.appendChild(row)\n\n def showSummary(self):\n pct = float(self.numPassed) / (self.numPassed + self.numFailed) * 100\n pctcorrect = (\n "percent:"\n + str(pct)\n + ":passed:"\n + str(self.numPassed)\n + ":failed:"\n + str(self.numFailed)\n )\n pTag = document.createElement("p")\n if not self.is_timed:\n pTag.innerHTML = "You passed: " + str(pct) + "% of the tests"\n self.resdiv.appendChild(pTag)\n try:\n jseval(\n "window.componentMap[\'{}\'].pct_correct = {}".format(\n self.closestDiv, pct\n )\n )\n jseval(\n "window.componentMap[\'{}\'].unit_results = \'{}\'".format(\n self.closestDiv, pctcorrect\n )\n )\n jseval(\n "window.componentMap[\'{}\'].unit_results_divid = \'{}\'".format(\n self.closestDiv, self.mydiv.getAttribute("id")\n )\n )\n\n except:\n print(\n "failed to find object to record unittest results in {}! {}".format(\n self.closestDiv, pctcorrect\n )\n )\n',"src/lib/urllib2.py":'import _sk_fail; _sk_fail._("urllib2")\n',"src/lib/urlparse.py":'import _sk_fail; _sk_fail._("urlparse")\n',"src/lib/user.py":'import _sk_fail; _sk_fail._("user")\n',"src/lib/uu.py":'import _sk_fail; _sk_fail._("uu")\n',"src/lib/warnings.py":'import _sk_fail; _sk_fail._("warnings")\n',"src/lib/wave.py":'import _sk_fail; _sk_fail._("wave")\n',"src/lib/weakref.py":'import _sk_fail; _sk_fail._("weakref")\n',"src/lib/whichdb.py":'import _sk_fail; _sk_fail._("whichdb")\n',"src/lib/wsgiref/__init__.py":'import _sk_fail; _sk_fail._("wsgiref")\n',"src/lib/xdrlib.py":'import _sk_fail; _sk_fail._("xdrlib")\n',"src/lib/xml/__init__.py":'import _sk_fail; _sk_fail._("xml")\n',"src/lib/xml/dom/__init__.py":'import _sk_fail; _sk_fail._("dom")\n',"src/lib/xml/etree/__init__.py":'import _sk_fail; _sk_fail._("etree")\n',"src/lib/xml/parsers/__init__.py":'import _sk_fail; _sk_fail._("parsers")\n',"src/lib/xml/sax/__init__.py":'import _sk_fail; _sk_fail._("sax")\n',"src/lib/xmllib.py":'import _sk_fail; _sk_fail._("xmllib")\n',"src/lib/xmlrpclib.py":'import _sk_fail; _sk_fail._("xmlrpclib")\n',"src/lib/zipfile.py":'import _sk_fail; _sk_fail._("zipfile")\n',"src/builtin/sys.js":'var $builtinmodule=function(i){var t,n={},e=[],u=Sk.getSysArgv();for(t=0;tnew Sk.builtin.str("utf-8"))),n.getExecutionLimit=new Sk.builtin.func((function(){return null===Sk.execLimit?Sk.builtin.none.none$:new Sk.builtin.int_(Sk.execLimit)})),n.setExecutionLimit=new Sk.builtin.func((function(i){if(null===Sk.execLimit)throw new Sk.builtin.NotImplementedError("Execution limiting is not enabled");void 0!==i&&(Sk.execLimit=Sk.builtin.asnum$(i))})),n.resetTimeout=new Sk.builtin.func((function(){Sk.execStart=new Date})),n.getYieldLimit=new Sk.builtin.func((function(){return null===Sk.yieldLimit?Sk.builtin.none.none$:new Sk.builtin.int_(Sk.yieldLimit)})),n.setYieldLimit=new Sk.builtin.func((function(i){if(null===Sk.yieldLimit)throw new Sk.builtin.NotImplementedError("Yielding is not enabled");void 0!==i&&(Sk.yieldLimit=Sk.builtin.asnum$(i))})),n.debug=new Sk.builtin.func((function(){return Sk.builtin.none.none$}));const s=Sk.builtin.make_structseq("sys","float_info",{max:"DBL_MAX -- maximum representable finite float",max_exp:"DBL_MAX_EXP -- maximum int e such that radix**(e-1) is representable",max_10_exp:"DBL_MAX_10_EXP -- maximum int e such that 10**e is representable",min:"DBL_MIN -- Minimum positive normalized float",min_exp:"DBL_MIN_EXP -- minimum int e such that radix**(e-1) is a normalized float",min_10_exp:"DBL_MIN_10_EXP -- minimum int e such that 10**e is a normalized",dig:"DBL_DIG -- digits",mant_dig:"DBL_MANT_DIG -- mantissa digits",epsilon:"DBL_EPSILON -- Difference between 1 and the next representable float",radix:"FLT_RADIX -- radix of exponent",rounds:"FLT_ROUNDS -- rounding mode"});n.float_info=new s([Number.MAX_VALUE,Math.floor(Math.log2(Number.MAX_VALUE)),Math.floor(Math.log10(Number.MAX_VALUE)),Number.MIN_VALUE,Math.ceil(Math.log2(Number.MIN_VALUE)),Math.ceil(Math.log10(Number.MIN_VALUE)),15,Math.log2(Number.MAX_SAFE_INTEGER),Number.EPSILON,2,1].map((i=>Sk.ffi.remapToPy(i))));const o=Sk.builtin.make_structseq("sys","int_info",{bits_per_digit:"size of a digit in bits",sizeof_digit:"size in bytes of the C type used to represent a digit"});n.int_info=new o([30,4].map((i=>Sk.ffi.remapToPy(i))));const l=Sk.builtin.make_structseq("sys","hash_info",{width:"width of the type used for hashing, in bits",modulus:"prime number giving the modulus on which the hash function is based",inf:"value to be used for hash of a positive infinity",nan:"value to be used for hash of a nan",imag:"multiplier used for the imaginary part of a complex number",algorithm:"name of the algorithm for hashing of str, bytes and memoryviews",hash_bits:"internal output size of hash algorithm",seed_bits:"seed size of hash algorithm",cutoff:"small string optimization cutoff"});return n.hash_info=new l([32,536870911,314159,0,1000003,"siphash24",32,128,0].map((i=>Sk.ffi.remapToPy(i)))),n.__stdout__=new Sk.builtin.file(new Sk.builtin.str("/dev/stdout"),new Sk.builtin.str("w")),n.__stdin__=new Sk.builtin.file(new Sk.builtin.str("/dev/stdin"),new Sk.builtin.str("r")),n.__stderr__=new Sk.builtin.file(new Sk.builtin.str("/dev/stderr"),new Sk.builtin.str("w")),n.stdout=n.__stdout__,n.stdin=n.__stdin__,n.stderr=n.__stderr__,n};',"src/lib/JoBase.js":'const $builtinmodule=()=>{Sk.misceval.print_("Welcome to JoBase\\n");const e=Sk.JoBase,o={},t=[],r=[],n=e.getContext("webgl"),a=n.createProgram(),c=n.createBuffer(),i=n.createShader(n.VERTEX_SHADER),s=n.createShader(n.FRAGMENT_SHADER),str=e=>new Sk.builtin.str(e),def=e=>new Sk.builtin.func(e),float=e=>new Sk.builtin.float_(e),int=e=>new Sk.builtin.int_(e),bool=e=>new Sk.builtin.bool(e),tuple=e=>new Sk.builtin.tuple(e),number=e=>{if(Sk.builtin.checkNumber(e))return e.v;throw new Sk.builtin.TypeError("must be real number, not "+e.tp$name)},string=e=>{if(Sk.builtin.checkString(e))return e.v;throw new Sk.builtin.TypeError("must be str, not "+e.tp$name)},property=(...e)=>call(Sk.builtins.property,...e),build=(...e)=>Sk.misceval.buildClass(o,...e),call=(...e)=>Sk.misceval.callsimOrSuspend(...e),is=(...e)=>Sk.builtin.isinstance(...e).v,wait=e=>Sk.misceval.promiseToSuspension(new Promise(e)),object=e=>{throw new Sk.builtin.TypeError("must be Shape or cursor, not "+e.tp$name)},path=e=>str("https://jobase.org/Browser/JoBase/"+e),width=()=>e.width/devicePixelRatio,height=()=>e.height/devicePixelRatio,x=()=>o.cursor.$x-width()/2,y=()=>height()/2-o.cursor.$y,blank=()=>{},mouseEnter=()=>o.cursor.$enter=!0,mouseLeave=()=>o.cursor.$leave=!0,mouseDown=()=>{o.cursor.$press=!0,o.cursor.$hold=!0},mouseUp=()=>{o.cursor.$release=!0,o.cursor.$hold=!1},mouseMove=t=>{const r=e.getBoundingClientRect();o.cursor.$x=t.clientX-r.left,o.cursor.$y=t.clientY-r.top,o.cursor.$move=!0},keyDown=e=>{const t=Object.keys(o.key.$data).find((t=>o.key.$data[t].code==e.code)),r=o.key.$data[t];e.repeat?(o.key.$repeat=!0,r&&(r.repeat=!0)):(o.key.$press=!0,r&&(r.press=!0)&&(r.hold=!0))},keyUp=e=>{const t=Object.keys(o.key.$data).find((t=>o.key.$data[t].code==e.code)),r=o.key.$data[t];o.key.$release=!0,r&&(r.release=!0)&&(r.hold=!1)},collidePolyPoint=(e,o)=>e.reduce(((e,t,r,n)=>{const a=n[r+1==n.length?0:r+1];return o[0]<(a[0]-t[0])*(o[1]-t[1])/(a[1]-t[1])+t[0]&&(t[1]>o[1]&&a[1]o[1])?!e:e}),!1),getRectPoly=e=>{const o=e.$anchor[0]+e.$size[0]*e.$scale[0]/2,t=e.$anchor[1]+e.$size[1]*e.$scale[1]/2;return((e,o,t)=>{const r=Math.cos(o*Math.PI/180),n=Math.sin(o*Math.PI/180);return e.map((e=>[e[0]*r-e[1]*n+t[0],e[0]*n+e[1]*r+t[1]]))})([[-o,t],[o,t],[o,-t],[-o,-t]],e.$angle,e.$pos)},createImage=e=>{const o=n.createTexture();return n.bindTexture(n.TEXTURE_2D,o),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),o},renderText=e=>{const o=document.createElement("canvas"),t=o.getContext("2d"),a=e.$fontSize+"px _"+r.indexOf(e.$font);t.font=a;const c=t.measureText(e.$content),i=c.actualBoundingBoxRight-c.actualBoundingBoxLeft,s=t.measureText("Sy"),d=s.actualBoundingBoxDescent+s.actualBoundingBoxAscent;e.$size[0]=o.width=i,e.$size[1]=o.height=d,t.font=a,t.fillStyle="#fff",t.fillText(e.$content,0,s.actualBoundingBoxAscent),n.deleteTexture(e.$texture),e.$texture=createImage(o)},loadFont=e=>new Promise(((o,t)=>{if(r.includes(e))return o();new FontFace("_"+r.length,`url(${e})`).load().then((t=>{document.fonts.add(t),r.push(e),o()})).catch((()=>{return t((o=`failed to load font: "${e}"`,new Sk.builtin.FileNotFoundError(o)));var o}))})),drawShape=(e,o,t,r,c,i)=>{const s=o[0]*e.$scale[0],d=o[1]*e.$scale[1],l=e.$anchor[0],u=e.$anchor[1],$=e.$pos[0],p=e.$pos[1],m=Math.sin(e.$angle*Math.PI/180),f=Math.cos(e.$angle*Math.PI/180);var h,_;h=[s*f,s*m,0,0,d*-m,d*f,0,0,0,0,1,0,l*f+u*-m+$,l*m+u*f+p,0,1],_=e.$color,n.uniform4fv(n.getUniformLocation(a,"color"),new Float32Array(_)),n.uniformMatrix4fv(n.getUniformLocation(a,"object"),!1,new Float32Array(h)),n.bindBuffer(n.ARRAY_BUFFER,t),n.uniform1i(n.getUniformLocation(a,"image"),c),n.drawArrays(r,0,i)},d=def(((e,t)=>{if(is(e,o.Rectangle)){if(is(t,o.Rectangle))return bool((r=getRectPoly(e),n=getRectPoly(t),collidePolyPoint(r,n[0])||collidePolyPoint(n,r[0])||r.find(((e,o,t)=>((e,o,t)=>e.find(((e,r,n)=>((e,o,t,r)=>{const n=(r[1]-t[1])*(o[0]-e[0])-(r[0]-t[0])*(o[1]-e[1]),a=((r[0]-t[0])*(e[1]-t[1])-(r[1]-t[1])*(e[0]-t[0]))/n,c=((o[0]-e[0])*(e[1]-t[1])-(o[1]-e[1])*(e[0]-t[0]))/n;return a>=0&&a<=1&&c>=0&&c<=1})(o,t,e,n[r+1==n.length?0:r+1]))))(n,e,t[o+1==t.length?0:o+1])))));if(t==o.cursor)return bool(collidePolyPoint(getRectPoly(e),[x(),y()]));object(t)}var r,n;if(e==o.cursor){if(is(t,o.Rectangle))return bool(collidePolyPoint(getRectPoly(t),[x(),y()]));if(t==o.cursor)return Sk.builtins.bool.true$;object(t)}object(e)})),l={set:(e,o)=>{if(e.ob$type==l.class)o.forEach(((o,t,r)=>r[t]=tr[t]=t{const r=call(l.class);return r.$parent=e,r.$get=o,r.$data=t.map((e=>({name:e[0],set:e[1]}))),r},class:build(((e,o)=>{o.__getattr__=def(((e,o)=>{const t=e.$data.findIndex((e=>e.name==o.v));if(-1!=t)return float(e.$get()[t])})),o.__setattr__=def(((e,o,t)=>{const r=e.$data.find((e=>e.name==o.v));r&&r.set(e.$parent,t)})),o.__str__=def((e=>str(`(${e.$get().join(", ")})`))),o.__repr__=def((e=>str(`[${e.$get().join(", ")}]`)))}),"Vector")},u={new:(e,o,t,r,n)=>{e.$color=l.set(n,[0,0,0,1]),e.$pos=[number(o),number(t)],e.$angle=number(r),e.$anchor=[0,0],e.$scale=[1,1]},class:build(((e,t)=>{t.collides_with=d,t.look_at=def(((e,t)=>{const set=(o,t)=>{const r=Math.atan2(t-e.$pos[1],o-e.$pos[0]);e.$angle=180*r/Math.PI};t==o.cursor?set(x(),y()):is(t,u.class)?set(...t.$pos):object(t)})),t.move_toward=def(((e,t,r)=>{const n=number(r)??1,set=(o,t)=>{const r=o-e.$pos[0],a=t-e.$pos[1];Math.hypot(r,a)e.$pos[0]=number(o),y=(e,o)=>e.$pos[1]=number(o);t.x=property(def((e=>float(e.$pos[0]))),def(x)),t.y=property(def((e=>float(e.$pos[1]))),def(y)),t.pos=t.position=property(def((e=>l.new(e,(()=>e.$pos),["x",x],["y",y]))),def(((e,o)=>l.set(o,e.$pos)))),t.top=property(def((e=>float(e.$top()))),def(((e,o)=>e.$pos[1]+=o-e.$top()))),t.left=property(def((e=>float(e.$left()))),def(((e,o)=>e.$pos[0]+=o-e.$left()))),t.bottom=property(def((e=>float(e.$bottom()))),def(((e,o)=>e.$pos[1]+=o-e.$bottom()))),t.right=property(def((e=>float(e.$right()))),def(((e,o)=>e.$pos[0]+=o-e.$right())));const scaleX=(e,o)=>e.$scale[0]=number(o),scaleY=(e,o)=>e.$scale[1]=number(o);t.scale=property(def((e=>l.new(e,(()=>e.$scale),["x",scaleX],["y",scaleY]))),def(((e,o)=>l.set(o,e.$scale))));const anchorX=(e,o)=>e.$anchor[0]=number(o),anchorY=(e,o)=>e.$anchor[1]=number(o);t.anchor=property(def((e=>l.new(e,(()=>e.$anchor),["x",anchorX],["y",anchorY]))),def(((e,o)=>l.set(o,e.$anchor)))),t.angle=property(def((e=>float(e.$angle))),def(((e,o)=>e.$angle=number(o))));const red=(e,o)=>e.$color[0]=number(o),green=(e,o)=>e.$color[1]=number(o),blue=(e,o)=>e.$color[2]=number(o),alpha=(e,o)=>e.$color[3]=number(o);t.red=property(def((e=>float(e.$color[0]))),def(red)),t.green=property(def((e=>float(e.$color[1]))),def(green)),t.blue=property(def((e=>float(e.$color[2]))),def(blue)),t.blue=property(def((e=>float(e.$color[3]))),def(alpha)),t.color=property(def((e=>l.new(e,(()=>e.$color),["red",red],["green",green],["blue",blue],["alpha",alpha]))),def(((e,o)=>l.set(o,e.$color))))}),"Shape")};return o.MAN=path("images/man.png"),o.COIN=path("images/coin.png"),o.ENEMY=path("images/enemy.png"),o.DEFAULT=path("fonts/default.ttf"),o.CODE=path("fonts/code.ttf"),o.PENCIL=path("fonts/pencil.ttf"),o.SERIF=path("fonts/serif.ttf"),o.HANDWRITING=path("fonts/handwriting.ttf"),o.TYPEWRITER=path("fonts/typewriter.ttf"),o.JOINED=path("fonts/joined.ttf"),o.window=call(build(((e,o)=>{const init=(e,o,t,r,a)=>{e.$caption=string(o),e.$color=l.set(a,[1,1,1]),n.clearColor(...e.$color,1)};init.$defaults=[str("JoBase"),null,null,tuple()],init.co_varnames=["self","caption","width","height","color"],o.__init__=def(init),o.close=def((e=>e.$close=!0)),o.maximize=def(blank),o.minimize=def(blank),o.focus=def(blank),o.caption=property(def((e=>str(e.$caption))),def(((e,o)=>e.$caption=string(o))));const red=(e,o)=>{e.$color[0]=number(o),n.clearColor(...e.$color,1)},green=(e,o)=>{e.$color[1]=number(o),n.clearColor(...e.$color,1)},blue=(e,o)=>{e.$color[2]=number(o),n.clearColor(...e.$color,1)};o.red=property(def((e=>float(e.$color[0]))),def(red)),o.green=property(def((e=>float(e.$color[1]))),def(green)),o.blue=property(def((e=>float(e.$color[2]))),def(blue)),o.color=property(def((e=>l.new(e,(()=>e.$color),["red",red],["green",green],["blue",blue]))),def(((e,o)=>n.clearColor(...l.set(o,e.$color),1)))),o.width=property(def((()=>float(width())))),o.height=property(def((()=>float(height())))),o.size=property(def((e=>l.new(e,(()=>[width(),height()]),["x",blank],["y",blank]))),def(((e,o)=>l.set(o,new Array(2))))),o.top=property(def((()=>float(height()/2)))),o.bottom=property(def((()=>float(height()/-2)))),o.left=property(def((()=>float(width()/-2)))),o.right=property(def((()=>float(width()/2)))),o.resize=property(def((e=>bool(e.$resize))))}),"Window")),o.cursor=call(build(((e,o)=>{o.x=property(def((()=>float(x())))),o.y=property(def((()=>float(y())))),o.pos=o.position=property(def((e=>l.new(e,(()=>[x(),y()]),["x",blank],["y",blank]))),def(((e,o)=>l.set(o,new Array(2))))),o.move=property(def((e=>bool(e.$move)))),o.enter=property(def((e=>bool(e.$enter)))),o.leave=property(def((e=>bool(e.$leave)))),o.press=property(def((e=>bool(e.$press)))),o.release=property(def((e=>bool(e.$release)))),o.hold=property(def((e=>bool(e.$hold))))}),"Cursor")),o.cursor.$x=0,o.cursor.$y=0,o.key=call(build(((e,o)=>{o.__getattr__=def(((e,o)=>{const t=e.$data[o.v];if(t)return t.hold||t.release?(r=[str("press"),bool(t.press),str("release"),bool(t.release),str("repeat"),bool(t.repeat)],new Sk.builtin.dict(r)):Sk.builtin.bool.false$;var r})),o.hold=property(def((e=>{for(const o in e.$data)if(e.$data[o].hold)return Sk.builtin.bool.true$;return Sk.builtin.bool.false$}))),o.press=property(def((e=>bool(e.$press)))),o.release=property(def((e=>bool(e.$release)))),o.repeat=property(def((e=>bool(e.$repeat))))}),"Key")),o.key.$data={space:{code:"Space"},apostrophe:{code:"Quote"},comma:{code:"Comma"},minus:{code:"Minus"},period:{code:"Period"},slash:{code:"Slash"},_0:{code:"Digit0"},_1:{code:"Digit1"},_2:{code:"Digit2"},_3:{code:"Digit3"},_4:{code:"Digit4"},_5:{code:"Digit5"},_6:{code:"Digit6"},_7:{code:"Digit7"},_8:{code:"Digit8"},_9:{code:"Digit9"},semicolon:{code:"Semicolon"},equal:{code:"Equal"},a:{code:"KeyA"},b:{code:"KeyB"},c:{code:"KeyC"},d:{code:"KeyD"},e:{code:"KeyE"},f:{code:"KeyF"},g:{code:"KeyG"},h:{code:"KeyH"},i:{code:"KeyI"},j:{code:"KeyJ"},k:{code:"KeyK"},l:{code:"KeyL"},m:{code:"KeyM"},n:{code:"KeyN"},o:{code:"KeyO"},p:{code:"KeyP"},q:{code:"KeyQ"},r:{code:"KeyR"},s:{code:"KeyS"},t:{code:"KeyT"},u:{code:"KeyU"},v:{code:"KeyV"},w:{code:"KeyW"},x:{code:"KeyX"},y:{code:"KeyY"},z:{code:"KeyZ"},left_bracket:{code:"BracketLeft"},backslash:{code:"Backslash"},right_bracket:{code:"BracketRight"},backquote:{code:"Backquote"},escape:{code:"Escape"},enter:{code:"Enter"},tab:{code:"Tab"},backspace:{code:"Backspace"},insert:{code:"Insert"},delete:{code:"Delete"},right:{code:"ArrowRight"},left:{code:"ArrowLeft"},down:{code:"ArrowDown"},up:{code:"ArrowUp"},page_up:{code:"PageUp"},page_down:{code:"PageDown"},home:{code:"Home"},end:{code:"End"},caps_lock:{code:"CapsLock"},scroll_lock:{code:"ScrollLock"},num_lock:{code:"NumLock"},print_screen:{code:"PrintScreen"},pause:{code:"Pause"},f1:{code:"F1"},f2:{code:"F2"},f3:{code:"F3"},f4:{code:"F4"},f5:{code:"F5"},f6:{code:"F6"},f7:{code:"F7"},f8:{code:"F8"},f9:{code:"F9"},f10:{code:"F10"},f11:{code:"F11"},f12:{code:"F12"},f13:{code:"F13"},f14:{code:"F14"},f15:{code:"F15"},f16:{code:"F16"},f17:{code:"F17"},f18:{code:"F18"},f19:{code:"F19"},f20:{code:"F20"},f21:{code:"F21"},f22:{code:"F22"},f23:{code:"F23"},f24:{code:"F24"},f25:{code:"F25"},pad_0:{code:"Numpad0"},pad_1:{code:"Numpad1"},pad_2:{code:"Numpad2"},pad_3:{code:"Numpad3"},pad_4:{code:"Numpad4"},pad_5:{code:"Numpad5"},pad_6:{code:"Numpad6"},pad_7:{code:"Numpad7"},pad_8:{code:"Numpad8"},pad_9:{code:"Numpad9"},decimal:{code:"NumpadDecimal"},divide:{code:"NumpadDivide"},multiply:{code:"NumpadMultiply"},subtract:{code:"NumpadSubtract"},add:{code:"NumpadAdd"},enter:{code:"NumpadEnter"},equal:{code:"NumpadEqual"},left_shift:{code:"ShiftLeft"},left_ctrl:{code:"ControlLeft"},left_alt:{code:"AltLeft"},left_super:{code:"SuperLeft"},right_shift:{code:"ShiftRight"},right_ctrl:{code:"ControlRight"},right_alt:{code:"AltRight"},right_super:{code:"SuperRight"},menu:{code:"Menu"}},o.camera=call(build(((e,o)=>{const init=(e,o,t)=>{e.$pos=[number(o),number(t)]};init.$defaults=[int(),int()],init.co_varnames=["self","x","y"],o.__init__=def(init);const x=(e,o)=>e.$pos[0]=number(o),y=(e,o)=>e.$pos[1]=number(o);o.x=property(def((e=>float(e.$pos[0]))),def(x)),o.y=property(def((e=>float(e.$pos[1]))),def(y)),o.pos=o.position=property(def((e=>l.new(e,(()=>e.$pos),["x",x],["y",y]))),def(((e,o)=>l.set(o,e.$pos))))}),"Camera")),o.Rectangle=build(((e,o)=>{const init=(e,o,t,r,n,a,c)=>{u.new(e,o,t,a,c),e.$size=[number(r),number(n)],e.$top=()=>{return(o=getRectPoly(e)).reduce(((e,o)=>o[1]>e?o[1]:e),o[0][1]);var o},e.$left=()=>{return(o=getRectPoly(e)).reduce(((e,o)=>o[0]{return(o=getRectPoly(e)).reduce(((e,o)=>o[1]{return(o=getRectPoly(e)).reduce(((e,o)=>o[0]>e?o[0]:e),o[0][0]);var o}};init.$defaults=[int(),int(),int(50),int(50),int(),tuple()],init.co_varnames=["self","x","y","width","height","angle","color"],o.__init__=def(init),o.draw=def((e=>drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!1,4)));const width=(e,o)=>e.$size[0]=number(o),height=(e,o)=>e.$size[1]=number(o);o.width=property(def((e=>float(e.$size[0]))),def(width)),o.height=property(def((e=>float(e.$size[1]))),def(height)),o.size=property(def((e=>l.new(e,(()=>e.$size),["width",width],["height",height]))),def(((e,o)=>l.set(o,e.$size))))}),"Rectangle",[u.class]),o.Image=build(((e,r)=>{const init=(e,r,n,a,c,i,s,d)=>wait(((u,$)=>{call(o.Rectangle.prototype.__init__,e,n,a,i,s,c);const p=t.find((e=>e.name==string(r))),set=o=>{e.$texture=o.source,e.$size[0]||=o.width,e.$size[1]||=o.height};if(e.$color=l.set(d,[1,1,1,1]),p)return set(p),u();const m=new Image;m.crossOrigin="anonymous",m.src=string(r),m.onerror=()=>$(new Sk.builtin.FileNotFoundError(`failed to load image: "${string(r)}"`)),m.onload=()=>{const e={name:string(r),width:m.width,height:m.height,source:createImage(m)};t.push(e),set(e),u()}}));init.$defaults=[o.MAN,int(),int(),int(),int(),int(),tuple()],init.co_varnames=["self","name","x","y","angle","width","height","color"],r.__init__=def(init),r.draw=def((e=>{n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,e.$texture),drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!0,4)}))}),"Image",[o.Rectangle]),o.Text=build(((e,t)=>{const init=(e,t,r,n,a,c,i,s)=>wait(((d,l)=>{call(o.Rectangle.prototype.__init__,e,r,n,int(),int(),c,i),e.$font=string(s),e.$fontSize=number(a),e.$content=string(t),loadFont(e.$font).then((()=>{renderText(e),d()})).catch(l)}));init.$defaults=[str("Text"),int(),int(),int(50),int(),tuple(),o.DEFAULT],init.co_varnames=["self","content","x","y","font_size","angle","color","font"],t.__init__=def(init),t.draw=def((e=>{n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,e.$texture),drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!0,4)})),t.content=property(def((e=>str(e.$content))),def(((e,o)=>{e.$content=string(o),renderText(e)}))),t.font=property(def((e=>str(e.$font))),def(((e,o)=>wait(((t,r)=>{loadFont(e.$font=string(o)).then((()=>{renderText(e),t()})).catch(r)}))))),t.font_size=property(def((e=>float(e.$font_size))),def(((e,o)=>{e.$font_size=number(o),renderText(e)})))}),"Text",[o.Rectangle]),o.random=def(((e,o)=>{const t=Math.min(number(e),number(o));return float(Math.random()*(Math.max(number(e),number(o))-t)+t)})),o.run=def((()=>wait(((r,i)=>{const update=()=>{const final=o=>{n.deleteBuffer(c),n.deleteProgram(a),t.forEach((e=>n.deleteTexture(e.source))),d.disconnect(),e.removeEventListener("mouseenter",mouseEnter),e.removeEventListener("mouseleave",mouseLeave),e.removeEventListener("mousedown",mouseDown),e.removeEventListener("mouseup",mouseUp),e.removeEventListener("mousemove",mouseMove),e.removeEventListener("keydown",keyDown),e.removeEventListener("keyup",keyUp),cancelAnimationFrame(s.frame),o?i(o):r()};if(o.window.$close||Date.now()-Sk.execStart>Sk.execLimit)return final();const l=o.camera.$pos[0],u=o.camera.$pos[1],$=new Float32Array([2/width(),0,0,0,0,2/height(),0,0,0,0,-2,0,2*-l/width(),2*-u/height(),-1,1]);n.uniformMatrix4fv(n.getUniformLocation(a,"camera"),!1,$),n.clear(n.COLOR_BUFFER_BIT);try{s.main.$d.loop&&call(s.main.$d.loop)}catch(p){final(p)}o.window.$resize=!1,o.cursor.$move=!1,o.cursor.$enter=!1,o.cursor.$leave=!1,o.cursor.$press=!1,o.cursor.$release=!1,o.key.$press=!1,o.key.$release=!1,o.key.$repeat=!1;for(const e in o.key.$data)o.key.$data[e].press=!1,o.key.$data[e].release=!1,o.key.$data[e].repeat=!1},loop=()=>{s.frame=requestAnimationFrame(loop),update()},s={main:Sk.importModule("__main__",!1,!0),frame:requestAnimationFrame(loop)},d=new MutationObserver((()=>{n.viewport(0,0,e.width,e.height),o.window.$resize=!0,update()}));d.observe(e,{attributes:!0})})))),e.addEventListener("mouseenter",mouseEnter),e.addEventListener("mouseleave",mouseLeave),e.addEventListener("mousedown",mouseDown),e.addEventListener("mouseup",mouseUp),e.addEventListener("mousemove",mouseMove),e.addEventListener("keydown",keyDown),e.addEventListener("keyup",keyUp),e.tabIndex=0,e.focus(),n.shaderSource(i,"\\n attribute vec2 vertex;\\n attribute vec2 coordinate;\\n varying vec2 position;\\n \\n uniform mat4 camera;\\n uniform mat4 object;\\n \\n void main(void) {\\n gl_Position = camera * object * vec4(vertex, 0, 1);\\n position = coordinate;\\n }"),n.shaderSource(s,"\\n precision mediump float;\\n varying vec2 position;\\n\\n uniform vec4 color;\\n uniform sampler2D sampler;\\n uniform int image;\\n\\n void main(void) {\\n if (image == 1) gl_FragColor = texture2D(sampler, position) * color;\\n else gl_FragColor = color;\\n }"),n.compileShader(i),n.compileShader(s),n.attachShader(a,i),n.attachShader(a,s),n.linkProgram(a),n.useProgram(a),n.uniform1i(n.getUniformLocation(a,"sampler"),0),n.deleteShader(i),n.deleteShader(s),n.bindBuffer(n.ARRAY_BUFFER,c),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-.5,.5,0,0,.5,.5,1,0,-.5,-.5,0,1,.5,-.5,1,1]),n.STATIC_DRAW),n.vertexAttribPointer(n.getAttribLocation(a,"vertex"),2,n.FLOAT,!1,16,0),n.vertexAttribPointer(n.getAttribLocation(a,"coordinate"),2,n.FLOAT,!1,16,8),n.enableVertexAttribArray(0),n.enableVertexAttribArray(1),n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),n.pixelStorei(n.UNPACK_ALIGNMENT,1),o};',"src/lib/_random.js":'var MersenneTwister=function(n){null==n&&(n=(new Date).getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,this.init_genrand(n)};MersenneTwister.prototype.init_genrand=function(n){for(this.mt[0]=n>>>0,this.mti=1;this.mti>>30,this.mt[this.mti]=(1812433253*((4294901760&n)>>>16)<<16)+1812433253*(65535&n)+this.mti,this.mt[this.mti]>>>=0},MersenneTwister.prototype.init_by_array=function(n,t){var i,e,r;for(this.init_genrand(19650218),i=1,e=0,r=this.N>t?this.N:t;r;r--){var u=this.mt[i-1]^this.mt[i-1]>>>30;this.mt[i]=(this.mt[i]^(1664525*((4294901760&u)>>>16)<<16)+1664525*(65535&u))+n[e]+e,this.mt[i]>>>=0,e++,++i>=this.N&&(this.mt[0]=this.mt[this.N-1],i=1),e>=t&&(e=0)}for(r=this.N-1;r;r--){u=this.mt[i-1]^this.mt[i-1]>>>30;this.mt[i]=(this.mt[i]^(1566083941*((4294901760&u)>>>16)<<16)+1566083941*(65535&u))-i,this.mt[i]>>>=0,++i>=this.N&&(this.mt[0]=this.mt[this.N-1],i=1)}this.mt[0]=2147483648},MersenneTwister.prototype.genrand_int32=function(){var n,t=new Array(0,this.MATRIX_A);if(this.mti>=this.N){var i;for(this.mti==this.N+1&&this.init_genrand(5489),i=0;i>>1^t[1&n];for(;i>>1^t[1&n];n=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^n>>>1^t[1&n],this.mti=0}return n=this.mt[this.mti++],n^=n>>>11,n^=n<<7&2636928640,n^=n<<15&4022730752,(n^=n>>>18)>>>0},MersenneTwister.prototype.genrand_int31=function(){return this.genrand_int32()>>>1},MersenneTwister.prototype.genrand_real1=function(){return this.genrand_int32()*(1/4294967295)},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)},MersenneTwister.prototype.genrand_real3=function(){return(this.genrand_int32()+.5)*(1/4294967296)},MersenneTwister.prototype.genrand_res53=function(){return(67108864*(this.genrand_int32()>>>5)+(this.genrand_int32()>>>6))*(1/9007199254740992)};var $builtinmodule=function(n){var t={},i=new MersenneTwister,e=void 0;t.seed=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen("seed",arguments.length,0,1),n=Sk.builtin.asnum$(n),i=arguments.length>0?new MersenneTwister(n):new MersenneTwister,Sk.builtin.none.none$})),t.random=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("random",arguments.length,0,0),new Sk.builtin.float_(i.genrand_res53())}));var toInt=function(n){return 0|n},randrange=function(n,t,e){var r,u,s;if(!Sk.builtin.checkInt(n))throw new Sk.builtin.ValueError("non-integer first argument for randrange()");if(void 0===t)return s=toInt(i.genrand_res53()*n),new Sk.builtin.int_(s);if(!Sk.builtin.checkInt(t))throw new Sk.builtin.ValueError("non-integer stop for randrange()");if(void 0===e&&(e=1),r=t-n,1==e&&r>0)return s=n+toInt(i.genrand_res53()*r),new Sk.builtin.int_(s);if(1==e)throw new Sk.builtin.ValueError("empty range for randrange() ("+n+", "+t+", "+r+")");if(!Sk.builtin.checkInt(e))throw new Sk.builtin.ValueError("non-integer step for randrange()");if(e>0)u=toInt((r+e-1)/e);else{if(!(e<0))throw new Sk.builtin.ValueError("zero step for randrange()");u=toInt((r+e+1)/e)}if(u<=0)throw new Sk.builtin.ValueError("empty range for randrange()");return s=n+e*toInt(i.genrand_res53()*u),new Sk.builtin.int_(s)};t.randint=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen("randint",arguments.length,2,2),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),randrange(n,t+1)})),t.randrange=new Sk.builtin.func((function(n,t,i){return Sk.builtin.pyCheckArgsLen("randrange",arguments.length,1,3),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),i=Sk.builtin.asnum$(i),randrange(n,t,i)})),t.uniform=new Sk.builtin.func((function(n,t){Sk.builtin.pyCheckArgsLen("uniform",arguments.length,2,2),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t);const e=n+i.genrand_res53()*(t-n);return new Sk.builtin.float_(e)})),t.triangular=new Sk.builtin.func((function(n,t,e){var r,u,s;return Sk.builtin.pyCheckArgsLen("triangular",arguments.length,2,3),Sk.builtin.pyCheckType("low","number",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType("high","number",Sk.builtin.checkNumber(t)),(n=Sk.builtin.asnum$(n))>(t=Sk.builtin.asnum$(t))&&(s=n,n=t,t=s),void 0===e||e===Sk.builtin.none.none$?e=(t-n)/2:(Sk.builtin.pyCheckType("mode","number",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e)),u=(r=i.genrand_res53())<(e-n)/(t-n)?n+Math.sqrt(r*(t-n)*(e-n)):t-Math.sqrt((1-r)*(t-n)*(t-e)),new Sk.builtin.float_(u)}));var normalSample=function(n,t){var r,u,s,h,l;return void 0!==e?(l=e,e=void 0):(r=i.genrand_res53(),u=i.genrand_res53(),s=Math.sqrt(-2*Math.log(r)),h=2*Math.PI*u,l=s*Math.cos(h),e=s*Math.sin(h)),n+t*l};return t.gauss=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen("gauss",arguments.length,2,2),Sk.builtin.pyCheckType("mu","number",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType("sigma","number",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),new Sk.builtin.float_(normalSample(n,t))})),t.normalvariate=t.gauss,t.lognormvariate=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen("lognormvariate",arguments.length,2,2),Sk.builtin.pyCheckType("mu","number",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType("sigma","number",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),new Sk.builtin.float_(Math.exp(normalSample(n,t)))})),t.expovariate=new Sk.builtin.func((function(n){Sk.builtin.pyCheckArgsLen("expovariate",arguments.length,1,1),Sk.builtin.pyCheckType("lambd","number",Sk.builtin.checkNumber(n)),n=Sk.builtin.asnum$(n);var t=i.genrand_res53();return new Sk.builtin.float_(-Math.log(t)/n)})),t.choice=new Sk.builtin.func((function(n){if(Sk.builtin.pyCheckArgsLen("choice",arguments.length,1,1),Sk.builtin.pyCheckType("seq","sequence",Sk.builtin.checkSequence(n)),void 0!==n.sq$length){var t=new Sk.builtin.int_(toInt(i.genrand_res53()*n.sq$length()));return n.mp$subscript(t)}throw new Sk.builtin.TypeError("object has no length")})),t.shuffle=new Sk.builtin.func((function(n){if(Sk.builtin.pyCheckArgsLen("shuffle",arguments.length,1,1),Sk.builtin.pyCheckType("x","sequence",Sk.builtin.checkSequence(n)),n.constructor===Sk.builtin.list){const u=n.v;for(var t=u.length-1;t>0;t-=1){var e=u[r=toInt(i.genrand_res53()*(t+1))];u[r]=u[t],u[t]=e}}else{if(void 0===n.sq$length)throw new Sk.builtin.TypeError("object has no length");if(void 0===n.mp$ass_subscript)throw new Sk.builtin.TypeError("object is immutable");for(t=n.sq$length()-1;t>0;t-=1){var r=new Sk.builtin.int_(toInt(i.genrand_res53()*(t+1)));t=new Sk.builtin.int_(t);e=n.mp$subscript(r);n.mp$ass_subscript(r,n.mp$subscript(t)),n.mp$ass_subscript(t,e)}}return Sk.builtin.none.none$})),t.sample=new Sk.builtin.func((function(n,t){var e,r,u,s,h;for(Sk.builtin.pyCheckArgsLen("sample",arguments.length,2,2),Sk.builtin.pyCheckType("population","iterable",Sk.builtin.checkIterable(n)),Sk.builtin.pyCheckType("k","integer",Sk.builtin.checkInt(t)),t=Sk.builtin.asnum$(t),h=[],e=0,s=(u=Sk.abstr.iter(n)).tp$iternext();void 0!==s;e++,s=u.tp$iternext())r=Math.floor(i.genrand_res53()*(e+1)),e(z=e.$d,O)),(e=>{O=e.$d}));return S(L,(()=>{function _strftime(e){return t=>e.$strftime(t).toString().toLowerCase()}function _strftime_timetuple(e,t){return O.strftime.tp$call([new i(e),t]).toString().toLowerCase()}const l=new i("fromordinal");function _struct_time(t){return O.struct_time.tp$call([new s(t.map((t=>new e(t))))])}function _localized_month(){const e=[()=>""];for(let t=0;t<12;t++){const i=new k(2001,t+1,1);e.push(_strftime(i))}return e}function _localized_day(){const e=[];for(let t=0;t<7;t++){const i=new k(2001,1,t+1);e.push(_strftime(i))}return e}const S={__name__:new i("_strptime")},k=z.date,L=z.timedelta,E=z.timezone;function _getlang(){return[t,t]}class LocaleTime{constructor(){this.lang=_getlang(),this.__calc_weekday(),this.__calc_month(),this.__calc_am_pm(),this.__calc_timezone(),this.__calc_date_time()}__calc_weekday(){this.a_weekday=_localized_day().map((e=>e("%a"))),this.f_weekday=_localized_day().map((e=>e("%A")))}__calc_month(){this.a_month=_localized_month().map((e=>e("%b"))),this.f_month=_localized_month().map((e=>e("%B")))}__calc_am_pm(){const e=[];[1,22].forEach((t=>{const i=_strftime_timetuple("%p",_struct_time([1999,3,17,t,44,55,2,76,0]));e.push(i)})),this.am_pm=e}__calc_date_time(){const e=_struct_time([1999,3,17,22,44,55,2,76,0]),i=[t,t,t];i[0]=_strftime_timetuple("%c",e),i[1]=_strftime_timetuple("%x",e),i[2]=_strftime_timetuple("%X",e);const s=[["%","%%"],[this.f_weekday[2],"%A"],[this.f_month[3],"%B"],[this.a_weekday[2],"%a"],[this.a_month[3],"%b"],[this.am_pm[1],"%p"],["1999","%Y"],["99","%y"],["22","%H"],["44","%M"],["55","%S"],["76","%j"],["17","%d"],["03","%m"],["3","%m"],["2","%w"],["10","%I"]];s.push(...this.timezone.flat().map((e=>[e,"%Z"]))),[[0,"%c"],[1,"%x"],[2,"%X"]].forEach((([e,t])=>{let n=i[e];s.forEach((([e,t])=>{e&&(n=n.replace(e,t))}));let a;a=_strftime_timetuple(t,_struct_time([1999,1,3,1,1,1,6,3,0])).includes("00")?"%W":"%U",i[e]=n.replace("11",a)})),this.LC_date_time=i[0],this.LC_date=i[1],this.LC_time=i[2]}__calc_timezone(){try{O.tzset.tp$call([])}catch{}this.tzname=O.tzname.v.map((e=>e.toString())),this.daylight=w(O.daylight);const e=[this.tzname[0].toLowerCase(),"utc","gmt"];let t;t=this.daylight?[this.tzname[1].toLowerCase()]:[],this.timezone=[e,t]}}class TimeRE{constructor(e=null){this.locale_time=e||new LocaleTime,Object.assign(this,{d:"(?3[0-1]|[1-2]\\\\d|0[1-9]|[1-9]| [1-9])",f:"(?[0-9]{1,6})",H:"(?2[0-3]|[0-1]\\\\d|\\\\d)",I:"(?1[0-2]|0[1-9]|[1-9])",G:"(?\\\\d\\\\d\\\\d\\\\d)",j:"(?36[0-6]|3[0-5]\\\\d|[1-2]\\\\d\\\\d|0[1-9]\\\\d|00[1-9]|[1-9]\\\\d|0[1-9]|[1-9])",m:"(?1[0-2]|0[1-9]|[1-9])",M:"(?[0-5]\\\\d|\\\\d)",S:"(?6[0-1]|[0-5]\\\\d|\\\\d)",U:"(?5[0-3]|[0-4]\\\\d|\\\\d)",w:"(?[0-6])",u:"(?[1-7])",V:"(?5[0-3]|0[1-9]|[1-4]\\\\d|\\\\d)",y:"(?\\\\d\\\\d)",Y:"(?\\\\d\\\\d\\\\d\\\\d)",z:"(?[+-]\\\\d\\\\d:?[0-5]\\\\d(:?[0-5]\\\\d(\\\\.\\\\d{1,6})?)?|Z)",A:this.__seqToRE(this.locale_time.f_weekday,"A"),a:this.__seqToRE(this.locale_time.a_weekday,"a"),B:this.__seqToRE(this.locale_time.f_month.slice(1),"B"),b:this.__seqToRE(this.locale_time.a_month.slice(1),"b"),p:this.__seqToRE(this.locale_time.am_pm,"p"),Z:this.__seqToRE(this.locale_time.timezone.flat(),"Z"),"%":"%"}),this.W=this.U.replace("U","W"),this.x=this.pattern(this.locale_time.LC_date),this.X=this.pattern(this.locale_time.LC_time),this.c=this.pattern(this.locale_time.LC_date_time)}__seqToRE(e,t){if((e=e.slice(0).sort(((e,t)=>t.length-e.length))).every((e=>""===e)))return"";return`(?<${t}>${e.map((e=>e)).join("|")})`}pattern(e){let t="";for(e=(e=e.replace(b,"\\\\$1")).replace(v,"\\\\s+");e.includes("%");){const i=e.indexOf("%")+1,s=this[e[i]];if(void 0===s)throw new h(e[i]);t=`${t}${e.slice(0,i-1)}${s}`,e=e.slice(i+1)}return t+e}compile(e){return new RegExp("^"+this.pattern(e),"i")}}let C=new TimeRE;const T=5;let A={};function _strptime(i,s="%a %b %d %H:%M:%S %Y"){function _checkString(e,t){if("string"!=typeof e&&!u(e))throw new m(`strptime() argument ${t} must be a str, not \'${o(e)}\'`)}_checkString(i,0),_checkString(s,1),i=i.toString(),s=s.toString();let n,_=C.locale_time;if(Object.keys(A).length>T&&(A={}),n=A[s],void 0===n)try{n=C.compile(s)}catch(V){if(V instanceof h){let e=V.args.v[0];throw"\\\\"==e&&(e="%"),new d(`\'${e}\' is a bad directive in format \'${s}\'`)}if(V instanceof f)throw new d("stray %% in format \'"+s+"\'");throw V}const c=i.match(n);if(null===c)throw new d(`time data \'${i}\' does not match format \'${s}\'`);if(i.length!==c[0].length)throw new d(`unconverted data remains: ${i.slice(c[0].length)}`);let w=t,p=t,g=1,$=1,y=0,S=0,b=0,v=0,z=-1,L=t,E=0,I=t,M=t,H=t,Y=t,j=t,U=c.groups||{};if(Object.keys(U).forEach((e=>{if(void 0!==U[e])if("y"===e)p=_as_integer(U.y),p+=p<=68?2e3:1900;else if("Y"===e)p=_as_integer(U.Y);else if("G"===e)w=_as_integer(U.G);else if("m"===e)g=_as_integer(U.m);else if("B"===e)g=_.f_month.indexOf(U.B.toLowerCase());else if("b"===e)g=_.a_month.indexOf(U.b.toLowerCase());else if("d"===e)$=_as_integer(U.d);else if("H"===e)y=_as_integer(U.H);else if("H"===e)y=_as_integer(U.H);else if("I"===e){y=_as_integer(U.I);const e=(U.p||"").toLowerCase();["",_.am_pm[0]].includes(e)?12===y&&(y=0):e===_.am_pm[1]&&12!==y&&(y+=12)}else if("M"===e)S=_as_integer(U.M);else if("S"===e)b=_as_integer(U.S);else if("f"===e){let e=U.f;e+="0".repeat(6-e.length),v=_as_integer(e)}else if("A"===e)Y=_.f_weekday.indexOf(U.A.toLowerCase());else if("a"===e)Y=_.a_weekday.indexOf(U.a.toLowerCase());else if("w"===e)Y=_as_integer(U.w),0===Y?Y=6:Y-=1;else if("u"===e)Y=_as_integer(U.u),Y-=1;else if("j"===e)j=_as_integer(U.j);else if(["U","W"].includes(e))M=_as_integer(U[e]),H="U"===e?6:0;else if("V"===e)I=_as_integer(U.V);else if("z"===e){let e=U.z;if("Z"===e)L=0;else{if(":"===e[3]&&(e=e.slice(0,3)+e.slice(4),e.length>5)){if(":"!==e[5]){const e=`Inconsistent use of : in ${U.z}`;throw new d(e)}e=e.slice(0,5)+e.slice(6)}const t=_as_integer(e.slice(1,3)),i=_as_integer(e.slice(3,5)),s=_as_integer(e.slice(5,7)||0);L=3600*t+60*i+s;const n=e.slice(8),a="0".repeat(6-n.length);E=_as_integer(n+a),e.startsWith("-")&&(L=-L,E=-E)}}else if("Z"===e){let e=U.Z.toLowerCase(),t=0;for(let i of _.timezone){if(i.includes(e)){const i=O.tzname.v;if(r(i[0],i[1],"Eq")&&a(O.daylight)&&!["utc","gmt"].includes(e))break;z=t}t++}}})),p===t&&w!==t){if(I===t||Y===t)throw new d("ISO year directive \'%G\' must be used with the ISO week directive \'%V\' and a weekday directive (\'%A\',\'%a\', \'%w\', or \'%u\').");if(j!==t)throw new d("Day of the year directive \'%j\' is not compatible with ISO year directive \'%G\'.Use \'%Y\' instead.")}else if(M===t&&I!==t)throw new d(Y===t?"ISO week directive \'%V\' must be used with the ISO year directive \'%G\' and a weekday directive (\'%A\', \'%a\', \'%w\', or \'%u\').":"ISO week directive \'%V\' is incompatible with the year directive \'%Y\'. Use the ISO year \'%G\' instead.");let x=!1;if(p===t&&2===g&&29===$?(p=1904,x=!0):p===t&&(p=1900),j===t&&Y!==t){if(M!==t){j=function _calc_julian_from_U_or_W(e,t,i,s){let n=(new k(e,1,1).$toOrdinal()+6)%7;return s||(n=(n+1)%7,i=(i+1)%7),0===t?1+i-n:(7-n)%7+7*(t-1)+1+i}(p,M,Y,0===H)}else w!==t&&I!==t&&([p,j]=function _calc_julian_from_V(e,t,i){let s=7*t+i-((new k(e,1,4).$toOrdinal()%7||7)+3);return s<1&&(s+=new k(e,1,1).$toOrdinal(),s-=new k(e-=1,1,1).$toOrdinal()),[e,s]}(w,I,Y+1));if(j!==t&&j<=0){p-=1;const e=function _is_leap(e){return e%4==0&&(e%100!=0||e%400==0)}(p)?366:365;j+=e}}if(j===t)j=new k(p,g,$).$toOrdinal()-new k(p,1,1).$toOrdinal()+1;else{const t=function _fromordinal(t){return k.tp$getattr(l).tp$call([new e(t)])}(j-1+new k(p,1,1).$toOrdinal());p=t.$year,g=t.$month,$=t.$day}Y===t&&(Y=(new k(p,g,$).$toOrdinal()+6)%7);const R=U.Z||t;return x&&(p=1900),[[p,g,$,y,S,b,Y,j,z,R,L],v,E]}return _("_strptime",S,{_strptime_time:{$meth:function _strptime_time(t,i="%a %b %d %H:%M:%S %Y"){let n=_strptime(t,i)[0].slice(0,11);return n=n.map(((t,i)=>i<9?new e(t):p(t))),O.struct_time.tp$call([new s(n)])},$flags:{NamedArgs:["data_string","format"],Defaults:["%a %b %d %H:%M:%S %Y"]}},_strptime_datetime:{$meth:function _strptime_datetime(s,r,l="%a %b %d %H:%M:%S %Y"){const[o,_,c]=_strptime(r,l),[m,d]=o.slice(-2),h=o.slice(0,6);let f,u;return h.push(_),h.map((t=>new e(t))),d!==t&&(f=new L(0,d,c),u=a(m)?new E(f,new i(m)):new E(f),h.push(u)),n(s,h)},$flags:{NamedArgs:["cls","data_string","format"],Defaults:["%a %b %d %H:%M:%S %Y"]}},_strptime:{$meth(i,n){const a=_strptime(i,n);return a[0]=new s(a[0].map((i=>i===t?i:new e(i)))),a[1]=new e(a[1]),a[2]=new e(a[2]),new s(a)},$flags:{NamedArgs:["data_string","format"],Defaults:["%a %b %d %H:%M:%S %Y"]}},_getlang:{$meth:()=>p(_getlang()),$flags:{NoArgs:!0}}}),S.LocaleTime=c("_strptime.LocaleTime",{constructor:function(){this.v=new LocaleTime},slots:{tp$getattr(e,t){return this.v.hasOwnProperty(e.toString())?p(this.v[e.toString()]):$.call(this,e,t)},tp$setattr(e,t){if(!this.v.hasOwnProperty(e.toString()))return y.call(this,e,t);this.v[e.toString()]=g(t)}}}),S}))}',"src/lib/altair/vega_caller.js":'var $builtinmodule=function(e){var n={__file__:"/src/lib/vega_caller.js"};return n.__package__=Sk.builtin.none.none$,n.render_graph=new Sk.builtin.func((function(e){Sk.builtin.pyCheckArgs("render_graph",arguments,1,1);let n="#"+Sk.divid+"_graphics";try{vegaEmbed(n,Sk.ffi.remapToJs(e),{actions:!0})}catch(i){throw new Sk.builtin.Exception("Error in graph specification unable to render the graph\\n"+i.message)}})),n};',"src/lib/array.js":'function $builtinmodule(e){var n={},t=["c","b","B","u","h","H","i","I","l","L","f","d"];return n.__name__=new Sk.builtin.str("array"),n.array=Sk.misceval.buildClass(n,(function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){if(Sk.builtin.pyCheckArgsLen("__init__",arguments.length,2,3),-1==t.indexOf(Sk.ffi.remapToJs(n)))throw new Sk.builtin.ValueError("bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");if(i&&!Sk.builtin.checkIterable(i))throw new Sk.builtin.TypeError("iteration over non-sequence");if(e.$d.mp$ass_subscript(new Sk.builtin.str("typecode"),n),e.$d.mp$ass_subscript(new Sk.builtin.str("__module__"),new Sk.builtin.str("array")),e.typecode=n,void 0===i)e.internalIterable=new Sk.builtin.list;else if(i instanceof Sk.builtin.list)e.internalIterable=i;else{e.internalIterable=new Sk.builtin.list;for(let n=Sk.abstr.iter(i),t=n.tp$iternext();void 0!==t;t=n.tp$iternext())Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,t])}})),n.__repr__=new Sk.builtin.func((function(e){var n=Sk.ffi.remapToJs(e.typecode),t="";return Sk.ffi.remapToJs(e.internalIterable).length&&(t="c"==Sk.ffi.remapToJs(e.typecode)?", \'"+Sk.ffi.remapToJs(e.internalIterable).join("")+"\'":", "+Sk.ffi.remapToJs(Sk.misceval.callsimArray(e.internalIterable.__repr__,[e.internalIterable]))),new Sk.builtin.str("array(\'"+n+"\'"+t+")")})),n.__str__=n.__repr__,n.__getattribute__=new Sk.builtin.func((function(e,n){return e.tp$getattr(n)})),n.append=new Sk.builtin.func((function(e,n){return Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,n]),Sk.builtin.none.none$})),n.extend=new Sk.builtin.func((function(e,n){if(Sk.builtin.pyCheckArgsLen("__init__",arguments.length,2,2),!Sk.builtin.checkIterable(n))throw new Sk.builtin.TypeError("iteration over non-sequence");for(let t=Sk.abstr.iter(n),i=t.tp$iternext();void 0!==i;i=t.tp$iternext())Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,i])}))}),"array",[]),n}',"src/lib/calendar.js":'function $builtinmodule(e){const t={},{misceval:{chain:n},importModule:r}=Sk,importOrSuspend=e=>r(e,!1,!0);return n(importOrSuspend("datetime"),(e=>(t.datetime=e,importOrSuspend("itertools"))),(e=>(t.iterRepeat=e.$d.repeat,t.iterChain=e.$d.chain,calendarModule(t))))}function calendarModule(e){const{abstr:{setUpModuleMethods:t,numberBinOp:n,iter:r,objectGetItem:o},builtin:{bool:s,bool:{true$:m,false$:d},func:l,int_:i,list:c,none:{none$:f},str:h,slice:w,tuple:y,range:u,max:_,min:g,property:k,print:p,enumerate:$,ValueError:b},ffi:{remapToPy:M},misceval:{isTrue:T,iterator:C,arrayFromIterable:O,buildClass:L,richCompareBool:x,asIndexOrThrow:F,objectRepr:I,callsimArray:A},global:v,global:{strftime:E}}=Sk,S=new i(0),H=new i(1),D=new i(2),N=new i(3),R=new i(6),j=new i(7),J=new i(9),P=new i(12),Y=new i(13),U=new i(24),z=new i(60),le=(e,t)=>x(e,t,"LtE"),eq=(e,t)=>x(e,t,"Eq"),mod=(e,t)=>n(e,t,"Mod"),add=(e,t)=>n(e,t,"Add"),sub=(e,t)=>n(e,t,"Sub"),mul=(e,t)=>n(e,t,"Mult"),inc=e=>add(e,H),dec=e=>sub(e,H),mod7=e=>mod(e,j),getA=(e,t)=>e.tp$getattr(new h(t)),callA=(e,t,...n)=>A(e.tp$getattr(new h(t)),n);function*iterJs(e){const t=r(e);let n;for(;n=t.tp$iternext();)yield n}function iterFn(e,t){return e=r(e),new C((()=>{const n=e.tp$iternext();return n&&t(n)}),!0)}function makePyMethod(e,t,{args:n,name:r,doc:o,defaults:s}){t.co_varnames=["self",...n||[]],t.co_docstring=o?new h(o):f,s&&(t.$defaults=s),t.co_name=new h(r),t.co_qualname=new h(e+"."+r);const m=new l(t);return m.$module=Q.__name__,m}const{datetime:B,iterRepeat:W,iterChain:q}=e;let{MINYEAR:G,MAXYEAR:X,date:V}=B.$d;const K=getA(h,"center"),pyCenter=(e,t)=>A(K,[e,t]),pyRStrip=e=>new h(e.toString().trimRight());G=G.valueOf(),X=X.valueOf();const Q={__name__:new h("calendar"),__all__:M(["IllegalMonthError","IllegalWeekdayError","setfirstweekday","firstweekday","isleap","leapdays","weekday","monthrange","monthcalendar","prmonth","month","prcal","calendar","timegm","month_name","month_abbr","day_name","day_abbr","Calendar","TextCalendar","HTMLCalendar","LocaleTextCalendar","LocaleHTMLCalendar","weekheader"])};function makeErr(e,t){return L(Q,((e,n)=>{n.__init__=new l((function __init__(e,t){e.$attr=t})),n.__str__=new l((function __str__(e){return new h(t.replace("$",I(e.$attr)))}))}),e,[b])}const Z=makeErr("IllegalMonthError","bad month $; must be 1-12"),ee=makeErr("IllegalWeekdayError","bad weekday number $; must be 0 (Monday) to 6 (Sunday)"),te=1,ae=2,ne=[0,31,28,31,30,31,30,31,31,30,31,30,31];function mkLocalizedCls(e,t){t.__init__=new l((function __init__(e,t){e.format=t})),t.__getitem__=new l((function __getitem__(t,n){const r=o(e,n);if(n instanceof w){const e=[];for(const n of r.valueOf())e.push(A(n,[t.format]));return new c(e)}return A(r,[t.format])}));const n=new i(e.valueOf().length);t.__len__=new l((function __len__(e){return n}))}const re=new h("strftime"),oe=L(Q,((e,t)=>{let n=[new l((e=>h.$empty))];for(let r=0;r<12;r++){const e=new V(2001,r+1,1);n.push(e.tp$getattr(re))}n=new c(n),t._months=n,mkLocalizedCls(n,t)}),"_localized_month"),se=L(Q,((e,t)=>{let n=[];for(let r=0;r<7;r++){const e=new V(2001,1,r+1);n.push(e.tp$getattr(re))}n=new c(n),t._days=n,mkLocalizedCls(n,t)}),"_localized_day"),me=A(se,[new h("%A")]),de=A(se,[new h("%a")]),ie=A(oe,[new h("%B")]),ce=A(oe,[new h("%b")]),[fe,he,we,ye,ue,_e,ge]=[0,1,2,3,4,5,6];function isleap(e){return(e=F(e))%4==0&&(e%100!=0||e%400==0)}function weekday(e,t,n){e=F(e),G<=e&&e<=X||(e=2e3+e%400);const r=A(V,[new i(e),t,n]);return callA(V,"weekday",r)}function monthrange(e,t){if(!le(H,t)||!le(t,P))throw A(Z,[t]);const n=weekday(e,t,H);t=F(t);const r=ne[t]+Number(t===ae&&isleap(e));return[n,new i(r)]}function iterweekdays(e){return iterFn(A(u,[e.fwd,add(e.fwd,j)]),mod7)}function itermonthdates(e,t,n){return iterFn(itermonthdays3(e,t,n),(e=>A(V,e.valueOf())))}function itermonthdays(e,t,n){const[r,o]=monthrange(t,n),s=mod7(sub(r,e.fwd)),m=A(W,[S,s]),d=A(u,[H,inc(o)]),l=mod7(sub(e.fwd,add(r,o))),i=A(W,[S,l]);return A(q,[m,d,i])}function itermonthdays2(e,t,n){return iterFn(A($,[itermonthdays(e,t,n),e.fwd]),(e=>{const[t,n]=e.valueOf();return new y([n,mod7(t)])}))}function itermonthdays3(e,t,n){const ymdIter=(e,t,n)=>iterFn(n,(n=>new y([e,t,n]))),[r,o]=monthrange(t,n),s=mod7(sub(r,e.fwd)),m=mod7(sub(e.fwd,add(r,o))),[d,l]=function _prevmonth(e,t){return eq(t,H)?[dec(e),P]:[e,dec(t)]}(t,n),c=inc(function _monthlen(e,t){return t=F(t),new i(ne[t]+Number(t===ae&&isleap(e)))}(d,l)),f=A(u,[sub(c,s),c]),h=A(u,[H,inc(o)]),[w,_]=function _nextmonth(e,t){return eq(t,P)?[inc(e),H]:[e,inc(t)]}(t,n),g=A(u,[H,inc(m)]);return A(q,[ymdIter(d,l,f),ymdIter(t,n,h),ymdIter(w,_,g)])}function itermonthdays4(e,t,n){const r=itermonthdays3(e,t,n);let o=0;return iterFn(r,(t=>new y([...t.valueOf(),mod7(add(e.fwd,new i(o++)))])))}function _monthIter(e,t,n,r){const o=O(e(t,n,r)),s=[];for(let m=0;m{const n=makePyMethod.bind(null,"Calendar"),r=["firstweekday"],o=["year","month"],s=["year","width"],m={__init__:n((function __init__(e,t){return Object.defineProperty(e,"fwd",{get(){return mod7(this._fwd)},set(e){return this._fwd=e,!0}}),e.fwd=t,f}),{name:"__init__",args:r,defaults:[S]}),getfirstweekday:n((function getfirstweekday(e){return e.fwd}),{name:"getfirstweekday"}),setfirstweekday:n((function setfirstweekday(e,t){return e.fwd=t,f}),{name:"setfirstweekday",args:r}),iterweekdays:n(iterweekdays,{name:"iterweekdays"}),itermonthdates:n(itermonthdates,{name:"itermonthdates",args:o}),itermonthdays:n(itermonthdays,{name:"itermonthdays",args:o}),itermonthdays2:n(itermonthdays2,{name:"itermonthdays2",args:o}),itermonthdays3:n(itermonthdays3,{name:"itermonthdays3",args:o}),itermonthdays4:n(itermonthdays4,{name:"itermonthdays4",args:o}),monthdatescalendar:n(monthdatescalendar,{name:"monthdatescalendar",args:o}),monthdays2calendar:n(monthdays2calendar,{name:"monthdays2calendar",args:o}),monthdayscalendar:n(monthdayscalendar,{name:"monthdayscalendar",args:o}),yeardatescalendar:n(yeardatescalendar,{name:"yeardatescalendar",args:s,defaults:[N]}),yeardays2calendar:n(yeardays2calendar,{name:"yeardays2calendar",args:s,defaults:[N]}),yeardayscalendar:n(yeardayscalendar,{name:"yeardayscalendar",args:s,defaults:[N]})};m.firstweekday=new k(m.getfirstweekday,m.setfirstweekday),Object.assign(t,m)}),"Calendar");function doTextFormatweekday(e,t,n){let r;return r=x(n,J,"GtE")?me:de,pyCenter(o(o(r,t),new w(f,n)),n)}function doTextFormatmonthname(e,t,n,r,s=!0){let m=o(ie,n);return T(s)&&(m=mod(new h("%s %r"),new y([m,t]))),pyCenter(m,r)}const pe=L(Q,((e,t)=>{const txtPrint=e=>p([e],["end",h.$empty]);const n=doTextFormatweekday;function formatweekheader(e,t){const n=[];for(const r of iterJs(iterweekdays(e)))n.push(callA(e,"formatweekday",r,t).toString());return new h(n.join(" "))}const r=doTextFormatmonthname;const o=makePyMethod.bind(null,"TextCalendar"),s={prweek:o((function prweek(e,t,n){txtPrint(callA(e,"formatweek",t,n))}),{name:"prweek",args:["theweek","width"]}),formatday:o((function formatday(e,t,n,r){let o;return o=eq(t,S)?h.$empty:mod(new h("%2i"),t),pyCenter(o,r)}),{name:"formatday",args:["day","weekday","width"]}),formatweek:o((function formatweek(e,t,n){const r=[];for(const o of iterJs(t)){const[t,s]=o.valueOf();r.push(callA(e,"formatday",t,s,n).toString())}return new h(r.join(" "))}),{name:"formatweek",args:["theweek","width"]}),formatweekday:o(n,{name:"formatweekday",args:["day","width"]}),formatweekheader:o(formatweekheader,{name:"formatweekheader",args:["width"]}),formatmonthname:o(r,{name:"formatmonthname",args:["theyear","themonth","width","withyear"],defaults:[m]}),prmonth:o((function prmonth(e,t,n,r,o){txtPrint(callA(e,"formatmonth",t,n,r,o))}),{name:"prmonth",args:["theyear","themonth","w","l"],defaults:[S,S]}),formatmonth:o((function formatmonth(e,t,n,r,o){const addNewLines=e=>new h(e+"\\n".repeat(o.valueOf()));r=_([D,r]),o=_([H,o]);let s=callA(e,"formatmonthname",t,n,dec(mul(j,inc(r))),!0);s=pyRStrip(s),s=addNewLines(s),s=add(s,pyRStrip(callA(e,"formatweekheader",r))),s=addNewLines(s);for(const m of iterJs(monthdays2calendar(e,t,n)))s=add(s,pyRStrip(callA(e,"formatweek",m,r))),s=addNewLines(s);return s}),{name:"formatmonth",args:["thyear","themonth","w","l"],defaults:[S,S]}),formatyear:o((function formatyear(e,t,n,r,o,s){n=_([D,n]),r=_([H,r]),o=_([D,o]);const m=dec(mul(inc(n),j));let d="";const a=e=>d+=e;a(pyRStrip(pyCenter(t.$r(),add(mul(m,s),mul(o,dec(s)))))),a("\\n".repeat(r));const l=formatweekheader(e,n);let f=0;for(const w of iterJs(yeardays2calendar(e,t,s))){const d=new i(f),y=inc(mul(s,d)),_=g([inc(mul(s,inc(d))),Y]),k=A(u,[y,_]);a("\\n".repeat(r));const p=iterFn(k,(n=>callA(e,"formatmonthname",t,n,m,!1)));a(pyRStrip(formatstring(p,m,o))),a("\\n".repeat(r));const $=iterFn(k,(e=>l));a(pyRStrip(formatstring($,m,o))),a("\\n".repeat(r));const b=Math.max(...w.valueOf().map((e=>e.valueOf().length)));for(let t=0;t=r.length?s.push(h.$empty):s.push(callA(e,"formatweek",r[t],n));a(pyRStrip(formatstring(new c(s),m,o))),a("\\n".repeat(r))}f++}return new h(d)}),{name:"formatyear",args:["theyear","w","l","c","m"],defaults:[D,H,R,N]}),pryear:o((function pryear(e,t,n,r,o,s){txtPrint(callA(e,"formatyear",t,n,r,o,s))}),{name:"pryear",args:["theyear","w","l","c","m"],defaults:[S,S,R,N]})};Object.assign(t,s)}),"TextCalendar",[ke]);function doHtmlFormatweekday(e,t){return new h(`${o(de,t)}`)}function doHtmlFormatmonthname(e,t,n,r=!0){let s=""+o(ie,n);return T(r)&&(s+=" "+t),new h(`${s}`)}const $e=L(Q,((e,t)=>{const n=M(["mon","tue","wed","thu","fri","sat","sun"]),r=n,s=new h("noday"),d=new h("month"),l=d,c=new h("year"),w=c,u=new h(\' \'),g=new h(\'%d\');const k=doHtmlFormatweekday;function formatweekheader(e){let t="";for(const n of iterJs(iterweekdays(e)))t+=callA(e,"formatweekday",n);return new h(`${t}`)}const p=doHtmlFormatmonthname;const $=makePyMethod.bind(null,"HTMLCalendar"),b={formatday:$((function formatday(e,t,n){return eq(t,S)?mod(u,getA(e,"cssclass_noday")):mod(g,new y([o(getA(e,"cssclasses"),n),t]))}),{name:"formatday",args:["day","weekday"]}),formatweek:$((function formatweek(e,t){let n="";for(const r of iterJs(t)){const[t,o]=r.valueOf();n+=callA(e,"formatday",t,o)}return new h(`${n}`)}),{name:"formatweek",args:["theweek"]}),formatweekday:$(k,{name:"formatweekday",args:["day"]}),formatweekheader:$(formatweekheader,{name:"formatweekheader"}),formatmonthname:$(p,{name:"formatmonthname",args:["theyear","themonth","withyear"],defaults:[m]}),formatmonth:$((function formatmonth(e,t,n,r=!0){let o="";const a=e=>o+=e+"\\n";a(``),a(callA(e,"formatmonthname",t,n,r)),a(formatweekheader(e));for(const s of iterJs(monthdays2calendar(e,t,n)))a(callA(e,"formatweek",s));return a("
    "),new h(o)}),{name:"formatmonth",args:["thyear","themonth","withyear"],defaults:[m]}),formatyear:$((function formatyear(e,t,n){let r="";const a=e=>r+=e;n=_([n,H]).valueOf(),a(``),a("\\n"),a(``);for(let o=te;o");const r=Math.min(o+n,13);for(let n=o;n"),a(callA(e,"formatmonth",t,new i(n),!1)),a("");a("")}return a("
    ${t}
    "),new h(r)}),{name:"formatyear",args:["theyear","width"],defaults:[N]}),formatyearpage:$((function formatyearpage(e,t,n=3,r="calendar.css",o=null){null!==o&&o!==f||(o=new h("utf-8"));let s="";const a=e=>s+=e;return a(`\\n`),a(\'\\n\'),a("\\n"),a("\\n"),a(`\\n`),r!==f&&a(`\\n`),a(`Calendar for ${t}\\n`),a("\\n"),a("\\n"),a(callA(e,"formatyear",t,n)),a("\\n"),a("\\n"),callA(h,"encode",new h(s),o,new h("ignore"))}),{name:"formatyearpage",args:["theyear","width","css","encoding"],defaults:[N,new h("calendar.css"),new h("utf-8")]}),cssclasses:n,cssclasses_weekday_head:r,cssclass_noday:s,cssclass_month_head:d,cssclass_month:l,cssclass_year_head:c,cssclass_year:w};Object.assign(t,b)}),"HTMLCalendar",[ke]);function withLocale(e,t){const n=E.localizeByIdentifier(e.toString());v.strftime=n;try{return t()}finally{v.strftime=E}}function localInit(e,t){T(t)||(t=new h("en_US")),e.locale=t}const be=L(Q,((e,t)=>{const n=makePyMethod.bind(null,"LocaleTextCalendar"),r={__init__:n((function __init__(e,t,n){return callA(pe,"__init__",e,t),localInit(e,n),f}),{name:"__init__",args:["firstweekday","locale"],defaults:[S,f]}),formatweekday:n((function formatweekday(e,t,n){return withLocale(e.locale,(()=>doTextFormatweekday(0,t,n)))}),{name:"formatweekday",args:["day","width"]}),formatmonthname:n((function formatmonthname(e,t,n,r,o){return withLocale(e.locale,(()=>doTextFormatmonthname(0,t,n,r,o)))}),{name:"formatmonthname",args:["theyear","themonth","width","withyear"],defaults:[m]})};Object.assign(t,r)}),"LocaleTextCalendar",[pe]),Me=L(Q,((e,t)=>{const n=makePyMethod.bind(null,"LocaleHTMLCalendar"),r={__init__:n((function __init__(e,t,n){return callA($e,"__init__",e,t),localInit(e,n),f}),{name:"__init__",args:["firstweekday","locale"],defaults:[S,f]}),formatweekday:n((function formatweekday(e,t){return withLocale(e.locale,(()=>doHtmlFormatweekday(e,t)))}),{name:"formatweekday",args:["day"]}),formatmonthname:n((function formatmonthname(e,t,n,r){return withLocale(e.locale,(()=>doHtmlFormatmonthname(e,t,n,r)))}),{name:"formatmonthname",args:["theyear","themonth","withyear"],defaults:[m]})};Object.assign(t,r)}),"LocaleHTMLCalendar",[$e]),Te=A(pe,[]);Object.assign(Q,{IllegalMonthError:Z,IllegalWeekdayError:ee,day_name:me,month_name:ie,day_abbr:de,month_abbr:ce,January:new i(te),February:new i(ae),mdays:M(ne),MONDAY:new i(fe),TUESDAY:new i(he),WEDNESDAY:new i(we),THURSDAY:new i(ye),FRIDAY:new i(ue),SATURDAY:new i(_e),SUNDAY:new i(ge),Calendar:ke,TextCalendar:pe,HTMLCalendar:$e,LocaleTextCalendar:be,LocaleHTMLCalendar:Me,c:Te,firstweekday:getA(Te,"getfirstweekday"),monthcalendar:getA(Te,"monthdayscalendar"),prweek:getA(Te,"prweek"),week:getA(Te,"formatweek"),weekheader:getA(Te,"formatweekheader"),prmonth:getA(Te,"prmonth"),month:getA(Te,"formatmonth"),calendar:getA(Te,"formatyear"),prcal:getA(Te,"pryear")});const Ce=new i(20),Oe=R;function formatstring(e,t,n){t||(t=Ce),n||(n=Oe),n=mul(n,new h(" "));const r=[];for(const o of iterJs(e))r.push(pyCenter(o,t).toString());return new h(r.join(n.toString()))}const Le=getA(V,"toordinal"),xe=A(Le,[new V(1970,1,1)]);return t("calendar",Q,{isleap:{$meth:e=>s(isleap(e)),$flags:{NamedArgs:["year"]},$doc:"Return True for leap years, False for non-leap years"},leapdays:{$meth(e,t){e=F(e)-1,t=F(t)-1;const n=Math.floor;return new i(n(t/4)-n(e/4)-(n(t/100)-n(e/100))+(n(t/400)-n(e/400)))},$flags:{MinArgs:2,MaxArgs:2}},weekday:{$meth:weekday,$flags:{NamedArgs:["year","month","day"]},$doc:"Return weekday (0-6 ~ Mon-Sun) for year, month (1-12), day (1-31)."},monthrange:{$meth:(e,t)=>new y(monthrange(e,t)),$flags:{NamedArgs:["year","month"]},$doc:"Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month."},setfirstweekday:{$meth(e){const t=F(e);if(!(fe<=t&&t<=ge))throw A(ee,[e]);Te.fwd=e},$flags:{NamedArgs:["firstweekday"]}},format:{$meth:function format(e,t,n){return p([formatstring(e,t,n)]),f},$flags:{NamedArgs:["cols","colwidth","spacing"],Defaults:[Ce,Oe]}},formatstring:{$meth:formatstring,$flags:{NamedArgs:["cols","colwidth","spacing"],Defaults:[Ce,Oe]}},timegm:{$meth(e){const[t,n,r,o,s,m]=e.valueOf(),d=A(V,[t,n,H]),l=A(Le,[d]),i=add(sub(l,xe),dec(r)),c=add(mul(i,U),o),f=add(mul(c,z),s);return add(mul(f,z),m)},$flags:{OneArg:!0}}}),Q}',"src/lib/cellbotics/__init__.js":'"use strict";function promiseToPy(e){const n=new Sk.misceval.Suspension;let i,t;return n.resume=function(){if(t)throw t;return i},n.data={type:"Sk.promise",promise:e.then((function(e){return i=e,e}),(function(e){return t=e,e}))},n}function remapToPy(e){return e instanceof Promise&&(e=promiseToPy(e)),Sk.ffi.remapToPy(e)}function remapToJsFunc(e,...n){return function(...i){n&&Sk.builtin.pyCheckArgs(e.name,i,...n),i=i.slice(1);return remapToPy(e(...i.map((e=>Sk.ffi.remapToJs(e)))))}}var $builtinmodule=function(e){return remapToPy(Promise.all([runestoneComponents.runestone_import("ble"),runestoneComponents.runestone_import("simple_sensor")]).then((([e,n])=>{const i={__name__:new Sk.builtin.str("cellbotics")},get_self=e=>e&&e.__js_class;i.JsProperty=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs("__init__",e,2,2);const[n,i]=e;n.__js_property=Sk.ffi.remapToJs(i)})),n.__get__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs("__get__",e,2,3);const[n,i,t]=e;return remapToPy(get_self(i)[n.__js_property])}))}),"JsProperty",[]);const prop_wrap=e=>Sk.misceval.callsim(i.JsProperty,new Sk.builtins.str(e)),t=e.cell_bot_ble_gui.cell_bot_ble;t&&(i.CellBot=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(e){if(!t.paired())throw"The CellBot is not paired. Click on the Pair button before running your program.";return remapToPy(t.resetHardware().then((()=>{})))})),n.INPUT=new Sk.builtin.int_(t.INPUT),n.OUTPUT=new Sk.builtin.int_(t.OUTPUT);const wrap=(e,n)=>new Sk.builtin.func(remapToJsFunc(e,n,n));n.resetHardware=wrap(t.resetHardware,1),n.pinMode=wrap(t.pinMode,3),n.digitalWrite=wrap(t.digitalWrite,3),n.digitalRead=wrap(t.digitalRead,2),n.ledcSetup=wrap(t.ledcSetup,4),n.ledcAttachPin=wrap(t.ledcAttachPin,3),n.ledcDetachPin=wrap(t.ledcDetachPin,2),n.ledcWrite=wrap(t.ledcWrite,3)}),"CellBot",[]));const method_wrap=(e,n)=>new Sk.builtin.func(((...i)=>remapToJsFunc(get_self(i[0])[e],n,n)(...i)));i._Sensor=Sk.misceval.buildClass(i,(function(e,n){n.start=method_wrap("start",1),n.stop=method_wrap("stop",1)}),"_Sensor",[]),i._XYZSensor=Sk.misceval.buildClass(i,(function(e,n){n.x=prop_wrap("x"),n.y=prop_wrap("y"),n.z=prop_wrap("z")}),"_XYZSensor",[i._Sensor]),i._OrientationSensor=Sk.misceval.buildClass(i,(function(e,n){n.quaternion=prop_wrap("quaternion")}),"_OrientationSensor",[i._Sensor]);const sensor_factory=(e,n,t)=>i[e]=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs("__init__",[e],1,1),e[0].__js_class=new t}))}),e,[n]);return i.AmbientLightSensor=Sk.misceval.buildClass(i,(function(e,i){i.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs("__init__",[e],1,1),e[0].__js_class=new n.SimpleAmbientLightSensor})),i.illuminance=prop_wrap("illuminance")}),"AmbientLightSensor",[i._Sensor]),i.GeolocationSensor=Sk.misceval.buildClass(i,(function(e,i){i.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs("__init__",[e],1,1),e[0].__js_class=new n.SimpleGeolocationSensor})),i.latitude=prop_wrap("latitude"),i.longitude=prop_wrap("longitude"),i.altitude=prop_wrap("altitude"),i.accuracy=prop_wrap("accuracy"),i.altitudeAccuracy=prop_wrap("altitudeAccuracy"),i.heading=prop_wrap("heading"),i.speed=prop_wrap("speed")}),"GeolocationSensor",[i._Sensor]),sensor_factory("Accelerometer",i._XYZSensor,n.SimpleAccelerometer),sensor_factory("Gyroscope",i._XYZSensor,n.SimpleGyroscope),sensor_factory("Magnetometer",i._XYZSensor,n.SimpleMagnetometer),sensor_factory("LinearAccelerationSensor",i._XYZSensor,n.SimpleLinearAccelerationSensor),sensor_factory("GravitySensor",i._XYZSensor,n.SimpleGravitySensor),sensor_factory("AbsoluteOrientationSensor",i._OrientationSensor,n.SimpleAbsoluteOrientationSensor),sensor_factory("RelativeOrientationSensor",i._OrientationSensor,n.SimpleRelativeOrientationSensor),i})))};',"src/lib/collections.js":'function $builtinmodule(t){const e={};return Sk.misceval.chain(Sk.importModule("keyword",!1,!0),(t=>(e._iskeyword=t.$d.iskeyword,Sk.importModule("itertools",!1,!0))),(t=>(e._chain=t.$d.chain,e._starmap=t.$d.starmap,e._repeat=t.$d.repeat,Sk.importModule("operator",!1,!0))),(t=>{e._itemgetter=t.$d.itemgetter}),(()=>collections_mod(e)))}function collections_mod(t){function counterNumberSlot(e){return function(i){if(void 0!==i&&!(i instanceof t.Counter))return Sk.builtin.NotImplemented.NotImplemented$;const s=new t.Counter;return e.call(this,s,i),s}}function counterInplaceSlot(t,e){return function(i){if(!(i instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError("Counter "+t+"= "+Sk.abstr.typeName(i)+" is not supported");return e.call(this,i),this.keep$positive()}}t.__all__=new Sk.builtin.list(["deque","defaultdict","namedtuple","Counter","OrderedDict"].map((t=>new Sk.builtin.str(t)))),t.defaultdict=Sk.abstr.buildNativeClass("collections.defaultdict",{constructor:function defaultdict(t,e){this.default_factory=t,Sk.builtin.dict.call(this,e)},base:Sk.builtin.dict,methods:{copy:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__copy__:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__missing__:{$meth(t){if(Sk.builtin.checkNone(this.default_factory))throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(t));{const e=Sk.misceval.callsimArray(this.default_factory,[]);return this.mp$ass_subscript(t,e),e}},$flags:{OneArg:!0}}},getsets:{default_factory:{$get(){return this.default_factory},$set(t){t=t||Sk.builtin.none.none$,this.default_factory=t}}},slots:{tp$doc:"defaultdict(default_factory[, ...]) --\\x3e dict with default factory\\n\\nThe default factory is called without arguments to produce\\na new value when a key is not present, in __getitem__ only.\\nA defaultdict compares equal to a dict with the same items.\\nAll remaining arguments are treated the same as if they were\\npassed to the dict constructor, including keyword arguments.\\n",tp$init(t,e){const i=t.shift();if(void 0===i)this.default_factory=Sk.builtin.none.none$;else{if(!Sk.builtin.checkCallable(i)&&!Sk.builtin.checkNone(i))throw new Sk.builtin.TypeError("first argument must be callable");this.default_factory=i}return Sk.builtin.dict.prototype.tp$init.call(this,t,e)},$r(){const t=Sk.misceval.objectRepr(this.default_factory),e=Sk.builtin.dict.prototype.$r.call(this).v;return new Sk.builtin.str("defaultdict("+t+", "+e+")")}},proto:{$copy(){const e=[];return Sk.misceval.iterFor(Sk.abstr.iter(this),(t=>{e.push(t),e.push(this.mp$subscript(t))})),new t.defaultdict(this.default_factory,e)}}}),t.Counter=Sk.abstr.buildNativeClass("Counter",{constructor:function Counter(){this.$d=new Sk.builtin.dict,Sk.builtin.dict.apply(this)},base:Sk.builtin.dict,methods:{elements:{$flags:{NoArgs:!0},$meth(){const e=t._chain.tp$getattr(new Sk.builtin.str("from_iterable")),i=t._starmap,s=t._repeat,n=Sk.misceval.callsimArray;return n(e,[n(i,[s,n(this.tp$getattr(this.str$items))])])}},most_common:{$flags:{NamedArgs:["n"],Defaults:[Sk.builtin.none.none$]},$meth(t){const e=this.sq$length();t=Sk.builtin.checkNone(t)||(t=Sk.misceval.asIndexOrThrow(t))>e?e:t<0?0:t;const i=this.$items().sort(((t,e)=>Sk.misceval.richCompareBool(t[1],e[1],"Lt")?1:Sk.misceval.richCompareBool(t[1],e[1],"Gt")?-1:0));return new Sk.builtin.list(i.slice(0,t).map((t=>new Sk.builtin.tuple(t))))}},update:{$flags:{FastCall:!0},$meth(t,e){return Sk.abstr.checkArgsLen("update",t,0,1),this.counter$update(t,e)}},subtract:{$flags:{FastCall:!0},$meth(t,e){Sk.abstr.checkArgsLen("subtract",t,0,1);const i=t[0];if(void 0!==i)if(i instanceof Sk.builtin.dict)for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,i.mp$subscript(n),"Sub"))}else for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,this.$one,"Sub"))}e=e||[];for(let s=0;s>> c = Counter(\'abcdeabcdabcaba\') # count elements from a string\\n\\n >>> c.most_common(3) # three most common elements\\n [(\'a\', 5), (\'b\', 4), (\'c\', 3)]\\n >>> sorted(c) # list all unique elements\\n [\'a\', \'b\', \'c\', \'d\', \'e\']\\n >>> \'\'.join(sorted(c.elements())) # list elements with repetitions\\n \'aaaaabbbbcccdde\'\\n >>> sum(c.values()) # total of all counts\\n 15\\n\\n >>> c[\'a\'] # count of letter \'a\'\\n 5\\n >>> for elem in \'shazam\': # update counts from an iterable\\n ... c[elem] += 1 # by adding 1 to each element\'s count\\n >>> c[\'a\'] # now there are seven \'a\'\\n 7\\n >>> del c[\'b\'] # remove all \'b\'\\n >>> c[\'b\'] # now there are zero \'b\'\\n 0\\n\\n >>> d = Counter(\'simsalabim\') # make another counter\\n >>> c.update(d) # add in the second counter\\n >>> c[\'a\'] # now there are nine \'a\'\\n 9\\n\\n >>> c.clear() # empty the counter\\n >>> c\\n Counter()\\n\\n Note: If a count is set to zero or reduced to zero, it will remain\\n in the counter until the entry is deleted or the counter is cleared:\\n\\n >>> c = Counter(\'aaabbc\')\\n >>> c[\'b\'] -= 2 # reduce the count of \'b\' by two\\n >>> c.most_common() # \'b\' is still in, but its count is zero\\n [(\'a\', 3), (\'c\', 1), (\'b\', 0)]\\n\\n",tp$init(t,e){return Sk.abstr.checkArgsLen(this.tpjs_name,t,0,1),this.counter$update(t,e)},$r(){const t=this.size>0?Sk.builtin.dict.prototype.$r.call(this).v:"";return new Sk.builtin.str(Sk.abstr.typeName(this)+"("+t+")")},tp$as_sequence_or_mapping:!0,mp$ass_subscript(t,e){return void 0===e?this.mp$lookup(t)&&Sk.builtin.dict.prototype.mp$ass_subscript.call(this,t,e):Sk.builtin.dict.prototype.mp$ass_subscript.call(this,t,e)},tp$as_number:!0,nb$positive:counterNumberSlot((function(t){this.$items().forEach((([e,i])=>{Sk.misceval.richCompareBool(i,this.$zero,"Gt")&&t.mp$ass_subscript(e,i)}))})),nb$negative:counterNumberSlot((function(t){this.$items().forEach((([e,i])=>{Sk.misceval.richCompareBool(i,this.$zero,"Lt")&&t.mp$ass_subscript(e,Sk.abstr.numberBinOp(this.$zero,i,"Sub"))}))})),nb$subtract:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=Sk.abstr.numberBinOp(s,e.mp$subscript(i),"Sub");Sk.misceval.richCompareBool(n,this.$zero,"Gt")&&t.mp$ass_subscript(i,n)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,"Lt")&&t.mp$ass_subscript(e,Sk.abstr.numberBinOp(this.$zero,i,"Sub"))}))})),nb$add:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=Sk.abstr.numberBinOp(s,e.mp$subscript(i),"Add");Sk.misceval.richCompareBool(n,this.$zero,"Gt")&&t.mp$ass_subscript(i,n)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,"Gt")&&t.mp$ass_subscript(e,i)}))})),nb$inplace_add:counterInplaceSlot("+",(function(t){t.$items().forEach((([t,e])=>{const i=Sk.abstr.numberInplaceBinOp(this.mp$subscript(t),e,"Add");this.mp$ass_subscript(t,i)}))})),nb$inplace_subtract:counterInplaceSlot("-",(function(t){t.$items().forEach((([t,e])=>{const i=Sk.abstr.numberInplaceBinOp(this.mp$subscript(t),e,"Sub");this.mp$ass_subscript(t,i)}))})),nb$or:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=e.mp$subscript(i),r=Sk.misceval.richCompareBool(s,n,"Lt")?n:s;Sk.misceval.richCompareBool(r,this.$zero,"Gt")&&t.mp$ass_subscript(i,r)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,"Gt")&&t.mp$ass_subscript(e,i)}))})),nb$and:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=e.mp$subscript(i),r=Sk.misceval.richCompareBool(s,n,"Lt")?s:n;Sk.misceval.richCompareBool(r,this.$zero,"Gt")&&t.mp$ass_subscript(i,r)}))})),nb$inplace_and:counterInplaceSlot("&",(function(t){this.$items().forEach((([e,i])=>{const s=t.mp$subscript(e);Sk.misceval.richCompareBool(s,i,"Lt")&&this.mp$ass_subscript(e,s)}))})),nb$inplace_or:counterInplaceSlot("|",(function(t){t.$items().forEach((([t,e])=>{Sk.misceval.richCompareBool(e,this.mp$subscript(t),"Gt")&&this.mp$ass_subscript(t,e)}))})),nb$reflected_and:null,nb$reflected_or:null,nb$reflected_add:null,nb$reflected_subtract:null},proto:{keep$positive(){return this.$items().forEach((([t,e])=>{Sk.misceval.richCompareBool(e,this.$zero,"LtE")&&this.mp$ass_subscript(t)})),this},$zero:new Sk.builtin.int_(0),$one:new Sk.builtin.int_(1),str$items:new Sk.builtin.str("items"),counter$update(t,e){const i=t[0];if(void 0!==i)if(Sk.builtin.checkMapping(i))if(this.sq$length())for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,i.mp$subscript(n),"Add"))}else this.update$common(t,void 0,"update");else for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,this.$one,"Add"))}if(e&&e.length)if(this.sq$length())for(let s=0;s`(${Sk.misceval.objectRepr(t)}, ${Sk.misceval.objectRepr(e)})`));return t=0===t.length?"":"["+t.join(", ")+"]",this.in$repr=!1,new Sk.builtin.str(Sk.abstr.typeName(this)+"("+t+")")},tp$richcompare(e,i){if("Eq"!==i&&"Ne"!==i)return Sk.builtin.NotImplemented.NotImplemented$;if(!(e instanceof t.OrderedDict))return Sk.builtin.dict.prototype.tp$richcompare.call(this,e,i);const s="Eq"==i,n=this.size;if(n!==e.size)return!s;const r=e.$items(),a=this.$items();for(let t=0;t=r||l>=a)switch(i){case"Lt":return ra;case"GtE":return r>=a}return"Eq"!==i&&("NotEq"===i||Sk.misceval.richCompareBool(n[this.head+l&this.mask],e[s.head+l&s.mask],i))},tp$iter(){return new e(this)},$r(){const t=[],e=this.tail-this.head&this.mask;if(this.$entered_repr)return new Sk.builtin.str("[...]");this.$entered_repr=!0;for(let s=0;s=e||t<-e)throw new Sk.builtin.IndexError("deque index out of range");const i=(t>=0?this.head:this.tail)+t&this.mask;return this.v[i]},mp$ass_subscript(t,e){t=Sk.misceval.asIndexOrThrow(t);const i=this.tail-this.head&this.mask;if(t>=i||t<-i)throw new Sk.builtin.IndexError("deque index out of range");void 0===e?this.del$item(t):this.set$item(t,e)},nb$inplace_add(t){this.maxlen=void 0;for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$push(i);return this},nb$inplace_multiply(t){(t=Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError,"can\'t multiply sequence by non-int of type \'{tp$name}\'"))<=0&&this.$clear();const e=this.$copy(),i=this.tail-this.head&this.mask;for(let s=1;s integer -- return number of occurrences of value"},extend:{$meth(t){return this.$extend(t),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Extend the right side of the deque with elements from the iterable"},extendleft:{$meth(t){for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$pushLeft(i);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Extend the left side of the deque with elements from the iterable"},index:{$meth(t,e,i){const s=this.$index(t,e,i);if(void 0!==s)return new Sk.builtin.int_(s);throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(t)+" is not in deque")},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"D.index(value, [start, [stop]]) -> integer -- return first index of value.\\nRaises ValueError if the value is not present."},insert:{$meth(t,e){t=Sk.misceval.asIndexOrThrow(t,"integer argument expected, got {tp$name}");const i=this.tail-this.head&this.mask;if(void 0!==this.maxlen&&i>=this.maxlen)throw new Sk.builtin.IndexError("deque already at its maximum size");t>i&&(t=i),t<=-i&&(t=0);const s=(t>=0?this.head:this.tail)+t&this.mask;let n=this.tail;for(this.tail=this.tail+1&this.mask;n!==s;){const t=n-1&this.mask;this.v[n]=this.v[t],n=t}return this.v[s]=e,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1),Sk.builtin.none.none$},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:"D.insert(index, object) -- insert object before index"},pop:{$meth(){return this.$pop()},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return the rightmost element."},popleft:{$meth(){return this.$popLeft()},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return the leftmost element."},remove:{$meth(t){const e=this.$index(t);if(void 0===e)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(t)+" is not in deque");let i=this.head+e&this.mask;for(;i!==this.tail;){const t=i+1&this.mask;this.v[i]=this.v[t],i=t}this.tail=this.tail-1&this.mask;var s=this.tail-this.head&this.mask;s>>1&&this.$resize(s,this.v.length>>>1)},$flags:{OneArg:!0},$textsig:null,$doc:"D.remove(value) -- remove first occurrence of value."},__reversed__:{$meth(){return new i(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.__reversed__() -- return a reverse iterator over the deque"},reverse:{$meth(){const t=this.head,e=this.tail,i=this.mask,s=this.tail-this.head&this.mask;for(let n=0;n<~~(s/2);n++){const s=e-n-1&i,r=t+n&i,a=this.v[s];this.v[s]=this.v[r],this.v[r]=a}return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"D.reverse() -- reverse *IN PLACE*"},rotate:{$meth(t){t=void 0===t?1:Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError);const e=this.head,i=this.tail;if(0===t||e===i)return this;if(this.head=e-t&this.mask,this.tail=i-t&this.mask,t>0)for(let s=1;s<=t;s++){const t=e-s&this.mask,n=i-s&this.mask;this.v[t]=this.v[n],this.v[n]=void 0}else for(let s=0;s>t;s--){const t=i-s&this.mask,n=e-s&this.mask;this.v[t]=this.v[n],this.v[n]=void 0}return Sk.builtin.none.none$},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left."}},classmethods:Sk.generic.classGetItem,getsets:{maxlen:{$get(){return void 0===this.maxlen?Sk.builtin.none.none$:new Sk.builtin.int_(this.maxlen)},$doc:"maximum size of a deque or None if unbounded"}},proto:{$clear(){this.head=0,this.tail=0,this.mask=1,this.v=new Array(2)},$copy(){return new t.deque(this.v.slice(0),this.maxlen,this.head,this.tail,this.mask)},$extend(t){for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$push(i)},set$item(t,e){const i=(t>=0?this.head:this.tail)+t&this.mask;this.v[i]=e},del$item(t){let e=(t>=0?this.head:this.tail)+t&this.mask;for(;e!==this.tail;){const t=e+1&this.mask;this.v[e]=this.v[t],e=t}const i=this.tail-this.head&this.mask;this.tail=this.tail-1&this.mask,i>>1&&this.$resize(i,this.v.length>>>1)},$push(t){this.v[this.tail]=t,this.tail=this.tail+1&this.mask,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const e=this.tail-this.head&this.mask;return void 0!==this.maxlen&&e>this.maxlen&&this.$popLeft(),this},$pushLeft(t){this.head=this.head-1&this.mask,this.v[this.head]=t,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const e=this.tail-this.head&this.mask;return void 0!==this.maxlen&&e>this.maxlen&&this.$pop(),this},$pop(){if(this.head===this.tail)throw new Sk.builtin.IndexError("pop from an empty deque");this.tail=this.tail-1&this.mask;const t=this.v[this.tail];this.v[this.tail]=void 0;const e=this.tail-this.head&this.mask;return e>>1&&this.$resize(e,this.v.length>>>1),t},$popLeft(){if(this.head===this.tail)throw new Sk.builtin.IndexError("pop from an empty deque");const t=this.v[this.head];this.v[this.head]=void 0,this.head=this.head+1&this.mask;const e=this.tail-this.head&this.mask;return e>>1&&this.$resize(e,this.v.length>>>1),t},$resize(t,e){const i=this.head,s=this.mask;if(this.head=0,this.tail=t,this.mask=e-1,0===i)return void(this.v.length=e);const n=new Array(e);for(let r=0;r=0?i:i<-s?0:s+i;for(let o=e>=0?e:e<-s?0:s+e;o=this.$length)return;const t=(this.$index>=0?this.$head:this.$tail)+this.$index&this.$mask;return this.$index++,this.dq[t]},methods:{__length_hint__:{$meth:function __length_hint__(){return new Sk.builtin.int_(this.$length-this.$index)},$flags:{NoArgs:!0}}}}),i=Sk.abstr.buildIteratorClass("_collections._deque_reverse_iterator",{constructor:function _deque_reverse_iterator(t){this.$index=(t.tail-t.head&t.mask)-1,this.dq=t.v,this.$head=t.head,this.$mask=t.mask},iternext(){if(this.$index<0)return;const t=this.$head+this.$index&this.$mask;return this.$index--,this.dq[t]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef}}),s=new RegExp(/^[0-9].*/),n=new RegExp(/^[0-9_].*/),r=new RegExp(/^\\w*$/),a=/,/g,o=/\\s+/;function namedtuple(e,i,l,h,c){if(e=e.tp$str(),Sk.misceval.isTrue(Sk.misceval.callsimArray(t._iskeyword,[e])))throw new Sk.builtin.ValueError("Type names and field names cannot be a keyword: \'"+Sk.misceval.objectRepr(e)+"\'");const u=e.$jsstr();if(s.test(u)||!r.test(u)||!u)throw new Sk.builtin.ValueError("Type names and field names must be valid identifiers: \'"+u+"\'");let m,d;if(Sk.builtin.checkString(i))m=i.$jsstr().replace(a," ").split(o),1==m.length&&""===m[0]&&(m=[]),d=m.map((t=>new Sk.builtin.str(t)));else{m=[],d=[];for(let t=Sk.abstr.iter(i),e=t.tp$iternext();void 0!==e;e=t.tp$iternext())e=e.tp$str(),d.push(e),m.push(e.$jsstr())}let p=new Set;if(Sk.misceval.isTrue(l))for(let s=0;sm.length)throw new Sk.builtin.TypeError("Got more default values than field names");for(let t=0,e=d.length-b.length;e"\'"+t.$jsstr()+"\'"))+"]")}return r}_make.co_varnames=["_cls","iterable"],_asdict.co_varnames=["self"],_replace.co_kwargs=1,_replace.co_varnames=["_self"];const S={};for(let s=0;sm[e]+"="+Sk.misceval.objectRepr(t)));return new Sk.builtin.str(Sk.abstr.typeName(this)+"("+t.join(", ")+")")}},flags:{sk$klass:!0},proto:Object.assign({__module__:Sk.builtin.checkNone(c)?Sk.globals.__name__:c,__slots__:new Sk.builtin.tuple,_fields:$,_field_defaults:f,_make:new Sk.builtin.classmethod(new Sk.builtin.func(_make)),_asdict:new Sk.builtin.func(_asdict),_replace:new Sk.builtin.func(_replace)},S)})}return namedtuple.co_argcount=2,namedtuple.co_kwonlyargcount=3,namedtuple.$kwdefs=[Sk.builtin.bool.false$,Sk.builtin.none.none$,Sk.builtin.none.none$],namedtuple.co_varnames=["typename","field_names","rename","defaults","module"],t.namedtuple=new Sk.builtin.func(namedtuple),t}',"src/lib/datetime.js":'function $builtinmodule(){const{isTrue:t,richCompareBool:e,asIndexOrThrow:n,asIndexSized:i,objectRepr:s,opAllowsEquality:o,callsimArray:r,callsimOrSuspendArray:a}=Sk.misceval,{numberBinOp:$,typeName:c,buildNativeClass:h,checkArgsLen:m,objectHash:u,copyKeywordsToNamedArgs:l}=Sk.abstr,{int_:f,float_:d,str:w,bytes:_,tuple:p,bool:{true$:g},none:{none$:y},NotImplemented:{NotImplemented$:b},TypeError:z,ValueError:v,OverflowError:M,ZeroDivisionError:A,NotImplementedError:x,checkNumber:N,checkFloat:S,checkString:k,checkInt:O,asnum$:I,round:E,getattr:T}=Sk.builtin,{remapToPy:D,remapToJs:R}=Sk.ffi,intRound=t=>E(t).nb$int(),q=$,C=new w("auto"),U=new w("utcoffset"),Y=new w("tzname"),j=new w("as_integer_ratio"),F=new w("dst"),H=new w("isoformat"),J=new w("replace"),B=new w("fromtimestamp"),G=new w("fromordinal"),L=new w("utcfromtimestamp"),X=new w("strftime"),P=new w("fromutc"),W=new f(0),Z=new d(0),K=new f(7),V=new f(60),Q=new f(3600),tt=new f(1e3),et=new f(1e6),nt=new d(1e6),it=new f(86400),st=new d(86400);let ot=null;function pyDivMod(t,e){return q(t,e,"DivMod").v}function $divMod(t,e){if("number"!=typeof t||"number"!=typeof e)return t=JSBI.BigInt(t),e=JSBI.BigInt(e),[JSBI.toNumber(JSBI.divide(t,e)),JSBI.toNumber(JSBI.remainder(t,e))];if(0===e)throw new A("integer division or modulo by zero");return[Math.floor(t/e),t-Math.floor(t/e)*e]}function modf(t){const e=(t=I(t))<0?-1:1;return t=Math.abs(t),[new d(e*(t-Math.floor(t))),new d(e*Math.floor(t))]}function _d(t,e="0",n=2){return t.toString().padStart(n,e)}const rt=/^[0-9]+$/;function _as_integer(t){if(!rt.test(t))throw new Error;return parseInt(t)}function _as_int_ratio(t){let e=r(t.tp$getattr(j));if(!(e instanceof p))throw new z("unexpected return type from as_integer_ratio(): expected tuple, got \'"+c(e)+"\'");if(e=e.v,2!==e.length)throw new v("as_integer_ratio() must return a 2-tuple");return e}return Sk.misceval.chain(Sk.importModule("time",!1,!0),(a=>{const $=a.$d,E={__name__:new w("datetime"),__all__:new Sk.builtin.list(["date","datetime","time","timedelta","timezone","tzinfo","MINYEAR","MAXYEAR"].map((t=>new w(t))))};function _cmp(t,e){for(let n=0;ne[n]?1:-1;return 0}function _do_compare(t,e,n){const i=t.$cmp(e,n);switch(n){case"Lt":return i<0;case"LtE":return i<=0;case"Eq":return 0===i;case"NotEq":return 0!==i;case"Gt":return i>0;case"GtE":return i>=0}}const j=9999;E.MINYEAR=new f(1),E.MAXYEAR=new f(j);const rt=3652059,at=[-1,31,28,31,30,31,30,31,31,30,31,30,31],$t=[-1];let ct=0;function _is_leap(t){return t%4==0&&(t%100!=0||t%400==0)}function _days_before_year(t){const e=t-1;return 365*e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400)}function _days_before_month(t,e){return $t[e]+(e>2&&_is_leap(t))}function _ymd2ord(t,e,n){return _days_before_year(t)+_days_before_month(t,e)+n}at.slice(1).forEach((t=>{$t.push(ct),ct+=t}));const ht=_days_before_year(401),mt=_days_before_year(101),ut=_days_before_year(5);function _ord2ymd(t){if((t=n(t))>Number.MAX_SAFE_INTEGER)throw new M("Python int too large to convert to js number");if(t<1)throw new v("ordinal must be >= 1");let e,i,s,o;t-=1,[e,t]=$divMod(t,ht);let r=400*e+1;if([i,t]=$divMod(t,mt),[s,t]=$divMod(t,ut),[o,t]=$divMod(t,365),r+=100*i+4*s+o,4===o||4===i)return[r-1,12,31].map((t=>new f(t)));const a=3===o&&(24!==s||3===i);let $=t+50>>5,c=$t[$]+($>2&&a);return c>t&&($-=1,c-=at[$]+(2===$&&a)),[r,$,(t-=c)+1].map((t=>new f(t)))}const lt=[null,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ft=[null,"Mon","Tue","Wed","Thu","Fri","Sat","Sun"];function _build_struct_time(t,e,n,i,s,o,r){const a=(_ymd2ord(t,e,n)+6)%7,c=_days_before_month(t,e)+n;return $.struct_time.tp$call([new p([t,e,n,i,s,o,a,c,r].map((t=>new f(t))))])}const dt={hours:t=>_d(t),minutes:(t,e)=>_d(t)+":"+_d(e),seconds:(t,e,n)=>_d(t)+":"+_d(e)+":"+_d(n),milliseconds:(t,e,n,i)=>_d(t)+":"+_d(e)+":"+_d(n)+"."+_d(i,"0",3),microseconds:(t,e,n,i)=>_d(t)+":"+_d(e)+":"+_d(n)+"."+_d(i,"0",6)};function _format_time(t,e,n,i,s="auto"){if("string"!=typeof s&&!k(s))throw new z("must be str, not "+c(s));"auto"===(s=s.toString())?s=i?"microseconds":"seconds":"milliseconds"===s&&(i=Math.floor(i/1e3));let o=dt[s];if(void 0===o)throw new v("Unknown timespec value");return o(t,e,n,i)}function _format_offset(t){let e,n="";if(t!==y){let i,s,o;return t.$days<0?(e="-",t=new wt(-t.$days,-t.$secs,-t.$micro)):e="+",[i,s]=pyDivMod(t,pt),[s,o]=pyDivMod(s,gt),n+=e+`${_d(i)}:${_d(s)}`,(o.$secs||o.$micro)&&(n+=":"+_d(o.$secs,"0",2),o.$micro&&(n+="."+_d(o.$micro,"0",6))),n}}function _wrap_strftime(t,e,n){let i=null,s=null,o=null,a=[],c=0;const h=e.length;for(;cnew f(t)))}function _parse_hh_mm_ss_ff(t){const e=t.length,n=[0,0,0,0];let i=0;for(let s=0;s<3;s++){if(e-i<2)throw new v("Incomplete time component");n[s]=_as_integer(t.slice(i,i+2)),i+=2;const o=t.substr(i,1);if(!o||s>=2)break;if(":"!==o)throw new v("Invalid time separator: "+o);i+=1}if(i0?t.slice(0,e-1):t),s=y;if(e>0){if(n=t.slice(e),![5,8,15].includes(n.length))throw new v("Malformed time zone string");const i=_parse_hh_mm_ss_ff(n);if(i.every((t=>0===t)))s=St.prototype.utc;else{const n="-"===t[e-1]?-1:1,o=new wt(0,n*(3600*i[0]+60*i[1]+i[2]),n*i[3]);s=new St(o)}}return i=i.map((t=>new f(t))),i.push(s),i}function _check_tzname(t){if(t!==y&&!k(t))throw new z("tzinfo.tzname() must return None or string, not \'"+c(t)+"\'")}function _check_utc_offset(t,n){if(n!==y){if(!(n instanceof wt))throw new z(`tzinfo.${t}() must return None or timedelta, not \'${c(n)}\'`);if(!e(zt,n,"Lt")||!e(n,_t,"Lt"))throw new v(`${t}()=${n.toString()}, must be strictly between -timedelta(hours=24) and timedelta(hours=24)`)}}function _check_date_fields(t,e=null,i=null){if(null===e||null===i){throw new z(`function missing required argument \'${null===i?"day":"month"}\' (pos ${null===i?"3":"2"})`)}if(t=n(t),e=n(e),i=n(i),!(1<=t&&t<=j))throw new v("year must be in 1.."+j,new f(t));if(!(1<=e&&e<=12))throw new v("month must be in 1..12",new f(e));const s=function _days_in_month(t,e){return 2===e&&_is_leap(t)?29:at[e]}(t,e);if(!(1<=i&&i<=s))throw new v("day must be in 1.."+s,new f(i));return[t,e,i]}function _check_time_fields(t,e,i,s,o){if(t=n(t),e=n(e),i=n(i),s=n(s),o=n(o),!(0<=t&&t<=23))throw new v("hour must be in 0..23",new f(t));if(!(0<=e&&e<=59))throw new v("minute must be in 0..59",new f(e));if(!(0<=i&&i<=59))throw new v("second must be in 0..59",new f(i));if(!(0<=s&&s<=999999))throw new v("microsecond must be in 0..999999",new f(s));if(0!==o&&1!==o)throw new v("fold must be either 0 or 1",new f(o));return[t,e,i,s,o]}function _check_tzinfo_arg(t){if(t!==y&&!(t instanceof Mt))throw new z("tzinfo argument must be None or of a tzinfo subclass")}function _divide_and_round(t,e){let[n,i]=$divMod(t,e);return i*=2,((e>0?i>e:i999999999)throw new M(`days=${t}; must have magnitude <= 999999999`)},slots:{tp$new(t,e){let i,s,o,r,a,$,c,[h,m,u,d,w,_,p]=l("timedelta",["days","seconds","microseconds","milliseconds","minutes","hours","weeks"],t,e,new Array(7).fill(W));i=s=o=W,h=q(h,q(p,K,"Mult"),"Add"),m=q(m,q(q(w,V,"Mult"),q(_,Q,"Mult"),"Add"),"Add"),u=q(u,q(d,tt,"Mult"),"Add"),S(h)?([r,h]=modf(h),[a,$]=modf(q(r,st,"Mult")),s=new f($),i=new f(h)):(a=Z,i=h),S(m)?([c,m]=modf(m),m=new f(m),c=q(c,a,"Add")):c=a,[h,m]=pyDivMod(m,it),i=q(i,h,"Add"),s=q(s,new f(m),"Add");const g=q(c,nt,"Mult");if(S(u)?(u=intRound(q(u,g,"Add")),[m,u]=pyDivMod(u,et),[h,m]=pyDivMod(m,it),i=q(i,h,"Add"),s=q(s,m,"Add")):(u=new f(u),[m,u]=pyDivMod(u,et),[h,m]=pyDivMod(m,it),i=q(i,h,"Add"),s=q(s,m,"Add"),u=intRound(q(u,g,"Add"))),[m,o]=pyDivMod(u,et),s=q(s,m,"Add"),[h,s]=pyDivMod(s,it),i=q(i,h,"Add"),i=n(i),s=n(s),o=n(o),Math.abs(i)>999999999)throw new M("timedelta # of days is too large: "+h.toString());if(this===wt.prototype)return new wt(i,s,o);{const t=new this.constructor;return wt.call(t,i,s,o),t}},$r(){const t=[];return this.$days&&t.push(`days=${this.$days}`),this.$secs&&t.push(`seconds=${this.$secs}`),this.$micro&&t.push(`microseconds=${this.$micro}`),t.length||t.push("0"),new w(`${this.tp$name}(${t.join(", ")})`)},tp$str(){const t=this.$secs%60;let e=Math.floor(this.$secs/60);const n=Math.floor(e/60);e%=60;let i=`${n}:${_d(e)}:${_d(t)}`;if(this.$days){i=`${this.$days} day${function plural(t){return 1!==Math.abs(t)?"s":""}(this.$days)}, `+i}return this.$micro&&(i+=`.${_d(this.$micro,"0",6)}`),new w(i)},tp$as_number:!0,nb$add(t){return t instanceof wt?new wt(this.$days+t.$days,this.$secs+t.$secs,this.$micro+t.$micro):b},nb$subtract(t){return t instanceof wt?new wt(this.$days-t.$days,this.$secs-t.$secs,this.$micro-t.$micro):b},nb$positive(){return this},nb$negative(){return new wt(-this.$days,-this.$secs,-this.$micro)},nb$abs(){return this.$days<0?this.nb$negative():this},nb$multiply(t){if(O(t))return t=i(t,M),new wt(this.$days*t,this.$secs*t,this.$micro*t);if(S(t)){const e=this.$toMicrosecs();let[s,o]=_as_int_ratio(t);return s=i(s,M),o=n(o),new wt(0,0,_divide_and_round(e*s,o))}return b},nb$floor_divide(t){const e=this.$toMicrosecs();if(t instanceof wt){const n=t.$toMicrosecs();if(0===n)throw new A("integer division or modulo by zero");return new f(Math.floor(e/n))}if(O(t)){if(0===(t=i(t,M)))throw new A("integer division or modulo by zero");return new wt(0,0,Math.floor(e/t))}return b},nb$divide(t){const e=this.$toMicrosecs();if(t instanceof wt){if(0===t.$toMicrosecs())throw new A("integer division or modulo by zero");return new d(e/t.$toMicrosecs())}if(O(t))return t=n(t),new wt(0,0,_divide_and_round(e,t));if(S(t)){let[s,o]=_as_int_ratio(t);return s=n(s),o=i(o,M),new wt(0,0,_divide_and_round(o*e,s))}return b},nb$remainder(t){if(!(t instanceof wt))return b;const e=this.$toMicrosecs(),n=t.$toMicrosecs();if(0===n)throw new A("integer division or modulo by zero");const i=e-Math.floor(e/n)*n;return new wt(0,0,i)},nb$divmod(t){if(!(t instanceof wt))return b;const e=this.$toMicrosecs(),n=t.$toMicrosecs(),[i,s]=$divMod(e,n);return new p([new f(i),new wt(0,0,s)])},tp$richcompare(t,e){return t instanceof wt?_do_compare(this,t,e):b},tp$hash(){return-1===this.$hashcode&&(this.$hashcode=u(new p(this.$getState().map((t=>new f(t)))))),this.$hashcode},nb$bool(){return 0!==this.$days||0!==this.$secs||0!==this.$micro}},methods:{total_seconds:{$meth(){return new d(((86400*this.$days+this.$secs)*10**6+this.$micro)/10**6)},$flags:{NoArgs:!0},$doc:"Total seconds in the duration."},__reduce__:{$meth(){return new p([this.ob$type,new p(this.$getState().map((t=>D(t))))])},$flags:{NoArgs:!0},$textsig:null,$doc:"__reduce__() -> (cls, state)"}},getsets:{days:{$get(){return new f(this.$days)},$doc:"Number of days."},seconds:{$get(){return new f(this.$secs)},$doc:"Number of seconds (>= 0 and less than 1 day)."},microseconds:{$get(){return new f(this.$micro)},$doc:"Number of microseconds (>= 0 and less than 1 second)."}},proto:{$toMicrosecs(){return 1e6*(86400*this.$days+this.$secs)+this.$micro},$cmp(t){return _cmp(this.$getState(),t.$getState())},$getState(){return[this.$days,this.$secs,this.$micro]}}});wt.prototype.min=new wt(-999999999),wt.prototype.max=new wt(999999999,86399,999999),wt.prototype.resolution=new wt(0,0,1);const _t=new wt(1),pt=new wt(0,3600),gt=new wt(0,60),yt=new wt(0,1),bt=new wt(0),zt=new wt(-1),vt=E.date=h("datetime.date",{constructor:function date(t,e,n){this.$year=t,this.$month=e,this.$day=n,this.$hashcode=-1},slots:{tp$new(t,e){let n,[i,s,o]=l("date",["year","month","day"],t,e,[null,null]);if(null===s&&i instanceof _&&4===(n=i.valueOf()).length&&1<=n[2]&&n[2]<=12){const t=new this.constructor;return t.$setState(n),t}if([i,s,o]=_check_date_fields(i,s,o),this===vt.prototype)return new vt(i,s,o);{const t=new this.constructor;return vt.call(t,i,s,o),t}},$r(){return new w(`${this.tp$name}(${this.$year}, ${this.$month}, ${this.$day})`)},tp$str(){return this.tp$getattr(H).tp$call([])},tp$richcompare(t,e){return t instanceof vt?_do_compare(this,t,e):b},tp$hash(){return-1===this.$hashcode&&(this.$hashcode=u(this.$getState())),this.$hashcode},tp$as_number:!0,nb$add(t){if(t instanceof wt){const e=this.$toOrdinal()+t.$days;if(0 local date from a POSIX timestamp (like time.time())."},fromordinal:{$meth:function fromordinal(t){return this.tp$call(_ord2ymd(t))},$flags:{OneArg:!0},$textsig:null,$doc:"int -> date corresponding to a proleptic Gregorian ordinal."},fromisocalendar:{$meth:function fromisocalendar(t,e,i){if(t=n(t),e=n(e),i=n(i),!(1<=t&&t<=j))throw new v(`Year is out of range: ${t}`);let s,o;if(!(0 date corresponding to a proleptic Gregorian ordinal."},fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z("fromisoformat: argument must be str");t=t.toString();try{if(10!==t.length)throw new Error;return this.tp$call(_parse_isoformat_date(t))}catch(e){throw new v("Invalid isoformat string: \'"+t+"\'")}},$flags:{OneArg:!0},$textsig:null,$doc:"str -> Construct a date from the output of date.isoformat()"},today:{$meth:function today(){const t=$.time.tp$call([]);return this.tp$getattr(B).tp$call([t])},$flags:{NoArgs:!0},$textsig:null,$doc:"Current date or datetime: same as self.__class__.fromtimestamp(time.time())."}},methods:{ctime:{$meth:function ctime(){const t=this.$toOrdinal()%7||7,e=ft[t],n=lt[this.$month];return new w(`${e} ${n} ${_d(this.$day," ",2)} 00:00:00 ${_d(this.$year,"0",4)}`)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return ctime() style string."},strftime:{$meth:function strftime(t){if(!k(t))throw new z("must be str, not "+c(t));return _wrap_strftime(this,t=t.toString(),this.$timetuple())},$flags:{OneArg:!0},$textsig:null,$doc:"format -> strftime() style string."},__format__:{$meth:function __format__(t){if(!k(t))throw new z("must be str, not "+c(t));return""!==t.v?this.tp$getattr(X).tp$call([t]):this.tp$str()},$flags:{OneArg:!0},$textsig:null,$doc:"Formats self with strftime."},timetuple:{$meth:function timetuple(){return this.$timetuple()},$flags:{NoArgs:!0},$textsig:null,$doc:"Return time tuple, compatible with time.localtime()."},isocalendar:{$meth:function isocalendar(){let t=this.$year,e=_isoweek1monday(t);const n=_ymd2ord(this.$year,this.$month,this.$day);let[i,s]=$divMod(n-e,7);return i<0?(t-=1,e=_isoweek1monday(t),[i,s]=$divMod(n-e,7)):i>=52&&n>=_isoweek1monday(t+1)&&(t+=1,i=0),new At(new f(t),new f(i+1),new f(s+1))},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a 3-tuple containing ISO year, week number, and weekday."},isoformat:{$meth:function isoformat(){return this.$isoformat()},$flags:{NoArgs:!0},$textsig:null,$doc:"Return string in ISO 8601 format, YYYY-MM-DD."},isoweekday:{$meth:function isoweekday(){return new f(this.$toOrdinal()%7||7)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return the day of the week represented by the date.\\nMonday == 1 ... Sunday == 7"},toordinal:{$meth:function toordinal(){return new f(this.$toOrdinal())},$flags:{NoArgs:!0},$textsig:null,$doc:"Return proleptic Gregorian ordinal. January 1 of year 1 is day 1."},weekday:{$meth:function weekday(){return new f((this.$toOrdinal()+6)%7)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return the day of the week represented by the date.\\nMonday == 0 ... Sunday == 6"},replace:{$meth:function replace(t,e,n){return t===y&&(t=new f(this.$year)),e===y&&(e=new f(this.$month)),n===y&&(n=new f(this.$day)),this.ob$type.tp$call([t,e,n])},$flags:{NamedArgs:["year","month","day"],Defaults:[y,y,y]},$textsig:null,$doc:"Return date with new specified fields."},__reduce__:{$meth(){return new p([this.ob$type,new p([this.$getState()])])},$flags:{NoArgs:!0},$textsig:null,$doc:"__reduce__() -> (cls, state)"}},getsets:{year:{$get(){return new f(this.$year)},$doc:"year (1-9999)"},month:{$get(){return new f(this.$month)},$doc:"month (1-12)"},day:{$get(){return new f(this.$day)},$doc:"day (1-31)"}},proto:{$cmp(t){return _cmp([this.$year,this.$month,this.$day],[t.$year,t.$month,t.$day])},$getState(){const[t,e]=$divMod(this.$year,256);return new _([t,e,this.$month,this.$day])},$setState(t){const[e,n,i,s]=t,o=256*e+n;this.$year=o,this.$month=i,this.$day=s},$toOrdinal(){return _ymd2ord(this.$year,this.$month,this.$day)},$isoformat(){return new w(`${_d(this.$year,"0",4)}-${_d(this.$month,"0",2)}-${_d(this.$day,"0",2)}`)},$timetuple(){return _build_struct_time(this.$year,this.$month,this.$day,this.$hour||0,this.$min||0,this.$sec||0,-1)},$strftime(t=""){return _wrap_strftime(this,t.toString(),this.$timetuple())}}});vt.prototype.min=new vt(1,1,1),vt.prototype.max=new vt(9999,12,31),vt.prototype.resolution=new wt(1);const Mt=E.tzinfo=h("datetime.tzinfo",{constructor:function tzinfo(){},methods:{tzname:{$meth:function tzname(t){throw new x("tzinfo subclass must override tzname()")},$flags:{OneArg:!0},$textsig:null,$doc:"datetime -> string name of time zone."},utcoffset:{$meth:function utcoffset(t){throw new x("tzinfo subclass must override utcoffset()")},$flags:{OneArg:!0},$textsig:null,$doc:"datetime -> timedelta showing offset from UTC, negative values indicating West of UTC"},dst:{$meth:function dst(t){throw new x("tzinfo subclass must override dst()")},$flags:{OneArg:!0},$textsig:null,$doc:"datetime -> DST offset as timedelta positive east of UTC."},fromutc:{$meth:function fromutc(e){if(!(e instanceof Nt))throw new z("fromutc() requires a datetime argument");if(e.$tzinfo!==this)throw new v("dt.tzinfo is not self");const n=r(e.tp$getattr(U));if(n===y)throw new v("fromutc() requires a non-None utcoffset() result");let i=r(e.tp$getattr(F));if(i===y)throw new v("fromutc() requires a non-None dst() result");const s=q(n,i,"Sub");if(t(s)&&(e=q(e,s,"Add"),i=r(e.tp$getattr(F)),i===y))throw new v("fromutc(): dt.dst gave inconsistent results; cannot convert");return q(e,i,"Add")},$flags:{OneArg:!0},$textsig:null,$doc:"datetime in UTC -> datetime in local time."},__reduce__:{$meth(){let e,n;const i=T(this,new w("__getinitargs__"),y);e=i!==y?r(i,[]):new p;const s=T(this,new w("__getstate__"),y);return s!==y?n=r(s,[]):(n=T(this,new w("__dict__"),y),n=t(n)?n:y),new p(n===y?[this.ob$type,e]:[this.ob$type,e,n])},$flags:{NoArgs:!0},$textsig:null,$doc:"-> (cls, state)"}}}),At=h("datetime.IsoCalendarDate",{base:p,constructor:function IsoCalendarDate(t,e,n){this.y=t,this.w=e,this.wd=n,p.call(this,[t,e,n])},slots:{tp$new(t,e){const[n,i,s]=l("IsoCalendarDate",["year","week","weekday"],t,e);return new this.constructor(n,i,s)},$r(){return new w(`${this.tp$name}(year=${this.y}, week=${this.w}, weekday=${this.wd})`)}},getsets:{year:{$get(){return this.y}},week:{$get(){return this.w}},weekday:{$get(){return this.wd}}}}),xt=E.time=h("datetime.time",{constructor:function time(t=0,e=0,n=0,i=0,s=null,o=0){this.$hour=t,this.$min=e,this.$sec=n,this.$micro=i,this.$tzinfo=s||y,this.$fold=o,this.$hashcode=-1},slots:{tp$new(t,e){m("time",t,0,5);let n,[i,s,o,r,a,$]=l("time",["hour","minute","second","microsecond","tzinfo","fold"],t,e,[W,W,W,W,y,W]);if(i instanceof _&&6===(n=i.valueOf()).length&&(127&n[0])<24){const t=new this.constructor;return t.$setState(n,s===W?y:s),t}if([i,s,o,r,$]=_check_time_fields(i,s,o,r,$),_check_tzinfo_arg(a),this===xt.prototype)return new xt(i,s,o,r,a,$);{const t=new this.constructor;return xt.call(t,i,s,o,r,a,$),t}},tp$richcompare(t,e){return t instanceof xt?_do_compare(this,t,e):b},tp$hash(){if(-1===this.$hashcode){const e=this.$fold?r(this.tp$getattr(J),[],["fold",W]):this,n=r(e.tp$getattr(U));if(t(n)){let[t,e]=pyDivMod(new wt(0,3600*this.$hour+60*this.$min).nb$subtract(n),pt);e=e.nb$floor_divide(gt),0<=t&&t<=24?(t=I(t),e=I(e),this.$hashcode=u(new xt(t,e,this.$sec,this.$micro))):this.$hashcode=u(new p([t,e,new f(this.$sec),new f(this.$micro)]))}else this.$hashcode=u(e.$getState()[0])}return this.$hashcode},$r(){let t;return t=0!==this.$micro?`, ${this.$sec}, ${this.$micro}`:0!==this.$sec?`, ${this.$sec}`:"",t=`${this.tp$name}(${this.$hour}, ${this.$min}${t})`,this.$tzinfo!==y&&(t=t.slice(0,-1)+", tzinfo="+s(this.$tzinfo)+")"),this.$fold&&(t=t.slice(0,-1)+", fold=1)"),new w(t)},tp$str(){return this.tp$getattr(H).tp$call([])}},methods:{isoformat:{$meth:function isoformat(t){let e=_format_time(this.$hour,this.$min,this.$sec,this.$micro,t);const n=this.$tzstr();return n&&(e+=n),new w(e)},$flags:{NamedArgs:["timespec"],Defaults:[C]},$textsig:null,$doc:"Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\\n\\ntimespec specifies what components of the time to include.\\n"},strftime:{$meth:function strftime(t){if(!k(t))throw new z("must be str, not "+c(t));return _wrap_strftime(this,t=t.toString(),new p([1900,1,1,this.$hour,this.$min,this.$sec,0,1,-1].map((t=>new f(t)))))},$flags:{OneArg:!0},$textsig:null,$doc:"format -> strftime() style string."},__format__:{$meth:function __format__(t){if(!k(t))throw new z("must be str, not "+c(t));return""!==t.v?this.tp$getattr(X).tp$call([t]):this.tp$str()},$flags:{OneArg:!0},$textsig:null,$doc:"Formats self with strftime."},utcoffset:{$meth:function utcoffset(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(U),e=r(t,[y]);return _check_utc_offset("utcoffset",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.utcoffset(self)."},tzname:{$meth:function tzname(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(Y),e=r(t,[y]);return _check_tzname(e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.tzname(self)."},dst:{$meth:function dst(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(F),e=r(t,[y]);return _check_utc_offset("dst",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.dst(self)."},replace:{$meth:function replace(t,e){m("replace",t,0,5);let[n,i,s,o,r,a]=l("replace",["hour","minute","second","microsecond","tzinfo","fold"],t,e,[y,y,y,y,g,y]);return n===y&&(n=new f(this.$hour)),i===y&&(i=new f(this.$min)),s===y&&(s=new f(this.$sec)),o===y&&(o=new f(this.$micro)),r===g&&(r=this.$tzinfo),a===y&&(a=new f(this.$fold)),this.ob$type.tp$call([n,i,s,o,r],["fold",a])},$flags:{FastCall:!0},$textsig:null,$doc:"Return time with new specified fields."},__reduce_ex__:{$meth(t){return new p([this.ob$type,new p(this.$getState(R(t)))])},$flags:{OneArg:!0},$textsig:null,$doc:"__reduce_ex__(proto) -> (cls, state)"},__reduce__:{$meth(){return this.tp$getattr(new w("__reduce_ex__")).tp$call([new f(2)])},$flags:{NoArgs:!0},$textsig:null,$doc:"__reduce__() -> (cls, state)"}},classmethods:{fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z("fromisoformat: argument must be str");t=t.toString();try{return this.tp$call(_parse_isoformat_time(t))}catch{throw new v("Invalid isofrmat string: \'"+t+"\'")}},$flags:{OneArg:!0},$textsig:null,$doc:"string -> time from time.isoformat() output"}},getsets:{hour:{$get(){return new f(this.$hour)}},minute:{$get(){return new f(this.$min)}},second:{$get(){return new f(this.$sec)}},microsecond:{$get(){return new f(this.$micro)}},tzinfo:{$get(){return this.$tzinfo}},fold:{$get(){return new f(this.$fold)}}},proto:{$cmp(t,n){const s=this.$tzinfo,o=t.$tzinfo;let a,$,c;if(a=$=y,s===o?c=!0:(a=r(this.tp$getattr(U)),$=r(t.tp$getattr(U)),c=e(a,$,"Eq")),c)return _cmp([this.$hour,this.$min,this.$sec,this.$micro],[t.$hour,t.$min,t.$sec,t.$micro]);if(a===y||$===y){if("Eq"===n||"NotEq"===n)return 2;throw new z("cannot compare naive and aware times")}const h=60*this.$hour+this.$min-i(a.nb$floor_divide(gt)),m=60*t.$hour+t.$min-i($.nb$floor_divide(gt));return _cmp([h,this.$sec,this.$micro],[m,t.$sec,t.$micro])},$tzstr(){return _format_offset(r(this.tp$getattr(U)))},$getState(t=3){let[e,n]=$divMod(this.$micro,256),[i,s]=$divMod(e,256),o=this.$hour;this.$fold&&t>3&&(o+=128);const r=new _([o,this.$min,this.$sec,i,s,n]);return this.$tzinfo===y?[r]:[r,this.$tzinfo]},$setState(t,e){const[n,i,s,o,r,a]=t;n>127?(this.$fold=1,this.$hour=n-128):(this.$fold=0,this.$hour=n),this.$min=i,this.$sec=s,this.$micro=(o<<8|r)<<8|a,this.$tzinfo=e}}});xt.prototype.min=new xt(0,0,0),xt.prototype.max=new xt(23,59,59,999999),xt.prototype.resolution=new wt;const Nt=E.datetime=h("datetime.datetime",{base:vt,constructor:function datetime(t,e,n,i=0,s=0,o=0,r=0,a=null,$=0){this.$year=t,this.$month=e,this.$day=n,this.$hour=i,this.$min=s,this.$sec=o,this.$micro=r,this.$tzinfo=a||y,this.$fold=$,this.$hashcode=-1},slots:{tp$new(t,e){m("datetime",t,0,9);let n,[i,s,o,r,a,$,c,h,u]=l("time",["year","month","day","hour","minute","second","microsecond","tzinfo","fold"],t,e,[null,null,W,W,W,W,y,W]);if(i instanceof _&&10===(n=i.valueOf()).length&&(127&n[2])<=12){const t=new this.constructor;return t.$setState(n,null===s?y:s),t}if([i,s,o]=_check_date_fields(i,s,o),[r,a,$,c,u]=_check_time_fields(r,a,$,c,u),_check_tzinfo_arg(h),this===Nt.prototype)return new Nt(i,s,o,r,a,$,c,h,u);{const t=new this.constructor;return Nt.call(t,i,s,o,r,a,$,c,h,u),t}},$r(){const t=[this.$year,this.$month,this.$day,this.$hour,this.$min,this.$sec,this.$micro];0===t[t.length-1]&&t.pop(),0===t[t.length-1]&&t.pop();let e=`${this.tp$name}(${t.join(", ")})`;return this.$tzinfo!==y&&(e=e.slice(0,-1)+", tzinfo="+s(this.$tzinfo)+")"),this.$fold&&(e=e.slice(0,-1)+", fold=1)"),new w(e)},tp$str(){return this.tp$getattr(H).tp$call([],["sep",new w(" ")])},tp$richcompare(t,e){if(t instanceof Nt)return _do_compare(this,t,e);if(!(t instanceof vt))return b;if("Eq"===e||"NotEq"===e)return"NotEq"===e;throw new z(`can\'t compare \'${c(this)}\' to \'${c(t)}\'`)},tp$as_number:!0,nb$add(t){if(!(t instanceof wt))return b;let e=new wt(this.$toOrdinal(),3600*this.$hour+60*this.$min+this.$sec,this.$micro);e=q(e,t,"Add");let[n,i]=$divMod(e.$secs,3600),[s,o]=$divMod(i,60);if(0 string in ISO 8601 format, YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\\nsep is used to separate the year from the time, and defaults to \'T\'.\\ntimespec specifies what components of the time to include (allowed values are \'auto\', \'hours\', \'minutes\', \'seconds\', \'milliseconds\', and \'microseconds\').\\n"},utcoffset:{$meth:function utcoffset(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(U),e=r(t,[this]);return _check_utc_offset("utcoffset",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.utcoffset(self)."},tzname:{$meth:function tzname(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(Y),e=r(t,[this]);return _check_tzname(e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.tzname(self)."},dst:{$meth:function dst(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(F),e=r(t,[this]);return _check_utc_offset("dst",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:"Return self.tzinfo.dst(self)."},replace:{$meth:function replace(t,e){m("replace",t,0,8);let[n,i,s,o,r,a,$,c,h]=l("replace",["year","month","day","hour","minute","second","microsecond","tzinfo","fold"],t,e,[y,y,y,y,y,y,y,g,y]);return n===y&&(n=new f(this.$year)),i===y&&(i=new f(this.$month)),s===y&&(s=new f(this.$day)),o===y&&(o=new f(this.$hour)),r===y&&(r=new f(this.$min)),a===y&&(a=new f(this.$sec)),$===y&&($=new f(this.$micro)),c===g&&(c=this.$tzinfo),h===y&&(h=new f(this.$fold)),this.ob$type.tp$call([n,i,s,o,r,a,$,c],["fold",h])},$flags:{FastCall:!0},$textsig:null,$doc:"Return datetime with new specified fields."},astimezone:{$meth:function astimezone(t){if(t===y)t=this.$localTimezone();else if(!(t instanceof Mt))throw new z("tz argument must be an instance of tzinfo");let e,n=this.$tzinfo;if(n===y?(n=this.$localTimezone(),e=r(n.tp$getattr(U),[this])):(e=r(n.tp$getattr(U),[this]),e===y&&(n=r(this.tp$getattr(J),[],["tzinfo",y]).$localTimezone(),e=r(n.tp$getattr(U),[this]))),t===n)return this;const i=r(this.nb$subtract(e).tp$getattr(J),[],["tzinfo",t]);return t.tp$getattr(P).tp$call([i])},$flags:{NamedArgs:["tz"],Defaults:[y]},$textsig:null,$doc:"tz -> convert to local time in new timezone tz\\n"},__reduce_ex__:{$meth(t){return new p([this.ob$type,new p(this.$getState(R(t)))])},$flags:{OneArg:!0},$textsig:null,$doc:"__reduce_ex__(proto) -> (cls, state)"},__reduce__:{$meth(){return this.tp$getattr(new w("__reduce_ex__")).tp$call([new f(2)])},$flags:{NoArgs:!0},$textsig:null,$doc:"__reduce__() -> (cls, state)"}},classmethods:{now:{$meth:function now(t){const e=$.time.tp$call([]);return this.tp$getattr(B).tp$call([e,t])},$flags:{NamedArgs:["tz"],Defaults:[y]},$textsig:"($type, /, tz=None)",$doc:"Returns new datetime object representing current time local to tz.\\n\\n tz\\n Timezone object.\\n\\nIf no tz is specified, uses local timezone."},utcnow:{$meth:function utcnow(){const t=$.time.tp$call([]);return this.tp$getattr(L).tp$call([t])},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a new datetime representing UTC day and time."},fromtimestamp:{$meth:function fromtimestamp(t,e){return _check_tzinfo_arg(e),this.prototype.$fromtimestamp.call(this,t,e!==y,e)},$flags:{NamedArgs:["timestamp","tz"],Defaults:[y]},$textsig:null,$doc:"timestamp[, tz] -> tz\'s local time from POSIX timestamp."},utcfromtimestamp:{$meth:function utcfromtimestamp(t){return this.prototype.$fromtimestamp.call(this,t,!0,y)},$flags:{OneArg:!0},$textsig:null,$doc:"Construct a naive UTC datetime from a POSIX timestamp."},strptime:{$meth:function strptime(t,e){return null===ot?Sk.misceval.chain(Sk.importModule("_strptime",!1,!0),(n=>(ot=n.tp$getattr(new w("_strptime_datetime")),ot.tp$call([this,t,e])))):ot.tp$call([this,t,e])},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:"string, format -> new datetime parsed from a string (like time.strptime())."},combine:{$meth:function combine(t,e,n){if(!(t instanceof vt))throw new z("date argument must be a date instance");if(!(e instanceof xt))throw new z("time argument must be a time instance");n===g&&(n=e.$tzinfo);const i=[t.$year,t.$month,t.$day,e.$hour,e.$min,e.$sec,e.$micro].map((t=>new f(t)));return i.push(n),this.tp$call(i,["fold",new f(e.$fold)])},$flags:{NamedArgs:["date","time","tzinfo"],Defaults:[g]},$textsig:null,$doc:"date, time -> datetime with same date and time fields"},fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z("fromisoformat: argument must be str");const e=(t=t.toString()).slice(0,10),n=t.slice(11);let i,s;try{i=_parse_isoformat_date(e)}catch(o){throw new v("Invalid isoformat string: \'"+t+"\'")}if(n)try{s=_parse_isoformat_time(n)}catch(o){throw new v("Invalid isoformat string: \'"+t+"\'")}else s=[W,W,W,W,y];return this.tp$call(i.concat(s))},$flags:{OneArg:!0},$textsig:null,$doc:"string -> datetime from datetime.isoformat() output"}},getsets:{hour:{$get(){return new f(this.$hour)}},minute:{$get(){return new f(this.$min)}},second:{$get(){return new f(this.$sec)}},microsecond:{$get(){return new f(this.$micro)}},tzinfo:{$get(){return this.$tzinfo}},fold:{$get(){return new f(this.$fold)}}},proto:{$cmp(n,i){const s=this.$tzinfo,o=n.$tzinfo;let a,$,c;if(a=$=y,s===o)c=!0;else{if(a=r(this.tp$getattr(U)),$=r(n.tp$getattr(U)),"Eq"===i||"NotEq"===i){const t=r(this.tp$getattr(J),[],["fold",new f(Number(!this.$fold))]);if(e(a,r(t.tp$getattr(U)),"NotEq"))return 2;const i=r(n.tp$getattr(J),[],["fold",new f(Number(!n.$fold))]);if(e($,r(i.tp$getattr(U)),"NotEq"))return 2}c=e(a,$,"Eq")}if(c)return _cmp([this.$year,this.$month,this.$day,this.$hour,this.$min,this.$sec,this.$micro],[n.$year,n.$month,n.$day,n.$hour,n.$min,n.$sec,n.$micro]);if(a===y||$===y){if("Eq"===i||"NotEq"===i)return 2;throw new z("cannot compare naive and aware datetimes")}const h=this.nb$subtract(n);return h.$days<0?-1:t(h)?1:0},$mkTime(){const t=new Nt(1970,1,1),e=this.nb$subtract(t).nb$floor_divide(yt);function local(e){const[n,i,s,o,r,a]=$.localtime.tp$call([e]).v;return Nt.tp$call([n,i,s,o,r,a]).nb$subtract(t).nb$floor_divide(yt)}let n,i,s=local(e).nb$subtract(e),o=e.nb$subtract(s),r=local(o);if(r.ob$eq(e)){if(n=o.nb$add([new f(-86400),new f(86400)][this.$fold]),i=local(n).nb$subtract(n),s.ob$eq(i))return o}else i=r.nb$subtract(o);n=e.nb$subtract(i);if(local(n).ob$eq(e))return n;if(r.ob$eq(e))return o;const a=o.ob$ge(n)?o:n;return[a,o===a?n:o][this.$fold]},$fromtimestamp(t,n,s){let o;if(!N(t))throw new z("a number is required, (got \'"+c(t)+"\'");[o,t]=modf(t);let a=intRound(q(o,nt,"Mult"));a=a.v,t=t.v,a>=1e6?(t+=1,a-=1e6):a<0&&(t-=1,a+=1e6),t=new f(t),Number.isInteger(a)||(a=Math.trunc(a)),a=new f(a);const h=n?$.gmtime:$.localtime;function converter(t){return h.tp$call([t]).v}let[m,u,l,d,_,p]=converter(t);p=new f(Math.min(i(p),59));let g=r(this,[m,u,l,d,_,p,a,s]);if(s===y){const n=86400;[m,u,l,d,_,p]=converter(q(t,new f(n),"Sub"));const i=r(this,[m,u,l,d,_,p,a,s]),o=q(q(g,i,"Sub"),new wt(0,n),"Sub");if(o.$days<0){[m,u,l,d,_,p]=converter(q(t,q(o,yt,"FloorDiv"),"Add"));const n=r(this,[m,u,l,d,_,p,a,s]);e(n,g,"Eq")&&(g.$fold=1)}}else g=r(s.tp$getattr(new w("fromutc")),[g]);return g},$localTimezone(){let t;t=this.$tzinfo===y?this.$mkTime():this.nb$subtract(kt).nb$floor_divide(yt);const e=$.localtime.tp$call([t]),n=(Nt.tp$call(e.v.slice(0,6)),e.tp$getattr(new w("tm_gmtoff"))),i=e.tp$getattr(new w("tm_zone"));return new St(wt.tp$call([W,n]),i)},$getState(t=3){let[e,n]=$divMod(this.$year,256),[i,s]=$divMod(this.$micro,256),[o,r]=$divMod(i,256),a=this.$month;this.$fold&&t>3&&(a+=128);const $=new _([e,n,a,this.$day,this.$hour,this.$min,this.$sec,o,r,s]);return this.$tzinfo===y?[$]:[$,this.$tzinfo]},$setState(t,e){const[n,i,s,o,r,a,$,c,h,m]=t;s>127?(this.$fold=1,this.$month=s-128):(this.$fold=0,this.$month=s),this.$year=256*n+i,this.$day=o,this.$hour=r,this.$min=a,this.$sec=$,this.$micro=(c<<8|h)<<8|m,this.$tzinfo=e}}});function _isoweek1monday(t){const e=_ymd2ord(t,1,1),n=(e+6)%7;let i=e-n;return n>3&&(i+=7),i}Nt.prototype.min=new Nt(1,1,1),Nt.prototype.max=new Nt(9999,12,31,23,59,59,999999),Nt.prototype.resolution=new wt(0,0,1);const St=E.timezone=h("datetime.timezone",{base:Mt,constructor:function timezone(t,n){if(this.$offset=t,this.$name=n||y,!e(this.$minoffset,t,"LtE")||!e(this.$maxoffset,t,"GtE"))throw new v("offset must be a timedelta strictly between -timedelta(hours=24) and timedelta(hours=24).")},slots:{tp$new(e,n){let[i,s]=l("timezone",["offset","name"],e,n,[null]);if(!(i instanceof wt))throw new z("offset must be a timedelta");if(null===s){if(!t(i))return this.utc;s=y}else if(!k(s))throw new z("name must be a string");if(this===St.prototype)return new St(i,s);{const t=new this.constructor;return St.call(t,i,s),t}},tp$richcompare(t,n){if(!(t instanceof St))return b;const i=e(this.$offset,t.$offset,"Eq");return"NotEq"===n?!i:"Eq"===n||i&&o(n)?i:b},$r(){return this===this.utc?new w("datetime.timezone.utc"):this.$name===y?new w(`${this.tp$name}(${s(this.$offset)})`):new w(`${this.tp$name}(${s(this.$offset)}, ${s(this.$name)})`)},tp$str(){return this.tp$getattr(Y).tp$call([y])},tp$hash(){return u(this.$offset)}},methods:{tzname:{$meth:function tzname(t){if(t instanceof Nt||t===y)return this.$name===y?this.$nameFromOff(this.$offset):this.$name;throw new z("tzname() argument must be a datetime instance or None")},$flags:{OneArg:!0},$textsig:null,$doc:"If name is specified when timezone is created, returns the name. Otherwise returns offset as \'UTC(+|-)HH:MM\'."},utcoffset:{$meth:function utcoffset(t){if(t instanceof Nt||t===y)return this.$offset;throw new z("utcoffset() argument must be a datetime instance or None")},$flags:{OneArg:!0},$textsig:null,$doc:"Return fixed offset."},dst:{$meth:function dst(t){if(t instanceof Nt||t===y)return y;throw new z("dst() argument must be a datetime instance or None")},$flags:{OneArg:!0},$textsig:null,$doc:"Return None."},fromutc:{$meth:function fromutc(t){if(t instanceof Nt){if(t.$tzinfo!==this)throw new v("fromutc: dt.tzinfo is not self");return q(t,this.$offset,"Add")}throw new z("fromutc() argument must be a datetime instance or None")},$flags:{OneArg:!0},$textsig:null,$doc:"datetime in UTC -> datetime in local time."},__getinitargs__:{$meth(){return this.$name===y?new p([this.$offset]):new p([this.$offset,this.$name])},$flags:{NoArgs:!0}}},proto:{$maxoffset:new wt(0,86399,999999),$minoffset:new wt(-1,0,1),$nameFromOff(n){if(!t(n))return new w("UTC");let i,s,o,r,a,$;return e(n,bt,"Lt")?(i="-",n=n.nb$negative()):i="+",[s,o]=pyDivMod(n,pt),[r,o]=pyDivMod(o,gt),a=o.$secs,$=o.$micro,new w($?`UTC${i}${_d(s)}:${_d(r)}:${_d(a)}.${_d($,"0",6)}`:a?`UTC${i}${_d(s)}:${_d(r)}:${_d(a)}`:`UTC${i}${_d(s)}:${_d(r)}`)}}});St.prototype.utc=new St(new wt(0)),St.prototype.min=new St(new wt(0,-86340,0)),St.prototype.max=new St(new wt(0,86340,0));const kt=new Nt(1970,1,1,0,0,0,0,St.prototype.utc);return E}))}',"src/lib/document.js":'function $builtinmodule(){const{builtin:{str:i},misceval:{callsimArray:n},ffi:{toPy:t},abstr:{gattr:e}}=Sk,r={__name__:new i("document")},o=t(Sk.global.document);return Sk.abstr.setUpModuleMethods("document",r,{__getattr__:{$meth:i=>e(o,i,!0),$flags:{OneArg:!0}},__dir__:{$meth:()=>n(o.tp$getattr(i.$dir)),$flags:{NoArgs:!0}}}),r.currentDiv=new Sk.builtin.func((function(){if(void 0!==Sk.divid)return new Sk.builtin.str(Sk.divid);throw new Sk.builtin.AttributeError("There is no value set for divid")})),r.currentCourse=new Sk.builtin.func((function(){if(void 0!==eBookConfig)return new Sk.builtin.str(eBookConfig.course);throw new Sk.builtin.AttributeError("There is no course")})),r.currentGradingContainer=new Sk.builtin.func((function(){if(void 0!==Sk.gradeContainer)return new Sk.builtin.str(Sk.gradeContainer);if(null!=Sk.divid)return new Sk.builtin.str(Sk.divid);throw new Sk.builtin.AttributeError("There is no value set for grading")})),r.getCurrentEditorValue=new Sk.builtin.func((function(){if(void 0!==Sk.divid&&void 0!==window.componentMap){if(Sk.gradeContainer!=Sk.divid){var i=Sk.gradeContainer+" "+Sk.divid;return i in window.componentMap?new Sk.builtin.str(window.componentMap[i].editor.getValue()):new Sk.builtin.str(window.componentMap[Sk.divid].editor.getValue())}return new Sk.builtin.str(window.componentMap[Sk.divid].editor.getValue())}throw new Sk.builtin.AttributeError("Can\'t find editor for this div")})),r.popup=new Sk.builtin.func((function(i){const n=Sk.ffi.remapToJs(i);alert(n)})),r}',"src/lib/fractions.js":'function $builtinmodule(t){const e={};return Sk.misceval.chain(Sk.importModule("math",!1,!0),(t=>(e.math=t,Sk.importModule("sys",!1,!0))),(t=>(e.sys=t,fractionsMod(e))))}function fractionsMod({math:t,sys:e}){const{builtin:{int_:n,bool:{true$:i,false$:r},none:{none$:s},NotImplemented:{NotImplemented$:o},tuple:a,float_:$,complex:u,str:h,isinstance:l,TypeError:m,ZeroDivisionError:d,ValueError:f,NotImplementedError:c,abs:_,round:b,pow:p},ffi:{remapToPy:g},abstr:{buildNativeClass:w,copyKeywordsToNamedArgs:v,numberBinOp:y,typeName:k,lookupSpecial:E,checkArgsLen:N},misceval:{isTrue:F,richCompareBool:A,callsimArray:S,objectRepr:M}}=Sk,O={__name__:new h("fractions"),__all__:g(["Fraction"])},D=/^\\s*(?[-+]?)(?=\\d|\\.\\d)(?\\d*)(?:(?:\\/(?\\d+))?|(?:\\.(?\\d*))?(?:E(?[-+]?\\d+))?)\\s*$/i,q=new n(0),x=new n(1),z=new n(2),I=new n(10),T=new h("numerator"),R=new h("denominator"),B=new h("as_integer_ratio"),C=new h("from_float"),getNumer=t=>t.tp$getattr(T),getDenom=t=>t.tp$getattr(R),mul=(t,e)=>y(t,e,"Mult"),div=(t,e)=>y(t,e,"Div"),pow=(t,e)=>y(t,e,"Pow"),add=(t,e)=>y(t,e,"Add"),sub=(t,e)=>y(t,e,"Sub"),floorDiv=(t,e)=>y(t,e,"FloorDiv"),divmod=(t,e)=>y(t,e,"DivMod"),mod=(t,e)=>y(t,e,"Mod"),K=t.tp$getattr(new h("gcd")),eq=(t,e)=>A(t,e,"Eq"),lt=(t,e)=>A(t,e,"Lt"),ge=(t,e)=>A(t,e,"GtE"),L={NoArgs:!0},P={OneArg:!0},j=e.tp$getattr(new h("hash_info")),G=j.tp$getattr(new h("modulus")),V=j.tp$getattr(new h("inf"));function _operator_fallbacks(t,e){return[function(n){return isRational(n)?t(this,n):n instanceof $?e(this.nb$float(),n):n instanceof u?e(S(u,[this]),n):o},function(n){return isRational(n)?t(n,this):n instanceof $?e(n,this.nb$float()):n instanceof u?e(n,S(u,[this])):o}]}const[Z,H]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e);return S(ot,[add(mul(getNumer(t),i),mul(getNumer(e),n)),mul(n,i)])}),add),[J,Q]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e);return S(ot,[sub(mul(getNumer(t),i),mul(getNumer(e),n)),mul(n,i)])}),sub),[U,W]=_operator_fallbacks(((t,e)=>S(ot,[mul(getNumer(t),getNumer(e)),mul(getDenom(t),getDenom(e))])),mul),[X,Y]=_operator_fallbacks(((t,e)=>S(ot,[mul(getNumer(t),getDenom(e)),mul(getDenom(t),getNumer(e))])),div),[tt,et]=_operator_fallbacks(((t,e)=>floorDiv(mul(getNumer(t),getDenom(e)),mul(getDenom(t),getNumer(e)))),floorDiv),[nt,it]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e),[r,s]=divmod(mul(getNumer(t),i),mul(n,getNumer(e))).valueOf();return new a([r,S(ot,[s,mul(n,i)])])}),divmod),[rt,st]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e),r=mod(mul(getNumer(t),i),mul(getNumer(e),n));return S(ot,[r,mul(n,i)])}),mod),ot=O.Fraction=w("fractions.Fraction",{constructor:function(t,e){this.$num=t||q,this.$den=e||x},slots:{tp$new(t,e){N("Fraction",t,0,2);let[r,o,a]=v("Fraction",["numerator","denominator","_normalize"],t,e,[q,s,i]);const u=new this.constructor;if(o===s){if(r.ob$type===n)return u.$num=r,u.$den=x,u;if(isRational(r))return u.$num=getNumer(r),u.$den=getDenom(r),u;if(r instanceof $)return[u.$num,u.$den]=S(r.tp$getattr(B)).valueOf(),u;if(!(r instanceof h))throw new m("argument should be a string or a Rational instance");{const t=r.toString().match(D);if(null===t)throw new f("Invalid literal for Fraction: "+M(r));r=new n(t.groups.num||"0");const e=t.groups.denom;if(e)o=new n(e);else{o=x;const e=t.groups.decimal;if(e){const t=new n(""+10**e.length);r=add(mul(r,t),new n(e)),o=mul(o,t)}let i=t.groups.exp;i&&(i=new n(i),lt(i,q)?o=mul(o,pow(I,i.nb$negative())):r=mul(r,pow(I,i)))}"-"==t.groups.sign&&(r=r.nb$negative())}}else if(r.ob$type===n&&o.ob$type===n);else{if(!isRational(r)||!isRational(o))throw new m("both arguments should be Rational instances");[r,o]=[mul(getNumer(r),getDenom(o)),mul(getNumer(o),getDenom(r))]}if(eq(o,q))throw new d(`Fraction(${r}, 0)`);if(F(a)){let t=S(K,[r,o]);lt(o,q)&&(t=t.nb$negative()),r=floorDiv(r,t),o=floorDiv(o,t)}return u.$num=r,u.$den=o,u},$r(){const t=E(this.ob$type,h.$name);return new h(`${t}(${this.$num}, ${this.$den})`)},tp$str(){return eq(this.$den,x)?new h(this.$num):new h(`${this.$num}/${this.$den}`)},tp$hash(){const t=p(this.$den,sub(G,z),G);let e;e=F(t)?mod(mul(_(this.$num),t),G):V;let n=ge(this,q)?e:e.nb$negative();return n=n.tp$hash(),-1===n?-2:n},tp$richcompare(t,e){const op=(t,n)=>A(t,n,e);if("Eq"===e||"NotEq"==e){if(t.ob$type===n){const n=eq(this.$num,t)&&eq(this.$den,x);return"Eq"===e?n:!n}if(t instanceof ot||t instanceof n){const n=eq(this.$num,getNumer(t))&&eq(this.$den,getDenom(t));return"Eq"===e?n:!n}t instanceof u&&eq(t.tp$getattr(new h("imag")),q)&&(t=t.tp$getattr(new h("real")))}return isRational(t)?op(mul(getNumer(this),getDenom(t)),mul(getDenom(this),getNumer(t))):t instanceof $?Number.isFinite(t.valueOf())?op(this,S(this.tp$getattr(C),[t])):op(new $(0),t):o},tp$as_number:!0,nb$add:Z,nb$reflected_add:H,nb$subtract:J,nb$reflected_subtract:Q,nb$multiply:U,nb$reflected_multiply:W,nb$divide:X,nb$reflected_divide:Y,nb$floor_divide:tt,nb$reflected_floor_divide:et,nb$divmod:nt,nb$reflected_divmod:it,nb$remainder:rt,nb$reflected_remainder:st,nb$power(t){if(isRational(t)){if(eq(getDenom(t),x)){let e=getNumer(t);return ge(e,q)?S(ot,[pow(this.$num,e),pow(this.$den,e)],["_normalize",r]):ge(this.$num,q)?(e=e.nb$negative(),S(ot,[pow(this.$den,e),pow(this.$num,e)],["_normalize",r])):(e=e.nb$negative(),S(ot,[pow(this.$den.nb$negative(),e),pow(this.$num.nb$negative(),e)],["_normalize",r]))}return pow(this.nb$float(),S($,[t]))}return pow(this.nb$float(),t)},nb$reflected_power(t){return eq(this.$den,x)&&ge(this.$num,q)?pow(t,this.$num):isRational(t)?pow(new ot(getNumer(t),getDenom(t)),this):eq(this.$den,x)?pow(t,this.$num):pow(t,this.nb$float())},nb$positive(){return new ot(this.$num,this.$den)},nb$negative(){return new ot(this.$num.nb$negative(),this.$den)},nb$abs(){return new ot(this.$num.nb$abs(),this.$den)},nb$bool(){return this.$num.nb$bool()},nb$float(){return div(this.$num,this.$den)}},methods:{as_integer_ratio:{$meth(){return new a([this.$num,this.$den])},$flags:L},limit_denominator:{$meth(t){if(lt(t,x))throw new f("max_denominator should be at least 1");if(ge(t,this.$den))return S(ot,[this]);let[e,n,i,r]=[q,x,x,q],s=this.$num,o=this.$den;for(;;){const a=floorDiv(s,o),$=add(n,mul(a,r));if(lt(t,$))break;[e,n,i,r]=[i,r,add(e,mul(a,i)),$],[s,o]=[o,sub(s,mul(a,o))]}const a=floorDiv(sub(t,n),r),$=S(ot,[add(e,mul(a,i)),add(n,mul(a,r))]),u=S(ot,[i,r]);return ge(_(sub($,this)),_(sub(u,this)))?u:$},$flags:{NamedArgs:["max_denominator"],Defaults:[new n(1e6)]}},__trunc__:{$meth(){return lt(this.$num,q)?floorDiv(this.$num.nb$negative(),this.$den).nb$negative():floorDiv(this.$num,this.$den)},$flags:L},__floor__:{$meth(){return floorDiv(this.$num,this.$den)},$flags:L},__ceil__:{$meth(){return floorDiv(this.$num.nb$negative(),this.$den).nb$negative()},$flags:L},__round__:{$meth(t){if(t===s){const[t,e]=divmod(this.$num,this.$den).valueOf(),n=mul(e,z);return lt(n,this.$den)?t:lt(this.$den,n)?add(t,x):eq(mod(t,z),q)?t:add(t,x)}const e=pow(I,_(t));return lt(q,t)?S(ot,[b(mul(this,e)),e]):S(ot,[mul(b(div(this,e)),e)])},$flags:{NamedArgs:["ndigits"],Defaults:[s]}},__reduce__:{$meth(){return new a([this.ob$type,new a([new h(this)])])},$flags:L},__copy__:{$meth(){return this.ob$type===ot?this:S(this.ob$type,[this.$num,this.$den])},$flags:L},__deepcopy__:{$meth(t){return this.ob$type===ot?this:S(this.ob$type,[this.$num,this.$den])},$flags:P}},classmethods:{from_float:{$meth(t){if(t instanceof n)return S(this,[t]);if(t instanceof $){const[e,n]=S(t.tp$getattr(B)).valueOf();return S(this,[e,n])}throw new m(`${k(this)}.from_float() only takes floats, not ${M(t)}, (${k(t)})`)},$flags:P},from_decimal:{$meth(){throw c("from_decimal not yet implemented in SKulpt")},$flags:P}},getsets:{numerator:{$get(){return this.$num}},denominator:{$get(){return this.$den}},_numerator:{$get(){return this.$num},$set(t){this.$num=t}},_denominator:{$get(){return this.$den},$set(t){this.$den=t}}}}),at=new a([n,ot]),isRational=t=>F(l(t,at));return O}',"src/lib/functools.js":'function $builtinmodule(){const t={};return Sk.misceval.chain(Sk.importModule("collections",!1,!0),(e=>(t._namedtuple=e.$d.namedtuple,functools_mod(t))))}function functools_mod(t){const{object:e,int_:n,str:r,list:s,tuple:a,dict:i,none:{none$:o},bool:{false$:c},NotImplemented:{NotImplemented$:_},bool:l,func:h,method:p,TypeError:u,RuntimeError:d,ValueError:f,NotImplementedError:m,AttributeError:w,OverflowError:g,checkNone:$,checkBool:y,checkCallable:k,checkClass:b}=Sk.builtin,{callsimArray:x,callsimOrSuspendArray:A,iterFor:S,chain:E,isIndex:v,asIndexSized:N,isTrue:P,richCompareBool:j,objectRepr:R,retryOptionalSuspeionOrThrow:z,chain:q}=Sk.misceval,{remapToPy:T}=Sk.ffi,{checkOneArg:I,checkNoKwargs:C,buildNativeClass:D,setUpModuleMethods:M,keywordArrayFromPyDict:O,keywordArrayToPyDict:W,objectHash:U,lookupSpecial:F,copyKeywordsToNamedArgs:G,typeName:B,objectSetItem:K,iter:L,gattr:H}=Sk.abstr,{getSetDict:V,getAttr:J,setAttr:Q}=Sk.generic;function proxyFail(t){return new h((()=>{throw new m(t+" is not yet implemented in skulpt")}))}Object.assign(t,{__name__:new r("functools"),__doc__:new r("Tools for working with functions and callable objects"),__all__:new s(["update_wrapper","wraps","WRAPPER_ASSIGNMENTS","WRAPPER_UPDATES","total_ordering","cmp_to_key","cache","lru_cache","reduce","partial","partialmethod","singledispatch","singledispatchmethod","cached_property"].map((t=>new r(t)))),WRAPPER_ASSIGNMENTS:new a(["__module__","__name__","__qualname__","__doc__","__annotations__"].map((t=>new r(t)))),WRAPPER_UPDATES:new a([new r("__dict__")]),singledispatch:proxyFail("singledispatch"),singledispatchmethod:proxyFail("singledispatchmethod")});const X=new r("cache_parameters");function _lru_cache(e,n){if(n||(n=c),v(e))(e=N(e,g))<0&&(e=0);else{if(k(e)&&y(n)){const r=e,s=new Z(r,e=128,n);return s.tp$setattr(X,new h((()=>T({maxsize:e,typed:n})))),A(t.update_wrapper,[s,r])}if(!$(e))throw new u("Expected first argument to be an integer, a callable, or None")}return new h((r=>{const s=new Z(r,e,n);return s.tp$setattr(X,new h((()=>T({maxsize:e,typed:n})))),A(t.update_wrapper,[s,r])}))}const Y=t._CacheInfo=x(t._namedtuple,["CacheInfo",["hits","misses","maxsize","currsize"]].map((t=>T(t))),["module",new r("functools")]),Z=D("functools._lru_cache_wrapper",{constructor:function _lru_cache_wrapper(t,e,n,r){if(!k(t))throw new u("the first argument must be callable");let s;if($(e))s=infinite_lru_cache_wrapper,e=-1;else{if(!v(e))throw new u("maxsize should be integer or None");(e=N(e,g))<0&&(e=0),s=0===e?uncached_lru_cache_wrapper:bounded_lru_cache_wrapper}this.root={},this.root.prev=this.root.next=this.root,this.wrapper=s,this.maxsize=e,this.typed=n,this.cache=new i([]),this.func=t,this.misses=this.hits=0,this.$d=new i([])},slots:{tp$new(t,e){const[n,r,s,a]=G("_lru_cache_wrapper",["user_function","maxsize","typed","cache_info_type"],t,e);return new Z(n,r,s,a)},tp$call(t,e){return this.wrapper(t,e)},tp$descr_get(t,e){return null===t?this:new p(this,t)},tp$doc:"Create a cached callable that wraps another function.\\n\\nuser_function: the function being cached\\n\\nmaxsize: 0 for no caching\\n None for unlimited cache size\\n n for a bounded cache\\n\\ntyped: False cache f(3) and f(3.0) as identical calls\\n True cache f(3) and f(3.0) as distinct calls\\n\\ncache_info_type: namedtuple class with the fields:\\n hits misses currsize maxsize\\n"},methods:{cache_info:{$meth(){return A(Y,[this.hits,this.misses,-1===this.maxsize?o:this.maxsize,this.cache.get$size()].map((t=>T(t))))},$flags:{NoArgs:!0},$doc:"Report cache statistics"},cache_clear:{$meth(){return this.hits=this.misses=0,this.root={},this.root.next=this.root.prev=this.root,A(this.cache.tp$getattr(new r("clear"),!0))},$flags:{NoArgs:!0},$doc:"Clear the cache and cache statistics"},__deepcopy__:{$meth(t){return this},$flags:{OneArg:!0}},__copy__:{$meth(){return this},$flags:{NoArgs:!0}}},getsets:{__dict__:V}});function infinite_lru_cache_wrapper(t,e){const n=_make_key(t,e,this.typed),r=this.cache.mp$lookup(n);return void 0!==r?(this.hits++,r):(this.misses++,E(A(this.func,t,e),(t=>(this.cache.mp$ass_subscript(n,t),t))))}function uncached_lru_cache_wrapper(t,e){return this.misses++,A(this.func,t,e)}function bounded_lru_cache_wrapper(t,e){const n=_make_key(t,e,this.typed),r=this.cache.mp$lookup(n);if(void 0!==r){const{result:t}=r;return lru_cache_extract_link(r),lru_cache_append_link(this,r),this.hits++,t}return this.misses++,E(A(this.func,t,e),(t=>{if(void 0!==this.cache.mp$lookup(n))return t;if(this.cache.get$size()t.ob$type)),...i.map((t=>t.ob$type)));else if(1===s.length&&nt.has(s[0].ob$type))return s[0];return new tt(s)}function partial_adjust_args_kwargs(t,e){if(t=this.arg_arr.concat(t),e){e=W(e);const t=this.kwdict.dict$copy();t.dict$merge(e),e=O(t)}else e=O(this.kwdict);return{args:t,kwargs:e}}function partial_new(t,e){if(t.length<1)throw new u("type \'partial\' takes at least 1 argument");let n,r,s=t.shift();if(s instanceof this.sk$builtinBase){const t=s;s=t.fn,n=t.arg_arr,r=t.kwdict}this.check$func(s),n&&(t=n.concat(t));let a=W(e=e||[]);if(r){const t=r.dict$copy();t.dict$merge(a),a=t}if(this.sk$builtinBase===this.constructor)return new this.constructor(s,t,a);{const e=new this.constructor;return this.sk$builtinBase.call(e,s,t,a),e}}function partial_repr(){if(this.in$repr)return new r("...");this.in$repr=!0;const t=[R(this.fn)];return this.arg_arr.forEach((e=>{t.push(R(e))})),this.kwdict.$items().forEach((([e,n])=>{t.push(e.toString()+"="+R(n))})),this.in$repr=!1,new r(this.tp$name+"("+t.join(", ")+")")}t.partial=D("functools.partial",{constructor:function partial(t,e,n){this.fn=t,this.arg_arr=e,this.arg_tup=new a(e),this.kwdict=n,this.in$repr=!1,this.$d=new i([])},slots:{tp$new:partial_new,tp$call(t,e){return({args:t,kwargs:e}=this.adj$args_kws(t,e)),this.fn.tp$call(t,e)},tp$doc:"partial(func, *args, **keywords) - new function with partial application\\n of the given arguments and keywords.\\n",$r:partial_repr,tp$getattr:J,tp$setattr:Q},getsets:{func:{$get(){return this.fn},$doc:"function object to use in future partial calls"},args:{$get(){return this.arg_tup},$doc:"tuple of arguments to future partial calls"},keywords:{$get(){return this.kwdict},$doc:"dictionary of keyword arguments to future partial calls"},__dict__:V},methods:{},classmethods:Sk.generic.classGetItem,proto:{adj$args_kws:partial_adjust_args_kwargs,check$func(t){if(!k(t))throw new u("the first argument must be callable")}}}),t.partialmethod=D("functools.partialmethod",{constructor:function partialmethod(t,e,n){this.fn=t,this.arg_arr=e,this.arg_tup=new a(e),this.kwdict=n},slots:{tp$new:partial_new,tp$doc:"Method descriptor with partial application of the given arguments\\n and keywords.\\n\\n Supports wrapping existing descriptors and handles non-descriptor\\n callables as instance methods.\\n ",$r:partial_repr,tp$descr_get(e,n){let r;if(this.fn.tp$descr_get){const s=this.fn.tp$descr_get(e,n);if(s!==this.fn){if(!k(s))throw new u("type \'partial\' requires a callable");r=new t.partial(s,this.arg_arr.slice(0),this.kwdict.dict$copy());const e=F(s,this.str$self);void 0!==e&&r.tp$setattr(this.str$self,e)}}return void 0===r&&(r=this.make$unbound().tp$descr_get(e,n)),r}},methods:{_make_unbound_method:{$meth(){return this.make$unbound()},$flags:{NoArgs:!0}}},classmethods:Sk.generic.classGetItem,getsets:{func:{$get(){return this.fn},$doc:"function object to use in future partial calls"},args:{$get(){return this.arg_tup},$doc:"tuple of arguments to future partial calls"},keywords:{$get(){return this.kwdict},$doc:"dictionary of keyword arguments to future partial calls"},__dict__:V},proto:{str$self:new r("__self__"),make$unbound(){const t=this;function _method(e,n){const r=e.shift();return({args:e,kwargs:n}=t.adj$args_kws(e,n)),e.unshift(r),A(t.fn,e,n)}return _method.co_fastcall=!0,new h(_method)},adj$args_kws:partial_adjust_args_kwargs,check$func(t){if(!k(t)&&void 0===t.tp$descr_get)throw new u(R(t)+" is not callable or a descriptor")}}});const rt={__lt__:r.$lt,__le__:r.$le,__gt__:r.$gt,__ge__:r.$ge};function from_slot(t,e){const n=rt[t];function compare_slot(t,r){let s=x(t.tp$getattr(n),[r]);return s===_?s:(s=P(s),new l(e(s,t,r)))}return compare_slot.co_name=n,compare_slot}const st=from_slot("__lt__",((t,e,n)=>!t&&j(e,n,"NotEq"))),at=from_slot("__lt__",((t,e,n)=>t||j(e,n,"Eq"))),it=from_slot("__lt__",(t=>!t)),ot=from_slot("__le__",((t,e,n)=>!t||j(e,n,"Eq"))),ct=from_slot("__le__",((t,e,n)=>t&&j(e,n,"NotEq"))),_t=from_slot("__le__",(t=>!t)),lt=from_slot("__gt__",((t,e,n)=>!t&&j(e,n,"NotEq"))),ht=from_slot("__gt__",((t,e,n)=>t||j(e,n,"Eq"))),pt=from_slot("__gt__",(t=>!t)),ut=from_slot("__ge__",((t,e,n)=>!t||j(e,n,"Eq"))),dt=from_slot("__ge__",((t,e,n)=>t&&j(e,n,"NotEq"))),ft=from_slot("__ge__",(t=>!t)),mt={__lt__:{__gt__:new h(st),__le__:new h(at),__ge__:new h(it)},__le__:{__ge__:new h(ot),__lt__:new h(ct),__gt__:new h(_t)},__gt__:{__lt__:new h(lt),__ge__:new h(ht),__le__:new h(pt)},__ge__:{__le__:new h(ut),__gt__:new h(dt),__lt__:new h(ft)}},wt={__lt__:"ob$lt",__le__:"ob$le",__gt__:"ob$gt",__ge__:"ob$ge"};const gt=new r("get"),$t=new e;t.cached_property=D("functools.cached_property",{constructor:function(){},slots:{tp$init(t,e){I("cached_property",t,e),C("cached_property",e),this._func=t[0],this._attr=o},tp$descr_get(t,e,n){if(null==t)return this;if(this._attr===o)throw new u("Cannot use cached_property instance without calling __set_name__ on it.");let s;try{s=H(t,r.$dict)}catch(c){if(c instanceof w){const e=`No \'__dict__\' attribute on \'${B(t)}\' instance to cache ${R(this._attr)} property.`;throw new u(e)}throw c}const a=H(s,gt);let i=x(a,[this._attr,$t]);if(i===$t){const e=A(this._func,[t]);i=q(e,(n=>{try{return K(s,this._attr,e),n}catch(c){if(c instanceof u){const e=`The \'__dict__\' attribute on \'${B(t)}\' instance does not support item assignment for caching ${R(this._attr)} property.`;throw new u(e)}throw c}}))}return n?i:z(i)}},getsets:{__doc__:{$get(){return this._func.tp$getattr(r.$doc)||o}}},methods:{__set_name__:{$meth(t,e){if(this._attr===o)this._attr=e;else if(e.toString()!==this._attr.toString())throw new u(`Cannot assign the same cached_property to two different names (${R(this._attr)} and ${R(e)})`)},$flags:{MinArgs:2,MaxArgs:2}}},classmethods:Sk.generic.classGetItem});const yt=new n(0),kt=D("functools.KeyWrapper",{constructor:function(t,e){this.cmp=t,this.obj=e},slots:{tp$call(t,e){const[n]=G("K",["obj"],t,e,[]);return new kt(this.cmp,n)},tp$richcompare(t,e){if(!(t instanceof kt))throw new u("other argument must be K instance");const n=this.obj,r=t.obj;if(!n||!r)throw new w("object");const s=A(this.cmp,[n,r]);return E(s,(t=>j(t,yt,e)))},tp$getattr:J,tp$hash:o},getsets:{obj:{$get(){return this.obj||o},$set(t){this.obj=t},$doc:"Value wrapped by a key function."}}}),bt=new r("update"),xt=new r("__wrapped__");return M("functools",t,{cache:{$meth:function cache(t){return A(_lru_cache(o),[t])},$flags:{OneArg:!0},$doc:\'Simple lightweight unbounded cache. Sometimes called "memoize".\',$textsig:"($module, user_function, /)"},lru_cache:{$meth:_lru_cache,$flags:{NamedArgs:["maxsize","typed"],Defaults:[new n(128),c]},$doc:"Least-recently-used cache decorator.\\n\\nIf *maxsize* is set to None, the LRU features are disabled and the cache\\ncan grow without bound.\\n\\nIf *typed* is True, arguments of different types will be cached separately.\\nFor example, f(3.0) and f(3) will be treated as distinct calls with\\ndistinct results.\\n\\nArguments to the cached function must be hashable.\\n\\nView the cache statistics named tuple (hits, misses, maxsize, currsize)\\nwith f.cache_info(). Clear the cache and statistics with f.cache_clear().\\nAccess the underlying function with f.__wrapped__.\\n\\nSee: http://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)"},cmp_to_key:{$meth:function cmp_to_key(t){return new kt(t)},$flags:{NamedArgs:["mycmp"],Defaults:[]},$doc:"Convert a cmp= function into a key= function.",$textsig:"($module, cmp, /)"},reduce:{$meth:function reduce(t,e,n){const r=L(e);let s;return n=n||r.tp$iternext(!0),E(n,(e=>{if(void 0===e)throw new u("reduce() of empty sequence with no initial value");return s=e,S(r,(e=>E(A(t,[s,e]),(t=>{s=t}))))}),(()=>s))},$flags:{MinArgs:2,MaxArgs:3},$doc:"reduce(function, sequence[, initial]) -> value\\n\\nApply a function of two arguments cumulatively to the items of a sequence,\\nfrom left to right, so as to reduce the sequence to a single value.\\nFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\\n((((1+2)+3)+4)+5). If initial is present, it is placed before the items\\nof the sequence in the calculation, and serves as a default when the\\nsequence is empty.",$textsig:"($module, function, sequence[, initial], /)"},total_ordering:{$meth:function total_ordering(t){const n=[];if(!b(t))throw new u("total ordering only supported for type objects not \'"+B(t)+"\'");if(Object.keys(mt).forEach((r=>{const s=wt[r];t.prototype[s]!==e.prototype[s]&&n.push(r)})),!n.length)throw new f("must define atleast one ordering operation: <, >, <=, >=");const r=n[0];return Object.entries(mt[r]).forEach((([e,r])=>{n.includes(e)||t.tp$setattr(rt[e],r)})),t},$flags:{OneArg:!0},$doc:"Class decorator that fills in missing ordering methods"},update_wrapper:{$meth:function update_wrapper(t,e,n,r){let s,a=L(n);for(let i=a.tp$iternext();void 0!==i;i=a.tp$iternext())void 0!==(s=e.tp$getattr(i))&&t.tp$setattr(i,s);a=L(r);for(let o=a.tp$iternext();void 0!==o;o=a.tp$iternext()){s=e.tp$getattr(o)||new i([]);const n=H(t,o),r=H(n,bt);x(r,[s])}return t.tp$setattr(xt,e),t},$flags:{NamedArgs:["wrapper","wrapped","assigned","updated"],Defaults:[t.WRAPPER_ASSIGNMENTS,t.WRAPPER_UPDATES]},$doc:"Update a wrapper function to look like the wrapped function\\n\\n wrapper is the function to be updated\\n wrapped is the original function\\n assigned is a tuple naming the attributes assigned directly\\n from the wrapped function to the wrapper function (defaults to\\n functools.WRAPPER_ASSIGNMENTS)\\n updated is a tuple naming the attributes of the wrapper that\\n are updated with the corresponding attribute from the wrapped\\n function (defaults to functools.WRAPPER_UPDATES)\\n ",$textsig:"($module, /, wrapper, wrapped, assigned=(\'__module__\', \'__name__\', \'__qualname__\', \'__doc__\', \'__annotations__\'), updated=(\'__dict__\',))"},wraps:{$meth:function wraps(e,n,r){const s=["wrapped",e,"assigned",n,"updated",r];return A(t.partial,[t.update_wrapper],s)},$flags:{NamedArgs:["wrapped","assigned","updated"],Defaults:[t.WRAPPER_ASSIGNMENTS,t.WRAPPER_UPDATES]},$doc:"Decorator factory to apply update_wrapper() to a wrapper function\\n\\n Returns a decorator that invokes update_wrapper() with the decorated\\n function as the wrapper argument and the arguments to wraps() as the\\n remaining arguments. Default arguments are as for update_wrapper().\\n This is a convenience function to simplify applying partial() to\\n update_wrapper().\\n ",$textsig:"($module, /, wrapped, assigned=(\'__module__\', \'__name__\', \'__qualname__\', \'__doc__\', \'__annotations__\'), updated=(\'__dict__\',))"}}),t}',"src/lib/image.js":'var ImageMod,$builtinmodule;ImageMod||((ImageMod={}).canvasLib=[]),$builtinmodule=function(e){var n,i,t,a,u,l,r,c={__name__:new Sk.builtin.str("image")};return c.Image=Sk.misceval.buildClass(c,(function(e,n){u=function(e){e.width=e.image.width,e.height=e.image.height,e.delay=0,e.updateCount=0,e.updateInterval=1,e.lastx=0,e.lasty=0,e.canvas=document.createElement("canvas"),e.canvas.height=e.height,e.canvas.width=e.width,e.ctx=e.canvas.getContext("2d"),e.ctx.drawImage(e.image,0,0),e.imagedata=e.ctx.getImageData(0,0,e.width,e.height)},n.__init__=new Sk.builtin.func((function(e,n){var i;Sk.builtin.pyCheckArgsLen("__init__",arguments.length,2,2);try{e.image=document.getElementById(Sk.ffi.remapToJs(n)),null==e.image&&(e.image=document.querySelector(`[data-filename="${Sk.ffi.remapToJs(n)}"]`)),u(e)}catch(t){e.image=null}if(null==e.image)return(i=new Sk.misceval.Suspension).resume=function(){if(i.data.error)throw new Sk.builtin.IOError(i.data.error.message)},i.data={type:"Sk.promise",promise:new Promise((function(i,t){var a=new Image;a.crossOrigin="",a.onerror=function(){t(Error("Failed to load URL: "+a.src))},a.onload=function(){e.image=this,u(e),i()},a.src=r(n)}))},i})),r=function(e){let n=Sk.ffi.remapToJs(e);try{let e=Sk.read(n);return`data:image/${n.substring(n.lastIndexOf(".")+1)};base64, ${e}`}catch(u){console.log(`${n} is not in the database ${u}`)}var i,t,a="function"==typeof Sk.imageProxy?Sk.imageProxy:function(e){return(i=document.createElement("a")).href=t,window.location.host!==i.host?Sk.imageProxy+"/"+e:e};return t=a(t=Sk.ffi.remapToJs(e))},l=function(e,n,i){if(n<0||i<0||n>=e.width||i>=e.height)throw new Sk.builtin.ValueError("Pixel index out of range.")};var setdelay=function(e,n,i){var t;Sk.builtin.pyCheckArgsLen("setdelay",arguments.length,2,3),e.delay=Sk.ffi.remapToJs(n),t=Sk.builtin.asnum$(i),e.updateInterval=t||1};n.set_delay=new Sk.builtin.func(setdelay),n.setDelay=new Sk.builtin.func(setdelay);var getpixels=function(e){var n,i=[];for(Sk.builtin.pyCheckArgsLen("getpixels",arguments.length,1,1),n=0;n0?window.setTimeout(n,e.delay):n()):n()}))},t};var setpixel=function(e,n,i,t){var u;return Sk.builtin.pyCheckArgsLen("setpixel",arguments.length,4,4),n=Sk.builtin.asnum$(n),i=Sk.builtin.asnum$(i),l(e,n,i),u=4*i*e.width+4*n,e.imagedata.data[u]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getRed,[t])),e.imagedata.data[u+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getGreen,[t])),e.imagedata.data[u+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getBlue,[t])),e.imagedata.data[u+3]=255,a(e)};n.set_pixel=new Sk.builtin.func(setpixel),n.setPixel=new Sk.builtin.func(setpixel);var setpixelat=function(e,n,i){var t,u,r;return Sk.builtin.pyCheckArgsLen("setpixelat",arguments.length,3,3),t=(n=Sk.builtin.asnum$(n))%e.image.width,u=Math.floor(n/e.image.width),l(e,t,u),r=4*u*e.width+4*t,e.imagedata.data[r]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getRed,[i])),e.imagedata.data[r+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getGreen,[i])),e.imagedata.data[r+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getBlue,[i])),e.imagedata.data[r+3]=255,a(e)};n.set_pixel_at=new Sk.builtin.func(setpixelat),n.setPixelAt=new Sk.builtin.func(setpixelat);var updatepixel=function(e,n){var i,t,u;return Sk.builtin.pyCheckArgsLen("updatepixel",arguments.length,2,2),i=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getX,[n])),t=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getY,[n])),l(e,i,t),u=4*t*e.width+4*i,e.imagedata.data[u]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getRed,[n])),e.imagedata.data[u+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getGreen,[n])),e.imagedata.data[u+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getBlue,[n])),e.imagedata.data[u+3]=255,a(e)};n.update_pixel=new Sk.builtin.func(updatepixel),n.updatePixel=new Sk.builtin.func(updatepixel);var getheight=function(e){return Sk.builtin.pyCheckArgsLen("getheight",arguments.length,1,1),new Sk.builtin.int_(e.height)};n.get_height=new Sk.builtin.func(getheight),n.getHeight=new Sk.builtin.func(getheight);var getwidth=function(e,n){return Sk.builtin.pyCheckArgsLen("getwidth",arguments.length,1,1),new Sk.builtin.int_(e.width)};n.get_width=new Sk.builtin.func(getwidth),n.getWidth=new Sk.builtin.func(getwidth),n.__getattr__=new Sk.builtin.func((function(e,n){return"height"===(n=Sk.ffi.remapToJs(n))?Sk.builtin.assk$(e.height):"width"===n?Sk.builtin.assk$(e.width):void 0})),n.__setattr__=new Sk.builtin.func((function(e,n,i){throw"height"===(n=Sk.ffi.remapToJs(n))||"width"===n?new Sk.builtin.Exception("Cannot change height or width they can only be set on creation"):new Sk.builtin.Exception("Unknown attribute: "+n)})),n.draw=new Sk.builtin.func((function(e,n,i,t){var a;return Sk.builtin.pyCheckArgsLen("draw",arguments.length,2,4),(a=new Sk.misceval.Suspension).resume=function(){return Sk.builtin.none.none$},a.data={type:"Sk.promise",promise:new Promise((function(a,u){var l;n=Sk.builtin.asnum$(n),i=Sk.builtin.asnum$(i),t=Sk.builtin.asnum$(t),l=Sk.misceval.callsimArray(n.getWin,[n]).getContext("2d"),void 0===i&&(i=0,t=0),e.lastUlx=i,e.lastUly=t,e.lastCtx=l,l.putImageData(e.imagedata,i,t),e.delay>0?window.setTimeout(a,e.delay):window.setTimeout(a,200)}))},a}))}),"Image",[]),t=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){Sk.builtin.pyCheckArgsLen("__init__",arguments.length,3,3),e.width=Sk.builtin.asnum$(n),e.height=Sk.builtin.asnum$(i),e.canvas=document.createElement("canvas"),e.ctx=e.canvas.getContext("2d"),e.canvas.height=e.height,e.canvas.width=e.width,e.imagedata=e.ctx.getImageData(0,0,e.width,e.height)}))},c.EmptyImage=Sk.misceval.buildClass(c,t,"EmptyImage",[c.Image]),i=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i,t,a,u){Sk.builtin.pyCheckArgsLen("__init__",arguments.length,4,6),e.red=Sk.builtin.asnum$(n),e.green=Sk.builtin.asnum$(i),e.blue=Sk.builtin.asnum$(t),e.x=Sk.builtin.asnum$(a),e.y=Sk.builtin.asnum$(u)}));var getred=function(e){return Sk.builtin.pyCheckArgsLen("getred",arguments.length,1,1),Sk.builtin.assk$(e.red)};n.get_red=new Sk.builtin.func(getred),n.getRed=new Sk.builtin.func(getred);var getgreen=function(e){return Sk.builtin.pyCheckArgsLen("getgreen",arguments.length,1,1),Sk.builtin.assk$(e.green)};n.get_green=new Sk.builtin.func(getgreen),n.getGreen=new Sk.builtin.func(getgreen);var getblue=function(e){return Sk.builtin.pyCheckArgsLen("getblue",arguments.length,1,1),Sk.builtin.assk$(e.blue)};n.get_blue=new Sk.builtin.func(getblue),n.getBlue=new Sk.builtin.func(getblue);var getx=function(e){return Sk.builtin.pyCheckArgsLen("getx",arguments.length,1,1),Sk.builtin.assk$(e.x)};n.get_x=new Sk.builtin.func(getx),n.getX=new Sk.builtin.func(getx);var gety=function(e){return Sk.builtin.pyCheckArgsLen("gety",arguments.length,1,1),Sk.builtin.assk$(e.y)};n.get_y=new Sk.builtin.func(gety),n.getY=new Sk.builtin.func(gety);var setred=function(e,n){Sk.builtin.pyCheckArgsLen("setred",arguments.length,2,2),e.red=Sk.builtin.asnum$(n)};n.set_red=new Sk.builtin.func(setred),n.setRed=new Sk.builtin.func(setred);var setgreen=function(e,n){Sk.builtin.pyCheckArgsLen("setgreen",arguments.length,2,2),e.green=Sk.builtin.asnum$(n)};n.set_green=new Sk.builtin.func(setgreen),n.setGreen=new Sk.builtin.func(setgreen);var setblue=function(e,n){Sk.builtin.pyCheckArgsLen("setblue",arguments.length,2,2),e.blue=Sk.builtin.asnum$(n)};n.set_blue=new Sk.builtin.func(setblue),n.setBlue=new Sk.builtin.func(setblue),n.__getattr__=new Sk.builtin.func((function(e,n){return"red"===(n=Sk.ffi.remapToJs(n))?Sk.builtin.assk$(e.red):"green"===n?Sk.builtin.assk$(e.green):"blue"===n?Sk.builtin.assk$(e.blue):void 0})),n.__setattr__=new Sk.builtin.func((function(e,n,i){"red"!==(n=Sk.ffi.remapToJs(n))&&"green"!==n&&"blue"!==n||(e[n]=Sk.builtin.asnum$(i))}));var setx=function(e,n){Sk.builtin.pyCheckArgsLen("setx",arguments.length,2,2),e.x=Sk.builtin.asnum$(n)};n.set_x=new Sk.builtin.func(setx),n.setX=new Sk.builtin.func(setx);var sety=function(e,n){Sk.builtin.pyCheckArgsLen("sety",arguments.length,2,2),e.y=Sk.builtin.asnum$(n)};n.set_y=new Sk.builtin.func(sety),n.setY=new Sk.builtin.func(sety),n.__getitem__=new Sk.builtin.func((function(e,n){return 0===(n=Sk.builtin.asnum$(n))?e.red:1==n?e.green:2==n?e.blue:void 0})),n.__str__=new Sk.builtin.func((function(e){return Sk.ffi.remapToPy("["+e.red+","+e.green+","+e.blue+"]")})),n.getColorTuple=new Sk.builtin.func((function(e,n,i){})),n.setRange=new Sk.builtin.func((function(e,n){e.max=Sk.builtin.asnum$(n)}))},c.Pixel=Sk.misceval.buildClass(c,i,"Pixel",[]),n=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){var t,a,u;Sk.builtin.pyCheckArgsLen("__init__",arguments.length,1,3),void 0===(t=ImageMod.canvasLib[Sk.canvas])?(a=document.createElement("canvas"),u=document.getElementById(Sk.canvas),e.theScreen=a,u.appendChild(a),ImageMod.canvasLib[Sk.canvas]=a,ImageMod.canvasLib[Sk.canvas]=e.theScreen):(e.theScreen=t,e.theScreen.height=e.theScreen.height),void 0!==n?(e.theScreen.height=i.v,e.theScreen.width=n.v):(Sk.availableHeight&&(e.theScreen.height=Sk.availableHeight),Sk.availableWidth&&(e.theScreen.width=Sk.availableWidth)),e.theScreen.style.display="block"})),n.getWin=new Sk.builtin.func((function(e){return e.theScreen})),n.exitonclick=new Sk.builtin.func((function(e){var n=e.theScreen.id;e.theScreen.onclick=function(){document.getElementById(n).style.display="none",document.getElementById(n).onclick=null,delete ImageMod.canvasLib[n]}}))},c.ImageWin=Sk.misceval.buildClass(c,n,"ImageWin",[]),c};',"src/lib/itertools.js":'var $builtinmodule=function(t){const{abstr:{checkOneArg:e,copyKeywordsToNamedArgs:i,checkArgsLen:r},builtin:{tuple:s,bool:{false$:n}},misceval:{chain:o,retryOptionSuspensionOrThrow:l,isTrue:c,iterFor:a,Break:h}}=Sk,u={};function combinationsNew(t,e,i){let r,s;[r,s]=Sk.abstr.copyKeywordsToNamedArgs(t.tp$name,["iterable","r"],e,i,[]);const n=Sk.misceval.arrayFromIterable(r);if(s=Sk.misceval.asIndexSized(s,Sk.builtin.OverFlowError),s<0)throw new Sk.builtin.ValueError("r must be non-negative");if(this===t)return new t.constructor(n,s);{const e=new this.constructor;return t.constructor.call(e,n,s),e}}return u.accumulate=Sk.abstr.buildIteratorClass("itertools.accumulate",{constructor:function accumulate(t,e,i){this.iter=t,this.func=e,this.total=i,this.tp$iternext=()=>(this.total=Sk.builtin.checkNone(this.total)?this.iter.tp$iternext():this.total,this.tp$iternext=this.constructor.prototype.tp$iternext,this.total)},iternext(t){let e=this.iter.tp$iternext();if(void 0!==e)return this.total=Sk.misceval.callsimArray(this.func,[this.total,e]),this.total},slots:{tp$doc:"accumulate(iterable[, func, initial]) --\\x3e accumulate object\\n\\nReturn series of accumulated sums (or other binary function results).",tp$new(t,e){Sk.abstr.checkArgsLen("accumulate",t,0,2);let[i,r,s]=Sk.abstr.copyKeywordsToNamedArgs("accumulate",["iterable","func","initial"],t,e,[Sk.builtin.none.none$,Sk.builtin.none.none$]);if(i=Sk.abstr.iter(i),r=Sk.builtin.checkNone(r)?new Sk.builtin.func(((t,e)=>Sk.abstr.numberBinOp(t,e,"Add"))):r,this===u.accumulate.prototype)return new u.accumulate(i,r,s);{const t=new this.constructor;return u.accumulate.call(t,i,r,s),t}}}}),u.batched=Sk.abstr.buildIteratorClass("itertools.batched",{constructor:function batched(t,e,i){this.it=t,this.n=e,this.strict=i},slots:{tp$new(t,e){r("batched",t,2,2);let[s,o,l]=i("batched",[null,null,"strict"],t,e,[n]);if(o=Sk.misceval.asIndexSized(o,Sk.builtin.OverFlowError),o<1)throw new Sk.builtin.ValueError("n must be at least one");const a=Sk.abstr.iter(s);return new u.batched(a,o,c(l))},tp$doc:"Batch data into tuples of length n. The last batch may be shorter than n."},iternext(t){let e=0;const i=[],r=o(a(this.it,(t=>{if(e++,i.push(t),e===this.n)return h()})),(()=>{if(0!=e){if(e{if(this.tp$iternext=this.constructor.prototype.tp$iternext,this.current_it=this.iterables.tp$iternext(),void 0!==this.current_it)return this.current_it=Sk.abstr.iter(this.current_it),this.tp$iternext();this.tp$iternext=()=>{}}},iternext(t){let e;for(;void 0===e;){if(e=this.current_it.tp$iternext(),void 0!==e)return e;if(this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)return void(this.tp$iternext=()=>{});this.current_it=Sk.abstr.iter(this.current_it)}},slots:{tp$doc:"chain(*iterables) --\\x3e chain object\\n\\nReturn a chain object whose .__next__() method returns elements from the\\nfirst iterable until it is exhausted, then elements from the next\\niterable, until all of the iterables are exhausted.",tp$new(t,e){if(Sk.abstr.checkNoKwargs("chain",e),t=new Sk.builtin.tuple(t.slice(0)).tp$iter(),this===u.chain.prototype)return new u.chain(t);{const e=new this.constructor;return u.chain.call(e,t),e}}},classmethods:Object.assign({from_iterable:{$meth(t){const e=Sk.abstr.iter(t);return new u.chain(e)},$flags:{OneArg:!0},$doc:"chain.from_iterable(iterable) --\\x3e chain object\\n\\nAlternate chain() constructor taking a single iterable argument\\nthat evaluates lazily.",$textsig:null}},Sk.generic.classGetItem)}),u.combinations=Sk.abstr.buildIteratorClass("itertools.combinations",{constructor:function combinations(t,e){this.pool=t,this.r=e,this.indices=new Array(e).fill().map(((t,e)=>e)),this.n=t.length,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(t){let e,i=!1;for(e=this.r-1;e>=0;e--)if(this.indices[e]!=e+this.n-this.r){i=!0;break}if(!i)return void(this.r=0);this.indices[e]++;for(let s=e+1;sthis.pool[t]));return new Sk.builtin.tuple(r)},slots:{tp$doc:"combinations(iterable, r) --\\x3e combinations object\\n\\nReturn successive r-length combinations of elements in the iterable.\\n\\ncombinations(range(4), 3) --\\x3e (0,1,2), (0,1,3), (0,2,3), (1,2,3)",tp$new(t,e){return combinationsNew.call(this,u.combinations.prototype,t,e)}}}),u.combinations_with_replacement=Sk.abstr.buildIteratorClass("itertools.combinations_with_replacement",{constructor:function combinations_with_replacement(t,e){this.pool=t,this.r=e,this.indices=new Array(e).fill(0),this.n=t.length,this.tp$iternext=()=>{if(this.r&&!this.n)return;this.tp$iternext=this.constructor.prototype.tp$iternext;const t=this.indices.map((t=>this.pool[t]));return new Sk.builtin.tuple(t)}},iternext(t){let e,i=!1;for(e=this.r-1;e>=0;e--)if(this.indices[e]!=this.n-1){i=!0;break}if(!i)return void(this.r=0);const r=this.indices[e]+1;for(let n=e;nthis.pool[t]));return new Sk.builtin.tuple(s)},slots:{tp$doc:"combinations_with_replacement(iterable, r) --\\x3e combinations_with_replacement object\\n\\nReturn successive r-length combinations of elements in the iterable\\nallowing individual elements to have successive repeats.\\ncombinations_with_replacement(\'ABC\', 2) --\\x3e AA AB AC BB BC CC",tp$new(t,e){return combinationsNew.call(this,u.combinations_with_replacement.prototype,t,e)}}}),u.compress=Sk.abstr.buildIteratorClass("itertools.compress",{constructor:function compress(t,e){this.data=t,this.selectors=e},iternext(){let t=this.data.tp$iternext(),e=this.selectors.tp$iternext();for(;void 0!==t&&void 0!==e;){if(Sk.misceval.isTrue(e))return t;t=this.data.tp$iternext(),e=this.selectors.tp$iternext()}},slots:{tp$doc:"compress(data, selectors) --\\x3e iterator over selected data\\n\\nReturn data elements corresponding to true selector elements.\\nForms a shorter iterator from selected data elements using the\\nselectors to choose the data elements.",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs("compress",["data","selectors"],t,e,[]),i=Sk.abstr.iter(i),r=Sk.abstr.iter(r),this===u.count.prototype)return new u.compress(i,r);{const t=new this.constructor;return u.compress.call(t,i,r),t}}}}),u.count=Sk.abstr.buildIteratorClass("itertools.count",{constructor:function count(t,e){this.start=t,this.step=e},iternext(){const t=this.start;return this.start=Sk.abstr.numberBinOp(this.start,this.step,"Add"),t},slots:{tp$doc:"count(start=0, step=1) --\\x3e count object\\n\\nReturn a count object whose .__next__() method returns consecutive values.\\nEquivalent to:\\n\\n def count(firstval=0, step=1):\\n x = firstval\\n while 1:\\n yield x\\n x += step\\n",tp$new(t,e){const[i,r]=Sk.abstr.copyKeywordsToNamedArgs("count",["start","step"],t,e,[new Sk.builtin.int_(0),new Sk.builtin.int_(1)]);if(!Sk.builtin.checkNumber(i)&&!Sk.builtin.checkComplex(i))throw new Sk.builtin.TypeError("a number is required");if(!Sk.builtin.checkNumber(r)&&!Sk.builtin.checkComplex(r))throw new Sk.builtin.TypeError("a number is required");if(this===u.count.prototype)return new u.count(i,r);{const t=new this.constructor;return u.count.call(t,i,r),t}},$r(){const t=Sk.misceval.objectRepr(this.start);let e=Sk.misceval.objectRepr(this.step);return e="1"===e?"":", "+e,new Sk.builtin.str(Sk.abstr.typeName(this)+"("+t+e+")")}}}),u.cycle=Sk.abstr.buildIteratorClass("itertools.cycle",{constructor:function cycle(t){this.iter=t,this.saved=[],this.consumed=!1,this.i=0,this.length},iternext(){let t;if(!this.consumed){if(t=this.iter.tp$iternext(),void 0!==t)return this.saved.push(t),t;if(this.consumed=!0,this.length=this.saved.length,!this.length)return}return t=this.saved[this.i],this.i=(this.i+1)%this.length,t},slots:{tp$doc:"cycle(iterable) --\\x3e cycle object\\n\\nReturn elements from the iterable until it is exhausted.\\nThen repeat the sequence indefinitely.",tp$new(t,e){Sk.abstr.checkOneArg("cycle",t,e);const i=Sk.abstr.iter(t[0]);if(this===u.cycle.prototype)return new u.cycle(i);{const t=new this.constructor;return u.cycle.call(t,i),t}}}}),u.dropwhile=Sk.abstr.buildIteratorClass("itertools.dropwhile",{constructor:function dropwhile(t,e){this.predicate=t,this.iter=e,this.passed},iternext(){let t=this.iter.tp$iternext();for(;void 0===this.passed&&void 0!==t;){const e=Sk.misceval.callsimArray(this.predicate,[t]);if(!Sk.misceval.isTrue(e))return this.passed=!0,t;t=this.iter.tp$iternext()}return t},slots:{tp$doc:"dropwhile(predicate, iterable) --\\x3e dropwhile object\\n\\nDrop items from the iterable while predicate(item) is true.\\nAfterwards, return every element until the iterable is exhausted.",tp$new(t,e){Sk.abstr.checkNoKwargs("dropwhile",e),Sk.abstr.checkArgsLen("dropwhile",t,2,2);const i=t[0],r=Sk.abstr.iter(t[1]);if(this===u.dropwhile.prototype)return new u.dropwhile(i,r);{const t=new this.constructor;return u.dropwhile.call(t,i,r),t}}}}),u.filterfalse=Sk.abstr.buildIteratorClass("itertools.filterfalse",{constructor:function filterfalse(t,e){this.predicate=t,this.iter=e},iternext(t){let e=this.iter.tp$iternext();if(void 0===e)return;let i=Sk.misceval.callsimArray(this.predicate,[e]);for(;Sk.misceval.isTrue(i);){if(e=this.iter.tp$iternext(),void 0===e)return;i=Sk.misceval.callsimArray(this.predicate,[e])}return e},slots:{tp$doc:"filterfalse(function or None, sequence) --\\x3e filterfalse object\\n\\nReturn those items of sequence for which function(item) is false.\\nIf function is None, return the items that are false.",tp$new(t,e){Sk.abstr.checkNoKwargs("filterfalse",e),Sk.abstr.checkArgsLen("filterfalse",t,2,2);const i=Sk.builtin.checkNone(t[0])?Sk.builtin.bool:t[0],r=Sk.abstr.iter(t[1]);if(this===u.filterfalse.prototype)return new u.filterfalse(i,r);{const t=new this.constructor;return u.filterfalse.call(t,i,r),t}}}}),u._grouper=Sk.abstr.buildIteratorClass("itertools._grouper",{constructor:function _grouper(t,e){this.groupby=t,this.tgtkey=t.tgtkey,this.id=t.id},iternext(t){const e=Sk.misceval.richCompareBool(this.groupby.currkey,this.tgtkey,"Eq");if(this.groupby.id===this.id&&e){let t=this.groupby.currval;return this.groupby.currval=this.groupby.iter.tp$iternext(),void 0!==this.groupby.currval&&(this.groupby.currkey=Sk.misceval.callsimArray(this.groupby.keyf,[this.groupby.currval])),t}}}),u.groupby=Sk.abstr.buildIteratorClass("itertools.groupby",{constructor:function groupby(t,e){this.iter=t,this.keyf=e,this.currval,this.currkey=this.tgtkey=new Sk.builtin.object,this.id},iternext(t){this.id=new Object;let e=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,"Eq");for(;e;){if(this.currval=this.iter.tp$iternext(),void 0===this.currval)return;this.currkey=Sk.misceval.callsimArray(this.keyf,[this.currval]),e=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,"Eq")}this.tgtkey=this.currkey;const i=new u._grouper(this);return new Sk.builtin.tuple([this.currkey,i])},slots:{tp$doc:"groupby(iterable, key=None) -> make an iterator that returns consecutive\\nkeys and groups from the iterable. If the key function is not specified or\\nis None, the element itself is used for grouping.\\n",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs("groupby",["iterable","key"],t,e,[Sk.builtin.none.none$]),i=Sk.abstr.iter(i),r=Sk.builtin.checkNone(r)?new Sk.builtin.func((t=>t)):r,this===u.groupby.prototype)return new u.groupby(i,r);{const t=new this.constructor;return u.groupby.call(t,i,r),t}}}}),u.islice=Sk.abstr.buildIteratorClass("itertools.islice",{constructor:function islice(t,e,i,r){this.iter=t,this.previt=e,this.stop=i,this.step=r,this.tp$iternext=()=>{if(this.tp$iternext=this.constructor.prototype.tp$iternext,!(this.previt>=this.stop)){for(let t=0;t=this.stop)){for(let t=this.previt+1;tNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError("Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.");if(!Sk.builtin.checkNone(r)&&!Sk.misceval.isIndex(r))throw new Sk.builtin.ValueError("Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.");if(r=Sk.builtin.checkNone(r)?0:Sk.misceval.asIndexSized(r),r<0||r>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError("Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.");if(!Sk.builtin.checkNone(n)&&!Sk.misceval.isIndex(n))throw new Sk.builtin.ValueError("Step for islice() must be a positive integer or None");if(n=Sk.builtin.checkNone(n)?1:Sk.misceval.asIndexSized(n),n<=0||n>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError("Step for islice() must be a positive integer or None.");if(this===u.islice.prototype)return new u.islice(i,r,s,n);{const t=new this.constructor;return u.islice.call(t,i,r,s,n),t}}}}),u.permutations=Sk.abstr.buildIteratorClass("itertools.permutations",{constructor:function permutations(t,e){this.pool=t,this.r=e;const i=t.length;this.indices=new Array(i).fill().map(((t,e)=>e)),this.cycles=new Array(e).fill().map(((t,e)=>i-e)),this.n=i,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(t){for(let e=this.r-1;e>=0;e--){if(this.cycles[e]--,0!=this.cycles[e]){const t=this.cycles[e];[this.indices[e],this.indices[this.n-t]]=[this.indices[this.n-t],this.indices[e]];const i=this.indices.map((t=>this.pool[t])).slice(0,this.r);return new Sk.builtin.tuple(i)}this.indices.push(this.indices.splice(e,1)[0]),this.cycles[e]=this.n-e}this.r=0},slots:{tp$doc:"permutations(iterable[, r]) --\\x3e permutations object\\n\\nReturn successive r-length permutations of elements in the iterable.\\n\\npermutations(range(3), 2) --\\x3e (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)",tp$new(t,e){let i,r;[i,r]=Sk.abstr.copyKeywordsToNamedArgs("permutations",["iterable","r"],t,e,[Sk.builtin.none.none$]);const s=Sk.misceval.arrayFromIterable(i);if(r=Sk.builtin.checkNone(r)?s.length:Sk.misceval.asIndexSized(r,Sk.builtin.OverFlowError),r<0)throw new Sk.builtin.ValueError("r must be non-negative");if(this===u.permutations.prototype)return new u.permutations(s,r);{const t=new this.constructor;return u.permutations.call(t,s,r),t}}}}),u.pairwise=Sk.abstr.buildIteratorClass("itertools.pairwise",{constructor:function pairwise(t){this.it=t,this.old=null},slots:{tp$new(t,i){e("pairwise",t,i);const r=t[0],s=Sk.abstr.iter(r);return new u.pairwise(s)},tp$doc:"Return an iterator of overlapping pairs taken from the input iterator.\\n\\n s -> (s0,s1), (s1,s2), (s2, s3), ..."},iternext(t){let e=this.old;const i=[null];null===e&&(i.push((()=>this.it.tp$iternext(t))),i.push((t=>{void 0!==t&&(e=t,this.old=t)})));const r=o(...i,(()=>{if(null!==e)return this.it.tp$iternext(t)}),(t=>{if(void 0!==t)return this.old=t,new s([e,t]);this.old=null}));return t?r:l(r)}}),u.product=Sk.abstr.buildIteratorClass("itertools.product",{constructor:function product(t){this.pools=t,this.n=t.length,this.indices=Array(t.length).fill(0),this.pool_sizes=t.map((t=>t.length)),this.tp$iternext=()=>{this.tp$iternext=this.constructor.prototype.tp$iternext;const t=this.indices.map(((t,e)=>this.pools[e][this.indices[e]]));if(!t.some((t=>void 0===t)))return new Sk.builtin.tuple(t);this.n=0}},iternext(t){let e=this.n-1;for(;e>=0&&e=this.pool_sizes[e]?(this.indices[e]=-1,e--):e++;if(this.n&&!this.indices.every((t=>-1===t))){const t=this.indices.map(((t,e)=>this.pools[e][this.indices[e]]));return new Sk.builtin.tuple(t)}this.n=0},slots:{tp$doc:"product(*iterables, repeat=1) --\\x3e product object\\n\\nCartesian product of input iterables. Equivalent to nested for-loops.\\n\\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\\nThe leftmost iterators are in the outermost for-loop, so the output tuples\\ncycle in a manner similar to an odometer (with the rightmost element changing\\non every iteration).\\n\\nTo compute the product of an iterable with itself, specify the number\\nof repetitions with the optional repeat keyword argument. For example,\\nproduct(A, repeat=4) means the same as product(A, A, A, A).\\n\\nproduct(\'ab\', range(3)) --\\x3e (\'a\',0) (\'a\',1) (\'a\',2) (\'b\',0) (\'b\',1) (\'b\',2)\\nproduct((0,1), (0,1), (0,1)) --\\x3e (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...",tp$new(t,e){let[i]=Sk.abstr.copyKeywordsToNamedArgs("product",["repeat"],[],e,[new Sk.builtin.int_(1)]);if(i=Sk.misceval.asIndexSized(i,Sk.builtin.OverFlowError),i<0)throw new Sk.builtin.ValueError("repeat argument cannot be negative");const r=[];for(let n=0;nthis.object)},iternext(t){return this.times-- >0?this.object:void 0},slots:{tp$doc:"repeat(object [,times]) -> create an iterator which returns the object\\nfor the specified number of times. If not specified, returns the object\\nendlessly.",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs("repeat",["object","times"],t,e,[null]),r=null!==r?Sk.misceval.asIndexSized(r,Sk.builtin.OverFlowError):void 0,this===u.repeat.prototype)return new u.repeat(i,r);{const t=new this.constructor;return u.repeat.call(t,i,r),t}},$r(){const t=Sk.misceval.objectRepr(this.object),e=void 0===this.times?"":", "+(this.times>=0?this.times:0);return new Sk.builtin.str(Sk.abstr.typeName(this)+"("+t+e+")")}},methods:{__lenght_hint__:{$meth(){if(void 0===this.times)throw new Sk.builtin.TypeError("len() of unsized object");return new Sk.builtin.int_(this.times)},$flags:{NoArgs:!0},$textsig:null}}}),u.starmap=Sk.abstr.buildIteratorClass("itertools.starmap",{constructor:function starmap(t,e){this.func=t,this.iter=e},iternext(t){const e=this.iter.tp$iternext();if(void 0===e)return;const i=Sk.misceval.arrayFromIterable(e);return Sk.misceval.callsimArray(this.func,i)},slots:{tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs("starmap",["func","iterable"],t,e,[]),r=Sk.abstr.iter(r),i=Sk.builtin.checkNone(i)?Sk.builtin.bool:i,this===u.starmap.prototype)return new u.starmap(i,r);{const t=new this.constructor;return u.starmap.call(t,i,r),t}}}}),u.takewhile=Sk.abstr.buildIteratorClass("itertools.takewhile",{constructor:function takewhile(t,e){this.predicate=t,this.iter=e},iternext(){const t=this.iter.tp$iternext();if(void 0!==t){const e=Sk.misceval.callsimArray(this.predicate,[t]);if(Sk.misceval.isTrue(e))return t;this.tp$iternext=()=>{}}},slots:{tp$doc:"takewhile(predicate, iterable) --\\x3e takewhile object\\n\\nReturn successive entries from an iterable as long as the \\npredicate evaluates to true for each entry.",tp$new(t,e){Sk.abstr.checkNoKwargs("takewhile",e),Sk.abstr.checkArgsLen("takewhile",t,2,2);const i=t[0],r=Sk.abstr.iter(t[1]);if(this===u.takewhile.prototype)return new u.takewhile(i,r);{const t=new this.constructor;return u.takewhile.call(t,i,r),t}}}}),u.tee=new Sk.builtin.func((function(){throw new Sk.builtin.NotImplementedError("tee is not yet implemented in Skulpt")})),u.zip_longest=Sk.abstr.buildIteratorClass("itertools.zip_longest",{constructor:function zip_longest(t,e){this.iters=t,this.fillvalue=e,this.active=this.iters.length},iternext(t){if(!this.active)return;let e;const i=[];for(let r=0;r="0"&&u<="9";)e+=u,next();if("."===u)for(e+=".";next()&&u>="0"&&u<="9";)e+=u;if("e"===u||"E"===u)for(e+=u,next(),"-"!==u&&"+"!==u||(e+=u,next());u>="0"&&u<="9";)e+=u,next();if(t=+e,isFinite(t))return t;error("Bad number")},string=function(){var t,e,n,i="";if(\'"\'===u)for(;next();){if(\'"\'===u)return next(),i;if("\\\\"===u)if(next(),"u"===u){for(n=0,e=0;e<4&&(t=parseInt(next(),16),isFinite(t));e+=1)n=16*n+t;i+=String.fromCharCode(n)}else{if("string"!=typeof s[u])break;i+=s[u]}else i+=u}error("Bad string")},white=function(){for(;u&&u<=" ";)next()};a=function(){switch(white(),u){case"{":return function(){var t,e={};if("{"===u){if(next("{"),white(),"}"===u)return next("}"),e;for(;u;){if(t=string(),white(),next(":"),Object.hasOwnProperty.call(e,t)&&error(\'Duplicate key "\'+t+\'"\'),e[t]=a(),white(),"}"===u)return next("}"),e;next(","),white()}}error("Bad object")}();case"[":return function(){var t=[];if("["===u){if(next("["),white(),"]"===u)return next("]"),t;for(;u;){if(t.push(a()),white(),"]"===u)return next("]"),t;next(","),white()}}error("Bad array")}();case\'"\':return string();case"-":return number();default:return u>="0"&&u<="9"?number():function(){switch(u){case"t":return next("t"),next("r"),next("u"),next("e"),!0;case"f":return next("f"),next("a"),next("l"),next("s"),next("e"),!1;case"n":return next("n"),next("u"),next("l"),next("l"),null}error("Unexpected \'"+u+"\'")}()}},e.exports=function(t,e){var n;return f=t,i=0,u=" ",n=a(),white(),u&&error("Syntax error"),"function"==typeof e?function walk(t,n){var i,u,f=t[n];if(f&&"object"==typeof f)for(i in f)Object.prototype.hasOwnProperty.call(f,i)&&(void 0!==(u=walk(f,i))?f[i]=u:delete f[i]);return e.call(t,n,f)}({"":n},""):n}},{}],4:[function(t,e,n){var i,u,f,a=/[\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,s={"\\b":"\\\\b","\\t":"\\\\t","\\n":"\\\\n","\\f":"\\\\f","\\r":"\\\\r",\'"\':\'\\\\"\',"\\\\":"\\\\\\\\"};function quote(t){return a.lastIndex=0,a.test(t)?\'"\'+t.replace(a,(function(t){var e=s[t];return"string"==typeof e?e:"\\\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)}))+\'"\':\'"\'+t+\'"\'}function str(t,e){var n,a,s,c,l,p=i,y=e[t];switch(y&&"object"==typeof y&&"function"==typeof y.toJSON&&(y=y.toJSON(t)),"function"==typeof f&&(y=f.call(e,t,y)),typeof y){case"string":return quote(y);case"number":return isFinite(y)?String(y):"null";case"boolean":case"null":return String(y);case"object":if(!y)return"null";if(i+=u,l=[],"[object Array]"===Object.prototype.toString.apply(y)){for(c=y.length,n=0;n1)for(var n=1;n="0"&&u<="9";)e+=u,next();if("."===u)for(e+=".";next()&&u>="0"&&u<="9";)e+=u;if("e"===u||"E"===u)for(e+=u,next(),"-"!==u&&"+"!==u||(e+=u,next());u>="0"&&u<="9";)e+=u,next();if(t=+e,isFinite(t))return t;error("Bad number")},string=function(){var t,e,n,i="";if(\'"\'===u)for(;next();){if(\'"\'===u)return next(),i;if("\\\\"===u)if(next(),"u"===u){for(n=0,e=0;e<4&&(t=parseInt(next(),16),isFinite(t));e+=1)n=16*n+t;i+=String.fromCharCode(n)}else{if("string"!=typeof a[u])break;i+=a[u]}else i+=u}error("Bad string")},white=function(){for(;u&&u<=" ";)next()};c=function(){switch(white(),u){case"{":return function(){var t,e={};if("{"===u){if(next("{"),white(),"}"===u)return next("}"),e;for(;u;){if(t=string(),white(),next(":"),Object.hasOwnProperty.call(e,t)&&error(\'Duplicate key "\'+t+\'"\'),e[t]=c(),white(),"}"===u)return next("}"),e;next(","),white()}}error("Bad object")}();case"[":return function(){var t=[];if("["===u){if(next("["),white(),"]"===u)return next("]"),t;for(;u;){if(t.push(c()),white(),"]"===u)return next("]"),t;next(","),white()}}error("Bad array")}();case\'"\':return string();case"-":return number();default:return u>="0"&&u<="9"?number():function(){switch(u){case"t":return next("t"),next("r"),next("u"),next("e"),!0;case"f":return next("f"),next("a"),next("l"),next("s"),next("e"),!1;case"n":return next("n"),next("u"),next("l"),next("l"),null}error("Unexpected \'"+u+"\'")}()}},e.exports=function(t,e){var n;return f=t,i=0,u=" ",n=c(),white(),u&&error("Syntax error"),"function"==typeof e?function walk(t,n){var i,u,f=t[n];if(f&&"object"==typeof f)for(i in f)Object.prototype.hasOwnProperty.call(f,i)&&(void 0!==(u=walk(f,i))?f[i]=u:delete f[i]);return e.call(t,n,f)}({"":n},""):n}},{}],4:[function(t,e,n){var i,u,f,c=/[\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,a={"\\b":"\\\\b","\\t":"\\\\t","\\n":"\\\\n","\\f":"\\\\f","\\r":"\\\\r",\'"\':\'\\\\"\',"\\\\":"\\\\\\\\"};function quote(t){return c.lastIndex=0,c.test(t)?\'"\'+t.replace(c,(function(t){var e=a[t];return"string"==typeof e?e:"\\\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)}))+\'"\':\'"\'+t+\'"\'}function str(t,e){var n,c,a,s,l,p=i,y=e[t];switch(y&&"object"==typeof y&&"function"==typeof y.toJSON&&(y=y.toJSON(t)),"function"==typeof f&&(y=f.call(e,t,y)),typeof y){case"string":return quote(y);case"number":return isFinite(y)?String(y):"null";case"boolean":case"null":return String(y);case"object":if(!y)return"null";if(i+=u,l=[],"[object Array]"===Object.prototype.toString.apply(y)){for(s=y.length,n=0;n1)for(var n=1;n{throw new a(t+" is not yet implemented in skulpt")}))}const j=E.JSONDecodeError=N("json.JSONDecodeError",{base:l,constructor:function JSONDecodeError(t,e,n){const r=e.slice(0,n),o=r.split("\\n").length,s=n-r.lastIndexOf("\\n"),i=`${t}: line ${o} column ${s} (char ${n})`;l.call(this,i),this.$msg=t,this.$doc=e,this.$pos=n,this.$lineno=o,this.$colno=s},getsets:Object.fromEntries(["msg","doc","pos","lineno","colno"].map((t=>[t,{$get(){return m(this["$"+t])}}])))});class JSONEncoder{constructor(t,e,n,r,o,s,i,l){this.skipkeys=t,this.ensure_ascii=e,this.check_circular=n,this.allow_nan=r,this.indent=o,this.separators=s,this.sort_keys=l,this.item_separator=", ",this.key_separator=": ",null!==this.separators?[this.item_separator,this.key_separator]=this.separators:null!==this.indent&&(this.item_separator=","),null!==i&&(this.default=i),this.encoder=this.make_encoder()}default(t){throw new i(`Object of type ${b(t)} is not JSON serializable`)}encode(e){return new t(this.encoder(e))}make_encoder(){let t,e;t=this.check_circular?new Set:null,e=(this.ensure_ascii,JSON.stringify);return function _make_iterencode(t,e,n,r,s,a,u,h,f){null!==r&&"string"!=typeof r&&(r=" ".repeat(r));let d,p,m,w;null!==t?(d=e=>{if(t.has(e))throw new l("Circular reference detected");t.add(e)},p=e=>t.delete(e)):(d=t=>{},p=t=>{});null!==r?(m=(t,e)=>{e+=1;const n="\\n"+r.repeat(e);return[t+=n,e,u+n]},w=(t,e,n)=>(n-=1,t+="\\n"+r.repeat(n)+e)):(m=(t,e)=>[t,e,u],w=(t,e,n)=>t+e);const _unhandled=(t,n)=>{d(t);const r=_iterencode(e(t),n);return p(t),r},_iterencode_list=(t,e)=>{if(!t.length)return"[]";let n,r;d(t),[n,e,r]=m("[",e);let o=!0;for(let s of t)o?o=!1:n+=r,n+=_iterencode(s,e);return p(t),w(n,"]",e)},_iterencode_dict=(t,e)=>{if(!t.sq$length())return"{}";let r,l;d(t),[r,e,l]=m("{",e);let u=!0;if(h){const e=$(t.tp$getattr(v)),n=c(e);t=$(o,[n])}for(let[o,c]of t.$items()){const t=o.valueOf(),h=typeof t;if("string"===h)o=t;else if("number"===h)o=s(o);else if("boolean"===h||null===t)o=String(t);else{if(!JSBI.__isBigInt(t)){if(f)continue;throw new i("keys must be str, int, float, bool or None, not "+b(o))}o=t.toString()}u?u=!1:r+=l,r+=n(o),r+=a,r+=_iterencode(c,e)}return p(t),w(r,"}",e)},_iterencode=(t,e=0)=>String(g(t,{stringHook:t=>n(t),numberHook:(t,e)=>s(e),bigintHook:t=>t.toString(),dictHook:t=>_iterencode_dict(t,e),arrayHook:t=>_iterencode_list(t,e),setHook:t=>_unhandled(t,e),funcHook:(t,n)=>_unhandled(n,e),objecthook:(t,n)=>_unhandled(n,e),unhandledHook:t=>_unhandled(t,e)}));return _iterencode}(t,this.default,e,this.indent,((t,e=this.allow_nan)=>{const n=t.valueOf();let r;if(Number.isFinite(n))return J(t);if(r=n.toString(),!e)throw new l("Out of range float values are not JSON compliant: "+J(t));return r}),this.key_separator,this.item_separator,this.sort_keys,this.skipkeys)}}const v=new t("items");const x=[!1,!0,!0,!0,null,null,null,!1],D=new JSONEncoder(...x),F=/(-?(?:0|[1-9]\\d*))(\\.\\d+)?([eE][-+]?\\d+)?/;const I=/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/m;function scanstring(e,n){const r=e.substring(n-1).match(I);if(null===r)throw new j("Unterminated string starting at",e,n-1);try{return[new t(JSON.parse(r[0])),n+r[0].length-1]}catch(o){let t=o.message.match(/(?:column|position) (\\d+)/);t=t&&Number(t[1]);n=n+(t||0)-(void 0===o.columnNumber?1:2);const r=o.message.replace("JSON.parse: ","").replace(/ at line \\d+ column \\d+ of the JSON data/,"").replace(/ in JSON at position \\d+$/,"");throw new j(r,e,n)}}const A=/[ \\t\\n\\r]*/;function JSONArray(t,e,r){const o=[];let s=t[e];const adjust_white_space=()=>{if(" "===s||"\\t"===s||"\\n"===s||"\\r"===s){const n=t.substring(e).match(A);e+=n[0].length,s=t[e]}};if(adjust_white_space(),"]"===s)return[new n([]),e+1];for(;;){let n;if([n,e]=r(t,e),void 0===n)throw new j("Expecting value",t,e);if(o.push(n),s=t[e],adjust_white_space(),e++,"]"===s)break;if(","!==s)throw new j("Expecting \',\' delimiter",t,e-1);s=t[e],adjust_white_space()}return[new n(o),e]}function JSONObject(t,e,s,i,l,a={}){let c=[],u=t[e];const memo_get=function(t){const e=t.toString();return e in a?a[e]:(a[e]=t,t)},adjust_white_space=()=>{if(" "===u||"\\t"===u||"\\n"===u||"\\r"===u){const n=t.substring(e).match(A);e+=n[0].length,u=t[e]}};if(\'"\'!==u){if(adjust_white_space(),"}"===u){if(null!==l){return[l(new n([])),e+1]}return c=new o([]),null!==i&&(c=i(c)),[c,e+1]}if(\'"\'!==u)throw new j("Expecting property name enclosed in double quotes",t,e)}let h,f;for(e+=1;;){if([h,e]=scanstring(t,e),h=memo_get(h),":"!==(u=t[e])&&(adjust_white_space(),":"!==t[e]))throw new j("Expecting \':\' delimiter",t,e);if(u=t[++e],adjust_white_space(),[f,e]=s(t,e),void 0===f)throw new j("Expecting value",t,e);if(u=t[e],c.push([h,f]),adjust_white_space(),e++,"}"===u)break;if(","!==u)throw new j("Expecting \',\' delimiter",t,e-1);if(u=t[e],adjust_white_space(),e++,\'"\'!==u)throw new j("Expecting property name enclosed in double quotes",t,e-1)}if(null!==l){return[l(new n(c.map((t=>new r(t))))),e]}return c=new o(c.flat()),null!==i&&(c=i(c)),[c,e]}const H={NaN:new e(NaN),Infinity:new e(1/0),"-Infinity":new e(-1/0)};class JSONDecoder{constructor(t,e,n,r,o){this.object_hook=t,this.parse_float=e||w,this.parse_int=n||_,this.parse_constant=r||(t=>H[t]),this.object_pairs_hook=o,this.parse_object=JSONObject,this.parse_array=JSONArray,this.parse_string=scanstring,this.memo={},this.scan_once=function make_scanner(t){const{parse_object:e,parse_array:n,parse_string:r,parse_float:o,parse_int:s,parse_constant:i,object_hook:l,object_pairs_hook:a,memo:c}=t,_scan_once=(t,d)=>{const p=t[d];if(void 0===p)return[p,d];if(\'"\'===p)return r(t,d+1);if("{"===p)return e(t,d+1,_scan_once,l,a,c);if("["===p)return n(t,d+1,_scan_once);if("n"===p&&"null"===t.substring(d,d+4))return[u,d+4];if("t"===p&&"true"===t.substring(d,d+4))return[h,d+4];if("f"===p&&"false"===t.substring(d,d+5))return[f,d+5];const m=t.substring(d).match(F);if(null!==m){let t;const[e,n,r,i]=m;return t=r||i?o(n+(r||"")+(i||"")):s(n),[t,d+e.length]}return"N"===p&&"NaN"===t.substring(d,d+3)?[i("NaN"),d+3]:"I"==p&&"Infinity"===t.substring(d,d+8)?[i("Infinity"),d+8]:"-"==p&&"-Infinity"===t.substring(d,d+9)?[i("-Infinity"),d+9]:[void 0,d]};return function scan_once(t,e){try{return _scan_once(t,e)}finally{for(const t in c)delete c[t]}}}(this)}white(t,e){const n=(0===e?t:t.substring(e)).match(A);return null!==n&&(e+=n[0].length),e}decode(t){t=t.toString();let[e,n]=this.scan_once(t,this.white(t,0));if(void 0===e)throw new j("Expecting value",t,n);if(n=this.white(t,n),n!==t.length)throw new j("Extra data",t,n);return e}}const T=Array(5).fill(null),C=new JSONDecoder(...T);function convertToNullOrFunc(t){return null===t||t===u?null:e=>$(t,[m(e)])}return k("json",E,{loads:{$meth(t,e){O("dumps",t);let n=t[0];if(d(n));else{if(!p(n))throw new i(`the JSON object must be str or bytes, not ${b(n)}`);n=(new TextDecoder).decode(n.valueOf())}const r=S("dumps",["object_hook","parse_float","parse_int","parse_constant","object_pairs_hook"],[],e,T).map(convertToNullOrFunc);return r.every((t=>null===t))?C.decode(n):new JSONDecoder(...r).decode(n)},$doc:"Deserialize ``s`` (a ``str`` or ``bytes`` instance containing a JSON document) to a Python object.",$flags:{FastCall:!0}},dumps:{$meth(t,e){O("dumps",t);const n=t[0];let[r,o,s,l,a,c,u,h]=S("loads",["skipkeys","ensure_ascii","check_circular","allow_nan","indent","separators","default","sort_keys"],[],e,x);if(r=y(r),o=y(o),s=y(s),l=y(l),a=g(a),c=g(c),u=convertToNullOrFunc(u),h=y(h),!r&&o&&s&&l&&null===a&&null===c&&null===u&&!h)return D.encode(n);if(null===c);else if(!Array.isArray(c)||2!==c.length||"string"!=typeof c[0]||"string"!=typeof c[1])throw new i("separators shuld be a list or tuple of strings of length 2");return new JSONEncoder(r,o,s,l,a,c,u,h).encode(n)},$doc:"Serialize ``obj`` to a JSON formatted ``str``",$flags:{FastCall:!0}}}),E}',"src/lib/keyword.js":'function $builtinmodule(){const{ffi:{remapToPy:t},builtin:{frozenset:e,str:s}}=Sk,i=new s("keyword"),n=t(["iskeyword","issoftkeyword","kwlist","softkwlist"]),o=t(["False","None","True","and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal","not","or","pass","raise","return","try","while","with","yield"]),a=t(["_","case","match"]);return{__name__:i,__all__:n,kwlist:o,softkwlist:a,iskeyword:new e(o).tp$getattr(s.$contains),issoftkeyword:new e(a).tp$getattr(s.$contains)}}',"src/lib/math.js":'const $builtinmodule=function(e){const{builtin:{str:t,int_:n,float_:i,TypeError:r,pyCheckType:u,checkNumber:l},abstr:{lookupSpecial:o},misceval:{callsimOrSuspendArray:a}}=Sk,s={pi:new Sk.builtin.float_(Math.PI),e:new Sk.builtin.float_(Math.E),tau:new Sk.builtin.float_(2*Math.PI),nan:new Sk.builtin.float_(NaN),inf:new Sk.builtin.float_(1/0)},b=new t("__ceil__");const get_sign=function(e){return e=e?e<0?-1:1:1/e<0?-1:1};const c=18;function factorial(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));let t=Sk.builtin.asnum$(e);if((e=Math.floor(t))!=t)throw new Sk.builtin.ValueError("factorial() only accepts integral values");if(e<0)throw new Sk.builtin.ValueError("factorial() not defined for negative numbers");let n=1;for(let i=2;i<=e&&i<=c;i++)n*=i;if(e<=c)return new Sk.builtin.int_(n);n=JSBI.BigInt(n);for(let i=c+1;i<=e;i++)n=JSBI.multiply(n,JSBI.BigInt(i));return new Sk.builtin.int_(n)}const m=new t("__floor__");function _gcd_internal(e,t){let n;return"number"==typeof e&&"number"==typeof t?(n=function _gcd(e,t){return 0==t?e:_gcd(t,e%t)}(e=Math.abs(e),t=Math.abs(t)),n=n<0?-n:n):(n=function _biggcd(e,t){return JSBI.equal(t,JSBI.__ZERO)?e:_biggcd(t,JSBI.remainder(e,t))}(e=JSBI.BigInt(e),t=JSBI.BigInt(t)),JSBI.lessThan(n,JSBI.__ZERO)&&(n=JSBI.multiply(n,JSBI.BigInt(-1)))),n}return Sk.abstr.setUpModuleMethods("math",s,{acos:{$meth:function acos(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.acos(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc cosine (measured in radians) of x."},acosh:{$meth:function acosh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=(e=Sk.builtin.asnum$(e))+Math.sqrt(e*e-1);return new Sk.builtin.float_(Math.log(t))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic cosine of x."},asin:{$meth:function asin(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.asin(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc sine (measured in radians) of x."},asinh:{$meth:function asinh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=(e=Sk.builtin.asnum$(e))+Math.sqrt(e*e+1);return new Sk.builtin.float_(Math.log(t))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic sine of x."},atan:{$meth:function atan(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.atan(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the arc tangent (measured in radians) of x."},atan2:{$meth:function atan2(e,t){return Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(t)),new Sk.builtin.float_(Math.atan2(Sk.builtin.asnum$(e),Sk.builtin.asnum$(t)))},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, y, x, /)",$doc:"Return the arc tangent (measured in radians) of y/x.\\n\\nUnlike atan(y/x), the signs of both x and y are considered."},atanh:{$meth:function atanh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=(1+(e=Sk.builtin.asnum$(e)))/(1-e);return new Sk.builtin.float_(Math.log(t)/2)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the inverse hyperbolic tangent of x."},ceil:{$meth:function ceil(e){let t;if(e.ob$type!==i){const n=o(e,b);if(void 0!==n)return a(n);u("","real number",l(e)),t=Sk.builtin.asnum$(e)}else t=e.v;return new n(Math.ceil(t))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the ceiling of x as an Integral.\\n\\nThis is the smallest integer >= x."},comb:{$meth:function comb(e,t){let n=Sk.misceval.asIndexOrThrow(e),i=Sk.misceval.asIndexOrThrow(t);if(n<0)throw new Sk.builtin.ValueError("n must be an non-negative integer");if(i<0)throw new Sk.builtin.ValueError("k must be a non-negative integer");if(i>e)return new Sk.builtin.int_(0);e=new Sk.builtin.int_(n),t=new Sk.builtin.int_(i);let r=Sk.ffi.remapToJs(e.nb$subtract(t));if(rNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError("min(n - k, k) must not exceed "+Number.MAX_SAFE_INTEGER);const u=new Sk.builtin.int_(1);let l=e;for(let o=1;o n.\\n\\nIf k is not specified or is None, then k defaults to n\\nand the function returns n!.\\n\\nRaises TypeError if either of the arguments are not integers.\\nRaises ValueError if either of the arguments are negative."},copysign:{$meth:function copysign(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(t));const n=Sk.builtin.asnum$(t),i=Sk.builtin.asnum$(e),r=get_sign(i)*get_sign(n);return new Sk.builtin.float_(i*r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return a float with the magnitude (absolute value) of x but the sign of y.\\n\\nOn platforms that support signed zeros, copysign(1.0, -0.0)\\nreturns -1.0.\\n"},cos:{$meth:function cos(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.cos(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the cosine of x (measured in radians)."},cosh:{$meth:function cosh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e);const t=Math.E,n=Math.pow(t,e),i=(n+1/n)/2;return new Sk.builtin.float_(i)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic cosine of x."},degrees:{$meth:function degrees(e){Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e));const t=180/Math.PI*Sk.builtin.asnum$(e);return new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Convert angle x from radians to degrees."},dist:{$meth:function dist(e){throw new Sk.builtin.NotImplementedError("math.dist() is not yet implemented in Skulpt")},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, p, q, /)",$doc:"Return the Euclidean distance between 2 points in any dimension."},erf:{$meth:function erf(e){throw new Sk.builtin.NotImplementedError("math.erf() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Error function at x."},erfc:{$meth:function erfc(e){throw new Sk.builtin.NotImplementedError("math.erfc() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Complementary error function at x."},exp:{$meth:function exp(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));let t=e.v;if("number"!=typeof t&&(t=e.nb$float().v),t==1/0||t==-1/0||isNaN(t))return new Sk.builtin.float_(Math.exp(t));const n=Math.exp(t);if(!isFinite(n))throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(n)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return e raised to the power of x."},expm1:{$meth:function expm1(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(Math.abs(t)<.7){const e=Math.exp(t);if(1==e)return new Sk.builtin.float_(t);{const n=(e-1)*t/Math.log(e);return new Sk.builtin.float_(n)}}{const e=Math.exp(t)-1;return new Sk.builtin.float_(e)}},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return exp(x)-1.\\n\\nThis function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x."},fabs:{$meth:function fabs(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));let t=e.v;return JSBI.__isBigInt(t)&&(t=e.nb$float().v),t=Math.abs(t),new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the absolute value of the float x."},factorial:{$meth:factorial,$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Find x!.\\n\\nRaise a ValueError if x is negative or non-integral."},floor:{$meth:function floor(e){let t;if(e.ob$type===i)t=e.v;else{const n=o(e,m);if(void 0!==n)return a(n);u("x","number",l(e)),t=Sk.builtin.asnum$(e)}return new n(Math.floor(t))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the floor of x as an Integral.\\n\\nThis is the largest integer <= x."},fmod:{$meth:function fmod(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if("number"!=typeof n&&(n=e.nb$float().v),"number"!=typeof i&&(i=t.nb$float().v),(i==1/0||i==-1/0)&&isFinite(n))return new Sk.builtin.float_(n);const r=n%i;if(isNaN(r)&&!isNaN(n)&&!isNaN(i))throw new Sk.builtin.ValueError("math domain error");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return fmod(x, y), according to platform C.\\n\\nx % y may differ."},frexp:{$meth:function frexp(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e),n=[t,0];if(0!==t&&Number.isFinite(t)){const e=Math.abs(t);let i=Math.max(-1023,Math.floor(Math.log2(e))+1),r=e*Math.pow(2,-i);for(;r<.5;)r*=2,i--;for(;r>=1;)r*=.5,i++;t<0&&(r=-r),n[0]=r,n[1]=i}return n[0]=new Sk.builtin.float_(n[0]),n[1]=new Sk.builtin.int_(n[1]),new Sk.builtin.tuple(n)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the mantissa and exponent of x, as pair (m, e).\\n\\nm is a float and e is an int, such that x = m * 2.**e.\\nIf x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0."},fsum:{$meth:function fsum(e){if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError("\'"+Sk.abstr.typeName(e)+"\' object is not iterable");let t,n,i,r=[];for(let l=(e=Sk.abstr.iter(e)).tp$iternext();void 0!==l;l=e.tp$iternext()){Sk.builtin.pyCheckType("","real number",Sk.builtin.checkNumber(l)),t=0;let e=l.v;"number"!=typeof e&&(e=l.nb$float().v),l=e;for(let u=0,o=r.length;u0;){n--;let t=a;a=JSBI.signedRightShift(u,JSBI.BigInt(n));const r=JSBI.subtract(JSBI.subtract(a,t),i),s=JSBI.leftShift(o,r),b=JSBI.add(JSBI.subtract(JSBI.subtract(l,t),a),i),c=JSBI.signedRightShift(e,b);o=JSBI.add(s,JSBI.divide(c,o))}let s=o;return JSBI.greaterThan(JSBI.multiply(s,s),e)&&(s=JSBI.subtract(s,i)),JSBI.lessThanOrEqual(s,JSBI.BigInt(Number.MAX_SAFE_INTEGER))&&(s=Number(s)),new Sk.builtin.int_(s)}(t)},$flags:{OneArg:!0},$textsig:"($module, n, /)",$doc:"Return the integer part of the square root of the input."},lcm:{$meth:function lcm(...e){function abs(e){return"number"==typeof e?new Sk.builtin.int_(Math.abs(e)):JSBI.lessThan(e,JSBI.__ZERO)?new Sk.builtin.int_(JSBI.unaryMinus(e)):new Sk.builtin.int_(e)}const t=e.length;if(0===t)return new Sk.builtin.int_(1);let n;for(n=0;nNumber.MAX_SAFE_INTEGER?JSBI.BigInt(r):e}else r=JSBI.BigInt(r);"number"!=typeof r&&(i=JSBI.BigInt(i),r=JSBI.multiply(JSBI.divide(r,_gcd_internal(r,i)),i))}return abs(r)},$flags:{MinArgs:0},$textsig:"($module, *integers, /)",$doc:"Return the least common multiple of the specified integer arguments. If all arguments are nonzero, then the returned value is the smallest positive integer that is a multiple of all arguments. If any of the arguments is zero, then the returned value is 0. lcm() without arguments returns 1."},ldexp:{$meth:function ldexp(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("i","integer",Sk.builtin.checkInt(t));let n=e.v;"number"!=typeof n&&(n=e.nb$float().v);const i=Sk.builtin.asnum$(t);if(n==1/0||n==-1/0||0==n||isNaN(n))return new Sk.builtin.float_(n);const r=n*Math.pow(2,i);if(!isFinite(r))throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, i, /)",$doc:"Return x * (2**i).\\n\\nThis is essentially the inverse of frexp()."},lgamma:{$meth:function lgamma(e){throw new Sk.builtin.NotImplementedError("math.lgamma() is not yet implemented in Skulpt")},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Natural logarithm of absolute value of Gamma function at x."},log:{$meth:function log(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));let n,i,r=Sk.builtin.asnum$(e);if(r<=0)throw new Sk.builtin.ValueError("math domain error");if(void 0===t?n=Math.E:(Sk.builtin.pyCheckType("base","number",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(t)),n<=0)throw new Sk.builtin.ValueError("math domain error");if(Sk.builtin.checkFloat(e)||re)return new Sk.builtin.int_(0);if(0===t)return new Sk.builtin.int_(1);if(t>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError("k must not exceed "+Number.MAX_SAFE_INTEGER);const n=new Sk.builtin.int_(1);let i=e=new Sk.builtin.int_(e);for(let r=1;r n.\\n\\nIf k is not specified or is None, then k defaults to n\\nand the function returns n!.\\n\\nRaises TypeError if either of the arguments are not integers.\\nRaises ValueError if either of the arguments are negative.\'"},prod:{$meth:function prod(e,t){Sk.abstr.checkArgsLen("prod",e,1,1),e=Sk.abstr.copyKeywordsToNamedArgs("prod",[null,"start"],e,t,[new Sk.builtin.int_(1)]);const n=Sk.abstr.iter(e[0]);let i,r=e[1];return i=r.constructor===Sk.builtin.int_?function fastProdInt(){return Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.int_)return e.constructor===Sk.builtin.float_?(r=r.nb$float().nb$multiply(e),new Sk.misceval.Break("float")):(r=Sk.abstr.numberBinOp(r,e,"Mult"),new Sk.misceval.Break("slow"));r=r.nb$multiply(e)}))}():r.constructor===Sk.builtin.float_?"float":"slow",Sk.misceval.chain(i,(e=>"float"===e?function fastProdFloat(){return Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.float_&&e.constructor!==Sk.builtin.int_)return r=Sk.abstr.numberBinOp(r,e,"Mult"),new Sk.misceval.Break("slow");r=r.nb$multiply(e)}))}():e),(e=>{if("slow"===e)return function slowProd(){return Sk.misceval.iterFor(n,(e=>{r=Sk.abstr.numberBinOp(r,e,"Mult")}))}()}),(()=>r))},$flags:{FastCall:!0},$textsig:"($module, iterable, /, *, start=1)",$doc:"Calculate the product of all the elements in the input iterable. The default start value for the product is 1.\\n\\nWhen the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types."},pow:{$meth:function pow(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if("number"!=typeof n&&(n=e.nb$float().v),"number"!=typeof i&&(i=t.nb$float().v),0==n&&i<0)throw new Sk.builtin.ValueError("math domain error");if(1==n)return new Sk.builtin.float_(1);if(Number.isFinite(n)&&Number.isFinite(i)&&n<0&&!Number.isInteger(i))throw new Sk.builtin.ValueError("math domain error");if(-1==n&&(i==-1/0||i==1/0))return new Sk.builtin.float_(1);const r=Math.pow(n,i);if(!Number.isFinite(n)||!Number.isFinite(i))return new Sk.builtin.float_(r);if(r==1/0||r==-1/0)throw new Sk.builtin.OverflowError("math range error");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return x**y (x to the power of y)."},radians:{$meth:function radians(e){Sk.builtin.pyCheckType("deg","number",Sk.builtin.checkNumber(e));const t=Math.PI/180*Sk.builtin.asnum$(e);return new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Convert angle x from degrees to radians."},remainder:{$meth:function remainder(e,t){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType("y","number",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if("number"!=typeof n&&(n=e.nb$float().v),"number"!=typeof i&&(i=t.nb$float().v),isFinite(n)&&isFinite(i)){let e,t,r,u,l;if(0==i)throw new Sk.builtin.ValueError("math domain error");if(e=Math.abs(n),t=Math.abs(i),u=e%t,r=t-u,ur)l=-r;else{if(u!=r)throw new Sk.builtin.AssertionError;l=u-.5*(e-u)%t*2}return new Sk.builtin.float_(get_sign(n)*l)}if(isNaN(n))return e;if(isNaN(i))return t;if(n==1/0||n==-1/0)throw new Sk.builtin.ValueError("math domain error");if(i!=1/0&&i!=-1/0)throw new Sk.builtin.AssertionError;return new Sk.builtin.float_(n)},$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Difference between x and the closest integer multiple of y.\\n\\nReturn x - n*y where n*y is the closest integer multiple of y.\\nIn the case where x is exactly halfway between two multiples of\\ny, the nearest even value of n is used. The result is always exact."},sin:{$meth:function sin(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.sin(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the sine of x (measured in radians)."},sinh:{$meth:function sinh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e);const t=Math.E,n=Math.pow(t,e),i=(n-1/n)/2;return new Sk.builtin.float_(i)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic sine of x."},sqrt:{$meth:function sqrt(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(t<0)throw new Sk.builtin.ValueError("math domain error");return new Sk.builtin.float_(Math.sqrt(t))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the square root of x."},tan:{$meth:function tan(e){return Sk.builtin.pyCheckType("rad","number",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.tan(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the tangent of x (measured in radians)."},tanh:{$meth:function tanh(e){Sk.builtin.pyCheckType("x","number",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(0===t)return new Sk.builtin.float_(t);const n=Math.E,i=Math.pow(n,t),r=1/i,u=(i-r)/2/((i+r)/2);return new Sk.builtin.float_(u)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the hyperbolic tangent of x."},trunc:{$meth:function trunc(e){if(e.ob$type===i)return e.nb$int();const n=o(e,t.$trunc);if(void 0===n)throw new r(`type ${e.tp$name} doesn\'t define __trunc__ method`);return a(n)},$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Truncates the Real x to the nearest Integral toward 0.\\n\\nUses the __trunc__ magic method."}}),s};',"src/lib/operator.js":'function $builtinmodule(e){const{builtin:{str:t,tuple:a,list:r,int_:o,bool:n,TypeError:s,ValueError:i,none:{none$:m},NotImplemented:{NotImplemented$:d},abs:l,len:h,checkString:u,checkInt:c},abstr:{buildNativeClass:M,checkNoKwargs:b,checkArgsLen:g,checkOneArg:f,numberUnaryOp:p,numberBinOp:A,numberInplaceBinOp:k,objectGetItem:$,objectDelItem:_,objectSetItem:w,sequenceConcat:v,sequenceContains:x,sequenceGetCountOf:j,sequenceGetIndexOf:O,sequenceInPlaceConcat:I,typeName:S,lookupSpecial:y,gattr:q,setUpModuleMethods:R},misceval:{richCompareBool:B,asIndexOrThrow:N,chain:E,callsimArray:T,callsimOrSuspendArray:C,objectRepr:D},generic:{getAttr:G}}=Sk,L=["abs","add","and_","concat","contains","delitem","eq","floordiv","ge","getitem","gt","iadd","iand","iconcat","ifloordiv","ilshift","imatmul","imod","imul","index","inv","invert","ior","ipow","irshift","isub","itruediv","ixor","le","lshift","lt","matmul","mod","mul","ne","neg","not_","or_","pos","pow","rshift","setitem","sub","truediv","xor"],F=["attrgetter","countOf","indexOf","is_","is_not","itemgetter","length_hint","methodcaller","truth",...L].sort(),P={__name__:new t("operator"),__doc__:new t("Operator interface.\\n\\nThis module exports a set of functions implemented in javascript corresponding\\nto the intrinsic operators of Python. For example, operator.add(x, y)\\nis equivalent to the expression x+y. The function names are those\\nused for special methods; variants without leading and trailing\\n\'__\' are also provided for convenience."),__all__:new r(F.map((e=>new t(e))))};P.itemgetter=M("operator.itemgetter",{constructor:function itemgetter(e){this.items=e,this.oneitem=1===e.length,this.item=e[0],this.in$repr=!1},slots:{tp$getattr:G,tp$new:(e,t)=>(b("itemgetter",t),g("itemgetter",e,1),new P.itemgetter(e)),tp$call(e,t){f("itemgetter",e,t);const r=e[0];return this.oneitem?$(r,this.item,!0):new a(this.items.map((e=>$(r,e))))},tp$doc:"Return a callable object that fetches the given item(s) from its operand.\\n After f = itemgetter(2), the call f(r) returns r[2].\\n After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])",$r(){if(this.in$repr)return new t(this.tp$name+"(...)");this.in$repr=!0;const e=this.tp$name+"("+this.items.map((e=>D(e))).join(", ")+")";return this.in$repr=!1,e}}}),P.attrgetter=M("operator.attrgetter",{constructor:function attrgetter(e){this.attrs=e,this.oneattr=1===e.length,this.attr=e[0],this.in$repr=!1},slots:{tp$getattr:G,tp$new(e,a){b("attrgetter",a),g("attrgetter",e,1);const r=[];for(let o=0;onew t(e)))):r.push([a])}return new P.attrgetter(r)},tp$call(e,t){f("attrgetter",e,t);const r=e[0];if(this.oneattr)return this.attr.reduce(((e,t)=>q(e,t)),r);const o=this.attrs.map((e=>e.reduce(((e,t)=>q(e,t)),r)));return new a(o)},tp$doc:"attrgetter(attr, ...) --\\x3e attrgetter object\\n\\nReturn a callable object that fetches the given attribute(s) from its operand.\\nAfter f = attrgetter(\'name\'), the call f(r) returns r.name.\\nAfter g = attrgetter(\'name\', \'date\'), the call g(r) returns (r.name, r.date).\\nAfter h = attrgetter(\'name.first\', \'name.last\'), the call h(r) returns\\n(r.name.first, r.name.last).",$r(){if(this.in$repr)return new t(this.tp$name+"(...)");this.in$repr=!0;const e=this.tp$name+"("+this.items.map((e=>D(e))).join(", ")+")";return this.in$repr=!1,e}}}),P.methodcaller=M("operator.methodcaller",{constructor:function methodcaller(e,t,a){this.$name=e,this.args=t,this.kwargs=a||[],this.in$repr=!1},slots:{tp$getattr:G,tp$new(e,t){g("methodcaller",e,1);const a=e[0];if(!u(a))throw new s("method name must be a string");return new P.methodcaller(a,e.slice(1),t)},tp$call(e,t){f("methodcaller",e,t);const a=e[0];return E(q(a,this.$name,!0),(e=>C(e,this.args,this.kwargs)))},tp$doc:"methodcaller(name, ...) --\\x3e methodcaller object\\n\\nReturn a callable object that calls the given method on its operand.\\nAfter f = methodcaller(\'name\'), the call f(r) returns r.name().\\nAfter g = methodcaller(\'name\', \'date\', foo=1), the call g(r) returns\\nr.name(\'date\', foo=1).",$r(){if(this.in$repr)return new t(this.tp$name+"(...)");this.in$repr=!0;let e=[D(this.$name)];e.push(...this.args.map((e=>D(e))));for(let t=0;tn(B(e,t,"Lt"))),sameAs("a < b")),le:makeModuleMethod(((e,t)=>n(B(e,t,"LtE"))),sameAs("a <= b")),eq:makeModuleMethod(((e,t)=>n(B(e,t,"Eq"))),sameAs("a == b")),ne:makeModuleMethod(((e,t)=>n(B(e,t,"NotEq"))),sameAs("a != b")),ge:makeModuleMethod(((e,t)=>n(B(e,t,"GtE"))),sameAs("a >= b")),gt:makeModuleMethod(((e,t)=>n(B(e,t,"Gt"))),sameAs("a > b")),not_:makeModuleMethod((e=>p(e,"Not")),sameAs("not a")),truth:makeModuleMethod((e=>n(e)),"Return True if a is true, False otherwise."),is_:makeModuleMethod(((e,t)=>n(B(e,t,"Is"))),sameAs("a is b")),is_not:makeModuleMethod(((e,t)=>n(B(e,t,"IsNot"))),sameAs("a is not b")),abs:makeModuleMethod((e=>l(e)),sameAs("abs(a)")),add:makeModuleMethod(((e,t)=>A(e,t,"Add")),sameAs("a + b")),and_:makeModuleMethod(((e,t)=>A(e,t,"BitAnd")),sameAs("a & b")),floordiv:makeModuleMethod(((e,t)=>A(e,t,"FloorDiv")),sameAs("a // b")),index:makeModuleMethod((e=>new o(N(e))),sameAs("a.__index__()")),inv:makeModuleMethod((e=>p(e,"Invert")),sameAs("~a")),invert:makeModuleMethod((e=>p(e,"Invert")),sameAs("~a")),lshift:makeModuleMethod(((e,t)=>A(e,t,"LShift")),sameAs("a << b")),mod:makeModuleMethod(((e,t)=>A(e,t,"Mod")),sameAs("a % b")),mul:makeModuleMethod(((e,t)=>A(e,t,"Mult")),sameAs("a * b")),matmul:makeModuleMethod(((e,t)=>A(e,t,"MatMult")),sameAs("a @ b")),neg:makeModuleMethod((e=>p(e,"USub")),sameAs("-a")),or_:makeModuleMethod(((e,t)=>A(e,t,"BitOr")),sameAs("a | b")),pos:makeModuleMethod((e=>p(e,"UAdd")),sameAs("+a")),pow:makeModuleMethod(((e,t)=>A(e,t,"Pow")),sameAs("a ** b")),rshift:makeModuleMethod(((e,t)=>A(e,t,"RShift")),sameAs("a >> b")),sub:makeModuleMethod(((e,t)=>A(e,t,"Sub")),sameAs("a - b")),truediv:makeModuleMethod(((e,t)=>A(e,t,"Div")),sameAs("a / b")),xor:makeModuleMethod(((e,t)=>A(e,t,"BitXor")),sameAs("a ^ b")),concat:makeModuleMethod(((e,t)=>v(e,t)),sameAs("a + b, for a and b sequences")),contains:makeModuleMethod(((e,t)=>E(x(e,t),n)),sameAs("b in a (note reversed operands)")),countOf:makeModuleMethod(((e,t)=>j(e,t)),"Return thenumber of times b occurs in a."),delitem:makeModuleMethod(((e,t)=>E(_(e,t,!0),(()=>m))),sameAs("del a[b]")),getitem:makeModuleMethod(((e,t)=>$(e,t,!0)),sameAs("a[b]")),indexOf:makeModuleMethod(((e,t)=>O(e,t)),"Return the first index of b in a"),setitem:makeModuleMethod(((e,t,a)=>E(w(e,t,a,!0),(()=>m))),sameAs("a[b] = c")),length_hint:{$meth:function length_hint(e,a){if(void 0===a)a=new o(0);else if(!c(a))throw new s("\'"+S(a)+"\' object cannot be interpreted as an integer");try{return h(e)}catch(m){if(!(m instanceof s))throw m}const r=y(e,t.$length_hint);if(void 0===r)return a;let n;try{n=T(r,[])}catch(m){if(!(m instanceof s))throw m;return a}if(n===d)return a;if(!c(n))throw new s("__length_hint__ must be an integer, not "+S(n));if(n.nb$isnegative())throw new i("__length_hint__() should return >= 0");return n},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, obj, default=0, /)",$doc:"Return an estimate of the number of items in obj.\\n\\nThis is useful for presizing containers when building from an iterable.\\n\\nIf the object supports len(), the result will be exact.\\nOtherwise, it may over- or under-estimate by an arbitrary amount.\\nThe result will be an integer >= 0."},iadd:makeModuleMethod(((e,t)=>k(e,t,"Add")),sameAs("a += b")),iand:makeModuleMethod(((e,t)=>k(e,t,"BitAnd")),sameAs("a &= b")),iconcat:makeModuleMethod(((e,t)=>I(e,t)),sameAs("a += b, for a and b sequences")),ifloordiv:makeModuleMethod(((e,t)=>k(e,t,"FloorDiv")),sameAs("a //= b")),ilshift:makeModuleMethod(((e,t)=>k(e,t,"LShift")),sameAs("a <<= b")),imod:makeModuleMethod(((e,t)=>k(e,t,"Mod")),sameAs("a %= b")),imul:makeModuleMethod(((e,t)=>k(e,t,"Mult")),sameAs("a *= b")),imatmul:makeModuleMethod(((e,t)=>k(e,t,"MatMult")),sameAs("a @= b")),ior:makeModuleMethod(((e,t)=>k(e,t,"BitOr")),sameAs("a |= b")),ipow:makeModuleMethod(((e,t)=>k(e,t,"Pow")),sameAs("a **= b")),irshift:makeModuleMethod(((e,t)=>k(e,t,"RShift")),sameAs("a >>= b")),isub:makeModuleMethod(((e,t)=>k(e,t,"Sub")),sameAs("a -= b")),itruediv:makeModuleMethod(((e,t)=>k(e,t,"Div")),sameAs("a /= b")),ixor:makeModuleMethod(((e,t)=>k(e,t,"BitXor")),sameAs("a ^= b"))}),L.forEach((e=>{P[`__${e.replace("_","")}__`]=P[e]})),P.div=P.truediv,P.__div__=P.div,P}',"src/lib/platform.js":'var $builtinmodule=function(n){var e={},i="undefined"!=typeof window&&"undefined"!=typeof window.navigator;return e.python_implementation=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("python_implementation",arguments.length,0,0),new Sk.builtin.str("Skulpt")})),e.node=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("node",arguments.length,0,0),new Sk.builtin.str("")})),e.version=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("version",arguments.length,0,0),new Sk.builtin.str("")})),e.python_version=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen("python_version",arguments.length,0,0),n=Sk.__future__.python_version?"3.2.0":"2.7.0",new Sk.builtin.str(n)})),e.system=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen("system",arguments.length,0,0),n=i?window.navigator.appCodeName:"",new Sk.builtin.str(n)})),e.machine=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen("machine",arguments.length,0,0),n=i?window.navigator.platform:"",new Sk.builtin.str(n)})),e.release=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen("release",arguments.length,0,0),n=i?window.navigator.appVersion:"",new Sk.builtin.str(n)})),e.architecture=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("architecture",arguments.length,0,0),new Sk.builtin.tuple([new Sk.builtin.str("64bit"),new Sk.builtin.str("")])})),e.processor=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("processor",arguments.length,0,0),new Sk.builtin.str("")})),e};',"src/lib/processing.js":'var $builtinmodule=function(n){var i,e,t,u,o,s,l,c={__name__:new Sk.builtin.str("processing")},r=[],v=!0,f=null;c.processing=null,c.p=null,c.X=new Sk.builtin.int_(0),c.Y=new Sk.builtin.int_(1),c.Z=new Sk.builtin.int_(2),c.R=new Sk.builtin.int_(3),c.G=new Sk.builtin.int_(4),c.B=new Sk.builtin.int_(5),c.A=new Sk.builtin.int_(6),c.U=new Sk.builtin.int_(7),c.V=new Sk.builtin.int_(8),c.NX=new Sk.builtin.int_(9),c.NY=new Sk.builtin.int_(10),c.NZ=new Sk.builtin.int_(11),c.EDGE=new Sk.builtin.int_(12),c.SR=new Sk.builtin.int_(13),c.SG=new Sk.builtin.int_(14),c.SB=new Sk.builtin.int_(15),c.SA=new Sk.builtin.int_(16),c.SW=new Sk.builtin.int_(17),c.TX=new Sk.builtin.int_(18),c.TY=new Sk.builtin.int_(19),c.TZ=new Sk.builtin.int_(20),c.VX=new Sk.builtin.int_(21),c.VY=new Sk.builtin.int_(22),c.VZ=new Sk.builtin.int_(23),c.VW=new Sk.builtin.int_(24),c.AR=new Sk.builtin.int_(25),c.AG=new Sk.builtin.int_(26),c.AB=new Sk.builtin.int_(27),c.DR=new Sk.builtin.int_(3),c.DG=new Sk.builtin.int_(4),c.DB=new Sk.builtin.int_(5),c.DA=new Sk.builtin.int_(6),c.SPR=new Sk.builtin.int_(28),c.SPG=new Sk.builtin.int_(29),c.SPB=new Sk.builtin.int_(30),c.SHINE=new Sk.builtin.int_(31),c.ER=new Sk.builtin.int_(32),c.EG=new Sk.builtin.int_(33),c.EB=new Sk.builtin.int_(34),c.BEEN_LIT=new Sk.builtin.int_(35),c.VERTEX_FIELD_COUNT=new Sk.builtin.int_(36),c.CENTER=new Sk.builtin.int_(3),c.RADIUS=new Sk.builtin.int_(2),c.CORNERS=new Sk.builtin.int_(1),c.CORNER=new Sk.builtin.int_(0),c.DIAMETER=new Sk.builtin.int_(3),c.BASELINE=new Sk.builtin.int_(0),c.TOP=new Sk.builtin.int_(101),c.BOTTOM=new Sk.builtin.int_(102),c.NORMAL=new Sk.builtin.int_(1),c.NORMALIZED=new Sk.builtin.int_(1),c.IMAGE=new Sk.builtin.int_(2),c.MODEL=new Sk.builtin.int_(4),c.SHAPE=new Sk.builtin.int_(5),c.AMBIENT=new Sk.builtin.int_(0),c.DIRECTIONAL=new Sk.builtin.int_(1),c.SPOT=new Sk.builtin.int_(3),c.RGB=new Sk.builtin.int_(1),c.ARGB=new Sk.builtin.int_(2),c.HSB=new Sk.builtin.int_(3),c.ALPHA=new Sk.builtin.int_(4),c.CMYK=new Sk.builtin.int_(5),c.TIFF=new Sk.builtin.int_(0),c.TARGA=new Sk.builtin.int_(1),c.JPEG=new Sk.builtin.int_(2),c.GIF=new Sk.builtin.int_(3),c.MITER=new Sk.builtin.str("miter"),c.BEVEL=new Sk.builtin.str("bevel"),c.ROUND=new Sk.builtin.str("round"),c.SQUARE=new Sk.builtin.str("butt"),c.PROJECT=new Sk.builtin.str("square"),c.P2D=new Sk.builtin.int_(1),c.JAVA2D=new Sk.builtin.int_(1),c.WEBGL=new Sk.builtin.int_(2),c.P3D=new Sk.builtin.int_(2),c.OPENGL=new Sk.builtin.int_(2),c.PDF=new Sk.builtin.int_(0),c.DXF=new Sk.builtin.int_(0),c.OTHER=new Sk.builtin.int_(0),c.WINDOWS=new Sk.builtin.int_(1),c.MAXOSX=new Sk.builtin.int_(2),c.LINUX=new Sk.builtin.int_(3),c.EPSILON=new Sk.builtin.float_(1e-4),c.MAX_FLOAT=new Sk.builtin.float_(34028235e31),c.MIN_FLOAT=new Sk.builtin.float_(-34028235e31),c.MAX_INT=new Sk.builtin.int_(2147483647),c.MIN_INT=new Sk.builtin.int_(-2147483648),c.HALF_PI=new Sk.builtin.float_(Math.PI/2),c.THIRD_PI=new Sk.builtin.float_(Math.PI/3),c.PI=new Sk.builtin.float_(Math.PI),c.TWO_PI=new Sk.builtin.float_(2*Math.PI),c.TAU=new Sk.builtin.float_(2*Math.PI),c.QUARTER_PI=new Sk.builtin.float_(Math.PI/4),c.DEG_TO_RAD=new Sk.builtin.float_(Math.PI/180),c.RAD_TO_DEG=new Sk.builtin.float_(180/Math.PI),c.WHITESPACE=new Sk.builtin.str(" \\t\\n\\r\\f "),c.POINT=new Sk.builtin.int_(2),c.POINTS=new Sk.builtin.int_(2),c.LINE=new Sk.builtin.int_(4),c.LINES=new Sk.builtin.int_(4),c.TRIANGLE=new Sk.builtin.int_(8),c.TRIANGLES=new Sk.builtin.int_(9),c.TRIANGLE_FAN=new Sk.builtin.int_(11),c.TRIANGLE_STRIP=new Sk.builtin.int_(10),c.QUAD=new Sk.builtin.int_(16),c.QUADS=new Sk.builtin.int_(16),c.QUAD_STRIP=new Sk.builtin.int_(17),c.POLYGON=new Sk.builtin.int_(20),c.PATH=new Sk.builtin.int_(21),c.RECT=new Sk.builtin.int_(30),c.ELLIPSE=new Sk.builtin.int_(31),c.ARC=new Sk.builtin.int_(32),c.SPHERE=new Sk.builtin.int_(40),c.BOX=new Sk.builtin.int_(41),c.GROUP=new Sk.builtin.int_(0),c.PRIMITIVE=new Sk.builtin.int_(1),c.GEOMETRY=new Sk.builtin.int_(3),c.VERTEX=new Sk.builtin.int_(0),c.BEZIER_VERTEX=new Sk.builtin.int_(1),c.CURVE_VERTEX=new Sk.builtin.int_(2),c.BREAK=new Sk.builtin.int_(3),c.CLOSESHAPE=new Sk.builtin.int_(4),c.REPLACE=new Sk.builtin.int_(0),c.BLEND=new Sk.builtin.int_(1),c.ADD=new Sk.builtin.int_(2),c.SUBTRACT=new Sk.builtin.int_(4),c.LIGHTEST=new Sk.builtin.int_(8),c.DARKEST=new Sk.builtin.int_(16),c.DIFFERENCE=new Sk.builtin.int_(32),c.EXCLUSION=new Sk.builtin.int_(64),c.MULTIPLY=new Sk.builtin.int_(128),c.SCREEN=new Sk.builtin.int_(256),c.OVERLAY=new Sk.builtin.int_(512),c.HARD_LIGHT=new Sk.builtin.int_(1024),c.SOFT_LIGHT=new Sk.builtin.int_(2048),c.DODGE=new Sk.builtin.int_(4096),c.BURN=new Sk.builtin.int_(8192),c.ALPHA_MASK=new Sk.builtin.int_(4278190080),c.RED_MASK=new Sk.builtin.int_(16711680),c.GREEN_MASK=new Sk.builtin.int_(65280),c.BLUE_MASK=new Sk.builtin.int_(255),c.CUSTOM=new Sk.builtin.int_(0),c.ORTHOGRAPHIC=new Sk.builtin.int_(2),c.PERSPECTIVE=new Sk.builtin.int_(3),c.ARROW=new Sk.builtin.str("default"),c.CROSS=new Sk.builtin.str("crosshair"),c.HAND=new Sk.builtin.str("pointer"),c.MOVE=new Sk.builtin.str("move"),c.TEXT=new Sk.builtin.str("text"),c.WAIT=new Sk.builtin.str("wait"),c.NOCURSOR=Sk.builtin.assk$("url(\'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\'), auto"),c.DISABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(1),c.ENABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(-1),c.ENABLE_OPENGL_4X_SMOOTH=new Sk.builtin.int_(2),c.ENABLE_NATIVE_FONTS=new Sk.builtin.int_(3),c.DISABLE_DEPTH_TEST=new Sk.builtin.int_(4),c.ENABLE_DEPTH_TEST=new Sk.builtin.int_(-4),c.ENABLE_DEPTH_SORT=new Sk.builtin.int_(5),c.DISABLE_DEPTH_SORT=new Sk.builtin.int_(-5),c.DISABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(6),c.ENABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(-6),c.ENABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(7),c.DISABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(-7),c.HINT_COUNT=new Sk.builtin.int_(10),c.OPEN=new Sk.builtin.int_(1),c.CLOSE=new Sk.builtin.int_(2),c.BLUR=new Sk.builtin.int_(11),c.GRAY=new Sk.builtin.int_(12),c.INVERT=new Sk.builtin.int_(13),c.OPAQUE=new Sk.builtin.int_(14),c.POSTERIZE=new Sk.builtin.int_(15),c.THRESHOLD=new Sk.builtin.int_(16),c.ERODE=new Sk.builtin.int_(17),c.DILATE=new Sk.builtin.int_(18),c.BACKSPACE=new Sk.builtin.int_(8),c.TAB=new Sk.builtin.int_(9),c.ENTER=new Sk.builtin.int_(10),c.RETURN=new Sk.builtin.int_(13),c.ESC=new Sk.builtin.int_(27),c.DELETE=new Sk.builtin.int_(127),c.CODED=new Sk.builtin.int_(65535),c.SHIFT=new Sk.builtin.int_(16),c.CONTROL=new Sk.builtin.int_(17),c.ALT=new Sk.builtin.int_(18),c.CAPSLK=new Sk.builtin.int_(20),c.PGUP=new Sk.builtin.int_(33),c.PGDN=new Sk.builtin.int_(34),c.END=new Sk.builtin.int_(35),c.HOME=new Sk.builtin.int_(36),c.LEFT=new Sk.builtin.int_(37),c.UP=new Sk.builtin.int_(38),c.RIGHT=new Sk.builtin.int_(39),c.DOWN=new Sk.builtin.int_(40),c.F1=new Sk.builtin.int_(112),c.F2=new Sk.builtin.int_(113),c.F3=new Sk.builtin.int_(114),c.F4=new Sk.builtin.int_(115),c.F5=new Sk.builtin.int_(116),c.F6=new Sk.builtin.int_(117),c.F7=new Sk.builtin.int_(118),c.F8=new Sk.builtin.int_(119),c.F9=new Sk.builtin.int_(120),c.F10=new Sk.builtin.int_(121),c.F11=new Sk.builtin.int_(122),c.F12=new Sk.builtin.int_(123),c.NUMLK=new Sk.builtin.int_(144),c.META=new Sk.builtin.int_(157),c.INSERT=new Sk.builtin.int_(155),c.SINCOS_LENGTH=new Sk.builtin.int_(720),c.PRECISIONB=new Sk.builtin.int_(15),c.PRECISIONF=new Sk.builtin.int_(32768),c.PREC_MAXVAL=new Sk.builtin.int_(32767),c.PREC_ALPHA_SHIFT=new Sk.builtin.int_(9),c.PREC_RED_SHIFT=new Sk.builtin.int_(1),c.NORMAL_MODE_AUTO=new Sk.builtin.int_(0),c.NORMAL_MODE_SHAPE=new Sk.builtin.int_(1),c.NORMAL_MODE_VERTEX=new Sk.builtin.int_(2),c.MAX_LIGHTS=new Sk.builtin.int_(8),c.line=new Sk.builtin.func((function(n,i,e,t){c.processing.line(n.v,i.v,e.v,t.v)})),c.ellipse=new Sk.builtin.func((function(n,i,e,t){c.processing.ellipse(n.v,i.v,e.v,t.v)})),c.circle=new Sk.builtin.func((function(n,i,e){c.processing.ellipse(n.v,i.v,e.v,e.v)})),c.text=new Sk.builtin.func((function(n,i,e){c.processing.text(n.v,i.v,e.v)})),c.point=new Sk.builtin.func((function(n,i){c.processing.point(n.v,i.v)})),c.arc=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.arc(n.v,i.v,e.v,t.v,u.v,o.v)})),c.quad=new Sk.builtin.func((function(n,i,e,t,u,o,s,l){c.processing.quad(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v)})),c.rect=new Sk.builtin.func((function(n,i,e,t,u){"undefined"==typeof u?c.processing.rect(n.v,i.v,e.v,t.v):c.processing.rect(n.v,i.v,e.v,t.v,u.v)})),c.triangle=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.triangle(n.v,i.v,e.v,t.v,u.v,o.v)})),c.bezier=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v,f,S){"undefined"==typeof r?c.processing.bezier(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.bezier(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v,S.v)})),c.alpha=new Sk.builtin.func((function(n,i,e){return"undefined"==typeof i?new Sk.builtin.float_(c.processing.alpha(n.v)):"undefined"==typeof e?new Sk.builtin.float_(c.processing.alpha(n.v,i.v)):new Sk.builtin.float_(c.processing.alpha(n.v,i.v,e.v))})),c.ambient=new Sk.builtin.func((function(n,i,e){"undefined"==typeof i?c.processing.ambient(n.v):"undefined"==typeof e?c.processing.ambient(n.v,i.v):c.processing.ambient(n.v,i.v,e.v)})),c.ambientLight=new Sk.builtin.func((function(n,i,e,t,u,o){"undefined"==typeof t?c.processing.ambientLight(n.v,i.v,e.v):"undefined"==typeof u?c.processing.ambientLight(n.v,i.v,e.v,t.v):"undefined"==typeof o?c.processing.ambientLight(n.v,i.v,e.v,t.v,u.v):c.processing.ambientLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.beginCamera=new Sk.builtin.func((function(){c.processing.beginCamera()})),c.beginShape=new Sk.builtin.func((function(n){"undefined"==typeof n&&(n=c.POLYGON),c.processing.beginShape(n.v)})),c.bezierDetail=new Sk.builtin.func((function(n){n="undefined"!=typeof n?n.v:20,c.processing.bezierDetail(n)})),c.bezierPoint=new Sk.builtin.func((function(n,i,e,t,u){c.processing.bezierPoint(n.v,i.v,e.v,t.v,u.v)})),c.bezierTangent=new Sk.builtin.func((function(n,i,e,t,u){c.processing.bezierTangent(n.v,i.v,e.v,t.v,u.v)})),c.bezierVertex=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){"undefined"==typeof s?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v):"undefined"==typeof l?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v):"undefined"==typeof r?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.blend=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v){n instanceof Sk.builtin.int_||n instanceof Sk.builtin.float_?c.processing.blend(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v):c.processing.blend(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v)})),c.blendColor=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return t.v=c.processing.blendColor(n.v,i.v,e.v),t})),c.brightness=new Sk.builtin.func((function(n,i,e){return"undefined"==typeof i?new Sk.builtin.float_(c.processing.brightness(n.v)):"undefined"==typeof e?new Sk.builtin.float_(c.processing.brightness(n.v,i.v)):new Sk.builtin.float_(c.processing.brightness(n.v,i.v,e.v))})),c.camera=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){"undefined"==typeof n?c.processing.camera():c.processing.camera(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.constrain=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.constrain(n.v,i.v,e.v))})),c.copy=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){n instanceof Sk.builtin.int_||n instanceof Sk.builtin.float_?c.processing.copy(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.copy(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.createFont=new Sk.builtin.func((function(n,i,e,t){var u=Sk.misceval.callsimArray(c.PFont);return u.v="undefined"==typeof e?c.processing.createFont(n.v,i.v):"undefined"==typeof t?c.processing.createFont(n.v,i.v,e.v):c.processing.createFont(n.v,i.v,e.v,t.v),u})),c.createGraphics=new Sk.builtin.func((function(n,i,e,t){var u=Sk.misceval.callsimArray(c.PGraphics);return u.v="undefined"==typeof t?c.processing.createGraphics(n.v,i.v,e.v):c.processing.createGraphics(n.v,i.v,e.v,t.v),u})),c.createImage=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.PImage);return t.v=c.processing.createImage(n.v,i.v,e.v),t})),c.cursor=new Sk.builtin.func((function(n,i,e){"undefined"==typeof n?c.processing.cursor():"undefined"==typeof i?c.processing.cursor(n.v):"undefined"==typeof e?c.processing.cursor(n.v,i.v):c.processing.cursor(n.v,i.v,e.v)})),c.curve=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v,f,S){"undefined"==typeof r?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):"undefined"==typeof v?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v):"undefined"==typeof f?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v):"undefined"==typeof S?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v):c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v,S.v)})),c.curveDetail=new Sk.builtin.func((function(n){c.processing.curveDetail(n.v)})),c.curvePoint=new Sk.builtin.func((function(n,i,e,t,u){c.processing.curvePoint(n.v,i.v,e.v,t.v,u.v)})),c.curveTangent=new Sk.builtin.func((function(n,i,e,t,u){c.processing.curveTangent(n.v,i.v,e.v,t.v,u.v)})),c.curveTightness=new Sk.builtin.func((function(n){c.processing.curveTightness(n.v)})),c.curveVertex=new Sk.builtin.func((function(n,i,e){"undefined"==typeof e?c.processing.curveVertex(n.v,i.v):c.processing.curveVertex(n.v,i.v,e.v)})),c.day=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.day())})),c.degrees=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.degrees(n.v))})),c.directionalLight=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.directionalLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.dist=new Sk.builtin.func((function(n,i,e,t,u,o){return"undefined"==typeof u?new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v)):"undefined"==typeof o?new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v,u.v)):new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v,u.v,o.v))})),c.emissive=new Sk.builtin.func((function(n,i,e){"undefined"==typeof i?c.processing.emissive(n.v):"undefined"==typeof e?c.processing.emissive(n.v,i.v):c.processing.emissive(n.v,i.v,e.v)})),c.endCamera=new Sk.builtin.func((function(){c.processing.endCamera()})),c.endShape=new Sk.builtin.func((function(n){"undefined"==typeof n?c.processing.endShape():c.processing.endShape(n.v)})),c.filter=new Sk.builtin.func((function(n,i){"undefined"==typeof i?c.processing.filter(n.v):c.processing.filter(n.v,i.v)})),c.frustum=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.frustum(n,i,e,t,u,o)})),c.hint=new Sk.builtin.func((function(n){c.processing.hint(n)})),c.hour=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.hour())})),c.hue=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.hue(n.v))})),c.imageMode=new Sk.builtin.func((function(n){c.processing.imageMode(n.v)})),c.lerp=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.lerp(n.v,i.v,e.v))})),c.lerpColor=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return t.v=c.processing.lerpColor(n.v,i.v,e.v),t})),c.lightFalloff=new Sk.builtin.func((function(n,i,e){c.processing.lightFalloff(n.v,i.v,e.v)})),c.lights=new Sk.builtin.func((function(){c.processing.lights()})),c.lightSpecular=new Sk.builtin.func((function(n,i,e){c.processing.lightSpecular(n.v,i.v,e.v)})),c.loadBytes=new Sk.builtin.func((function(n){return new Sk.builtin.list(c.processing.loadBytes(n.v))})),c.loadFont=new Sk.builtin.func((function(n){var i=Sk.misceval.callsimArray(c.PFont);return i.v=c.processing.loadFont(n.v),i})),c.loadShape=new Sk.builtin.func((function(n){return Sk.misceval.callsimArray(c.PShapeSVG,[new Sk.builtin.str("string"),n])})),c.loadStrings=new Sk.builtin.func((function(n){return new Sk.builtin.list(c.processing.loadStrings(n.v))})),c.mag=new Sk.builtin.func((function(n,i,e){return"undefined"==typeof e?new Sk.builtin.float_(c.processing.mag(n.v,i.v)):new Sk.builtin.float_(c.processing.mag(n.v,i.v,e.v))})),c.map=new Sk.builtin.func((function(n,i,e,t,u){return new Sk.builtin.float_(c.processing.map(n.v,i.v,e.v,t.v,u.v))})),c.millis=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.millis())})),c.minute=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.minute())})),c.modelX=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelX(n.v,i.v,e.v))})),c.modelY=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelY(n.v,i.v,e.v))})),c.modelZ=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelZ(n.v,i.v,e.v))})),c.month=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.month())})),c.noCursor=new Sk.builtin.func((function(){c.processing.noCursor()})),c.noise=new Sk.builtin.func((function(n,i,e){return"undefined"==typeof i?new Sk.builtin.float_(c.processing.noise(n.v)):"undefined"==typeof e?new Sk.builtin.float_(c.processing.noise(n.v,i.v)):new Sk.builtin.float_(c.processing.noise(n.v,i.v,e.v))})),c.noiseDetail=new Sk.builtin.func((function(n,i){c.processing.noiseDetail(n.v,i.v)})),c.noiseSeed=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.noiseSeed(n.v))})),c.noLights=new Sk.builtin.func((function(){c.processing.noLights()})),c.norm=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.norm(n.v,i.v,e.v))})),c.normal=new Sk.builtin.func((function(n,i,e){c.processing.normal(n.v,i.v,e.v)})),c.noTint=new Sk.builtin.func((function(){c.processing.noTint()})),c.ortho=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.ortho(n.v,i.v,e.v,t.v,u.v,o.v)})),c.perspective=new Sk.builtin.func((function(n,i,e,t){"undefined"==typeof n?c.processing.perspective():"undefined"==typeof i?c.processing.perspective(n.v):"undefined"==typeof e?c.processing.perspective(n.v,i.v):"undefined"==typeof t?c.processing.perspective(n.v,i.v,e.v):c.processing.perspective(n.v,i.v,e.v,t.v)})),c.pointLight=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.pointLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.printCamera=new Sk.builtin.func((function(){c.processing.printCamera()})),c.println=new Sk.builtin.func((function(n){c.processing.println(n.v)})),c.printProjection=new Sk.builtin.func((function(){c.processing.printProjection()})),c.radians=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.radians(n.v))})),c.randomSeed=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.randomSeed(n.v))})),c.random=new Sk.builtin.func((function(n,i){return"undefined"==typeof n?new Sk.builtin.float_(c.processing.random()):"undefined"==typeof i?new Sk.builtin.float_(c.processing.random(n.v)):new Sk.builtin.float_(c.processing.random(n.v,i.v))})),c.requestImage=new Sk.builtin.func((function(n,i){var e=Sk.misceval.callsimArray(c.PImage);return e.v="undefined"==typeof i?c.processing.requestImage(n.v):c.processing.requestImage(n.v,i.v),e})),c.saturation=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.saturation(n.v))})),c.save=new Sk.builtin.func((function(n){c.processing.save(n.v)})),c.saveFrame=new Sk.builtin.func((function(n){"undefined"==typeof n?c.processing.saveFrame():c.processing.saveFrame(n.v)})),c.saveStrings=new Sk.builtin.func((function(n,i){c.processing.saveStrings(n.v,i.v)})),c.screenX=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenX(n.v,i.v,e.v))})),c.screenY=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenY(n.v,i.v,e.v))})),c.screenZ=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenZ(n.v,i.v,e.v))})),c.second=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.second())})),c.shape=new Sk.builtin.func((function(n,i,e,t,u){"undefined"==typeof i?c.processing.shape(n.v):"undefined"==typeof e?c.processing.shape(n.v,i.v):"undefined"==typeof t?c.processing.shape(n.v,i.v,e.v):"undefined"==typeof u?c.processing.shape(n.v,i.v,e.v,t.v):c.processing.shape(n.v,i.v,e.v,t.v,u.v)})),c.shapeMode=new Sk.builtin.func((function(n){c.processing.shapeMode(n.v)})),c.shininess=new Sk.builtin.func((function(n){c.processing.shininess(n.v)})),c.specular=new Sk.builtin.func((function(n,i,e){"undefined"==typeof i?c.processing.specular(n.v):"undefined"==typeof e?c.processing.specular(n.v,i.v):c.processing.specular(n.v,i.v,e.v)})),c.spotLight=new Sk.builtin.func((function(n,i,e,t,u,o,s,l){c.processing.spotLight(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v)})),c.sq=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.sq(n))})),c.status=new Sk.builtin.func((function(n){c.processing.status(n.v)})),c.textAlign=new Sk.builtin.func((function(n,i){"undefined"==typeof i?c.processing.textAlign(n.v):c.processing.textAlign(n.v,i.v)})),c.textAscent=new Sk.builtin.func((function(){return new Sk.builtin.float_(c.processing.textAscent())})),c.textDescent=new Sk.builtin.func((function(){return new Sk.builtin.float_(c.processing.textDescent())})),c.textFont=new Sk.builtin.func((function(n,i){"undefined"==typeof i?c.processing.textFont(n.v):c.processing.textFont(n.v,i.v)})),c.textLeading=new Sk.builtin.func((function(n){c.processing.textLeading(n.v)})),c.textMode=new Sk.builtin.func((function(n){c.processing.textMode(n.v)})),c.textSize=new Sk.builtin.func((function(n){c.processing.textSize(n.v)})),c.texture=new Sk.builtin.func((function(n){c.processing.texture(n.v)})),c.textureMode=new Sk.builtin.func((function(n){c.processing.textureMode(n.v)})),c.textWidth=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.textWidth(n.v))})),c.tint=new Sk.builtin.func((function(n,i,e,t){"undefined"==typeof i?c.processing.tint(n.v):"undefined"==typeof e?c.processing.tint(n.v,i.v):"undefined"==typeof t?c.processing.tint(n.v,i.v,e.v):c.processing.tint(n.v,i.v,e.v,t.v)})),c.updatePixels=new Sk.builtin.func((function(){c.processing.updatePixels()})),c.vertex=new Sk.builtin.func((function(n,i,e,t,u){"undefined"==typeof e?c.processing.vertex(n.v,i.v):"undefined"==typeof t?c.processing.vertex(n.v,i.v,e.v):"undefined"==typeof u?c.processing.vertex(n.v,i.v,e.v,t.v):c.processing.vertex(n.v,i.v,e.v,t.v,u.v)})),c.year=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.year())})),c.box=new Sk.builtin.func((function(n){c.processing.box(n.v)})),c.sphere=new Sk.builtin.func((function(n){c.processing.sphere(n.v)})),c.sphereDetail=new Sk.builtin.func((function(n,i){"undefined"==typeof i?c.processing.sphereDetail(n.v):c.processing.sphereDetail(n.v,i.v)})),c.background=new Sk.builtin.func((function(n,i,e){"undefined"!=typeof i&&(i=i.v),"undefined"!=typeof e&&(e=e.v),c.processing.background(n.v,i,e)})),c.fill=new Sk.builtin.func((function(n,i,e,t){"undefined"!=typeof i&&(i=i.v),"undefined"!=typeof e&&(e=e.v),"undefined"!=typeof t&&(t=t.v),c.processing.fill(n.v,i,e,t)})),c.stroke=new Sk.builtin.func((function(n,i,e,t){"undefined"!=typeof i&&(i=i.v),"undefined"!=typeof e&&(e=e.v),"undefined"!=typeof t&&(t=t.v),c.processing.stroke(n.v,i,e,t)})),c.noStroke=new Sk.builtin.func((function(){c.processing.noStroke()})),c.colorMode=new Sk.builtin.func((function(n,i,e,t,u){i="undefined"==typeof i?255:i.v,"undefined"!=typeof e&&(e=e.v),"undefined"!=typeof t&&(t=t.v),"undefined"!=typeof u&&(u=u.v),c.processing.colorMode(n.v,i,e,t,u)})),c.noFill=new Sk.builtin.func((function(){c.processing.noFill()})),c.loop=new Sk.builtin.func((function(){if(null===c.processing)throw new Sk.builtin.Exception("loop() should be called after run()");v=!0,c.processing.loop()})),c.noLoop=new Sk.builtin.func((function(){if(null===c.processing)throw new Sk.builtin.Exception("noLoop() should be called after run()");v=!1,c.processing.noLoop()})),c.frameRate=new Sk.builtin.func((function(n){c.processing.frameRate(n.v)})),c.width=new Sk.builtin.int_(0),c.height=new Sk.builtin.int_(0),c.renderMode=c.P2D,c.size=new Sk.builtin.func((function(n,i,e){"undefined"==typeof e&&(e=c.P2D),c.processing.size(n.v,i.v,e.v),c.width=new Sk.builtin.int_(c.processing.width),c.height=new Sk.builtin.int_(c.processing.height),c.renderMode=e})),c.exitp=new Sk.builtin.func((function(){c.processing.exit()})),c.mouseX=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.mouseX)})),c.mouseY=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.mouseY)})),c.pmouseX=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.pmouseX)})),c.pmouseY=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.pmouseY)})),c.rectMode=new Sk.builtin.func((function(n){c.processing.rectMode(n.v)})),c.strokeWeight=new Sk.builtin.func((function(n){c.processing.strokeWeight(n.v)})),c.smooth=new Sk.builtin.func((function(){c.processing.smooth()})),c.noSmooth=new Sk.builtin.func((function(){c.processing.noSmooth()})),c.ellipseMode=new Sk.builtin.func((function(n){c.processing.ellipseMode(n.v)})),c.strokeCap=new Sk.builtin.func((function(n){c.processing.strokeCap(n.v)})),c.strokeJoin=new Sk.builtin.func((function(n){c.processing.strokeJoin(n.v)})),c.rotate=new Sk.builtin.func((function(n){c.processing.rotate(n.v)})),c.rotateX=new Sk.builtin.func((function(n){c.processing.rotateX(n.v)})),c.rotateY=new Sk.builtin.func((function(n){c.processing.rotateY(n.v)})),c.rotateZ=new Sk.builtin.func((function(n){c.processing.rotateZ(n.v)})),c.scale=new Sk.builtin.func((function(n,i,e){i="undefined"==typeof i?1:i.v,e="undefined"==typeof e?1:e.v,c.processing.scale(n.v,i,e)})),c.translate=new Sk.builtin.func((function(n,i,e){i="undefined"==typeof i?1:i.v,e="undefined"==typeof e?1:e.v,c.processing.translate(n.v,i,e)})),c.popMatrix=new Sk.builtin.func((function(){c.processing.popMatrix()})),c.pushMatrix=new Sk.builtin.func((function(){c.processing.pushMatrix()})),c.applyMatrix=new Sk.builtin.func((function(){var n,i=Array.prototype.slice.call(arguments,0,16);for(n=0;nnew pyStr(e))))},_value2member={},RegexFlagMeta=buildNativeClass("RegexFlagMeta",{constructor:function RegexFlagMeta(){},base:pyType,slots:{tp$iter(){const e=Object.values(_members)[Symbol.iterator]();return new pyIterator((()=>e.next().value))},sq$contains(e){if(!(e instanceof this))throw new TypeError("unsupported operand type(s) for \'in\': \'"+typeName(e)+"\' and \'"+typeName(this)+"\'");return Object.values(_members).includes(e)}}});re.RegexFlag=buildNativeClass("RegexFlag",{meta:RegexFlagMeta,base:pyInt,constructor:function RegexFlag(e){const t=_value2member[e];if(t)return t;this.v=e,_value2member[e]=this},slots:{tp$new(e,t){checkOneArg("RegexFlag",e,t);const r=e[0].valueOf();if(!checkInt(r))throw new ValueError(objectRepr(r)+" is not a valid RegexFlag");return new re.RegexFlag(r)},$r(){let e=this.valueOf();const t=e<0;e=t?~e:e;const r=[];Object.entries(_members).forEach((([t,n])=>{const s=n.valueOf();e&s&&(e&=~s,r.push("re."+t))})),e&&r.push(hex(e).toString());let n=r.join("|");return t&&(n=r.length>1?"~("+n+")":"~"+n),new pyStr(n)},sq$contains(e){if(!(e instanceof re.RegexFlag))throw new TypeError("\'in\' requires a RegexFlag not "+typeName(e));return this.nb$and(e)===e},nb$and:flagBitSlot(((e,t)=>e&t),JSBI.bitwiseAnd),nb$or:flagBitSlot(((e,t)=>e|t),JSBI.bitwiseOr),nb$xor:flagBitSlot(((e,t)=>e^t),JSBI.bitwiseXor),nb$invert:function(){const e=this.v;return"number"==typeof e?new re.RegexFlag(~e):new re.RegexFlag(JSBI.bitwiseNot(e))}},proto:{valueOf(){return this.v}},flags:{sk$unacceptableBase:!0}}),re.TEMPLATE=re.T=new re.RegexFlag(1),re.IGNORECASE=re.I=new re.RegexFlag(2),re.LOCALE=re.L=new re.RegexFlag(4),re.MULTILINE=re.M=new re.RegexFlag(8),re.DOTALL=re.S=new re.RegexFlag(16),re.UNICODE=re.U=new re.RegexFlag(32),re.VERBOSE=re.X=new re.RegexFlag(64),re.DEBUG=new re.RegexFlag(128),re.ASCII=re.A=new re.RegexFlag(256);const _members={ASCII:re.A,IGNORECASE:re.I,LOCALE:re.L,UNICODE:re.U,MULTILINE:re.M,DOTALL:re.S,VERBOSE:re.X,TEMPLATE:re.T,DEBUG:re.DEBUG};function flagBitSlot(e,t){return function(r){if(r instanceof re.RegexFlag||r instanceof pyInt){let n=this.v,s=r.v;if("number"==typeof n&&"number"==typeof s){let t=e(n,s);return t<0&&(t+=4294967296),new re.RegexFlag(t)}return n=JSBI.BigUp(n),s=JSBI.BigUp(s),new re.RegexFlag(JSBI.numberIfSafe(t(n,s)))}return pyNotImplemented}}const jsFlags={i:re.I,m:re.M,s:re.S,u:re.U},jsInlineFlags={i:re.I,a:re.A,s:re.S,L:re.L,m:re.M,u:re.U,x:re.X};RegExp.prototype.hasOwnProperty("sticky")||delete jsFlags.s,RegExp.prototype.hasOwnProperty("unicode")||delete jsFlags.u;const flagFails=Object.entries({"cannot use LOCALE flag with a str pattern":re.L,"ASCII and UNICODE flags are incompatible":new re.RegexFlag(re.A.valueOf()|re.U.valueOf())}),inline_regex=/\\(\\?([isamux]+)\\)/g;function adjustFlags(e,t){let r=e.toString(),n="g",s=0;return r=r.replace(inline_regex,((e,t)=>{for(let r of t){const e=jsInlineFlags[r];s|=e.valueOf()}return""})),flagFails.forEach((([e,t])=>{if((t.valueOf()&s)===t.valueOf())throw new re.error("bad bad inline flags: "+e)})),t=numberBinOp(new re.RegexFlag(s),t,"BitOr"),flagFails.forEach((([e,r])=>{if(numberBinOp(r,t,"BitAnd")===r)throw new ValueError(e)})),numberBinOp(re.A,t,"BitAnd")!==re.A&&(t=numberBinOp(re.U,t,"BitOr")),Object.entries(jsFlags).forEach((([e,r])=>{numberBinOp(r,t,"BitAnd")===r&&(n+=e)})),t=new re.RegexFlag(t.valueOf()),[r,n,t]}let neg_lookbehind_A="(?)(?!(?:\\]|[^\\[]*[^\\\\]\\]))/g,py_to_js_unicode_escape=/\\\\[\\t\\r\\n \\v\\f#&~"\'!:,;`<>]|\\\\-(?!(?:\\]|[^\\[]*[^\\\\]\\]))/g,quantifierErrors=/Incomplete quantifier|Lone quantifier/g,_compiled_patterns=Object.create(null);function compile_pattern(e,t){let r,n;[r,n,t]=adjustFlags(e,t);const s=_compiled_patterns[e.toString()];if(s&&s.$flags===t)return s;const i={};let o,a;r="_"+r,r=r.replace(initialUnescapedBracket,"$1$2\\\\]$3"),r=r.replace(py_to_js_regex,((t,r,n,s,o,a)=>{switch(n){case"\\\\A":return r+neg_lookbehind_A+"^";case"\\\\Z":return r+"$(?!\\\\n)";case"{,":return r+"{0,";case"$":return r+"(?:(?=\\\\n$)|$)";default:if(n.endsWith(">"))return i[o]=!0,r+"(?<"+o+">";if(!i[s])throw new re.error("unknown group name "+s+" at position "+a+1,e,new pyInt(a+1));return r+"\\\\k<"+s+">"}})),r=r.slice(1);let l=r;n.includes("u")&&(l=r.replace(py_to_js_unicode_escape,(e=>{switch(e){case"\\\\ ":return" ";case"\\\\\\t":return"\\\\t";case"\\\\\\n":return"\\\\n";case"\\\\\\v":return"\\\\v";case"\\\\\\f":return"\\\\f";case"\\\\r":return"\\\\r";default:return e.slice(1)}})));try{o=new RegExp(l,n)}catch(g){if(!quantifierErrors.test(g.message))throw a=g.message.substring(g.message.lastIndexOf(":")+2)+" in pattern: "+e.toString(),new re.error(a,e);try{o=new RegExp(r,n.replace("u",""))}catch(g){throw a=g.message.substring(g.message.lastIndexOf(":")+2)+" in pattern: "+e.toString(),new re.error(a,e)}}const p=new re.Pattern(o,e,t);return _compiled_patterns[e.toString()]=p,p}function _compile(e,t){if(e instanceof re.Pattern){if(t!==zero||t.valueOf())throw new ValueError("cannot process flags argument with compiled pattern");return e}if(!checkString(e))throw new TypeError("first argument must be string or compiled pattern");return compile_pattern(e,t)}re.error=buildNativeClass("re.error",{base:Exception,constructor:function error(e,t,r){this.$pattern=t,this.$msg=e,this.$pos=r||pyNone,Exception.call(this,e)},slots:{tp$doc:"Exception raised for invalid regular expressions.\\n\\n Attributes:\\n\\n msg: The unformatted error message\\n pattern: The regular expression pattern\\n",tp$init(e,t){const[r,n,s]=copyKeywordToNamedArgs("re.error",["msg","pattern","pos"],e,t,[pyNone,pyNone]);this.$pattern=n,this.$pos=s,this.$msg=r}},getsets:{msg:{$get(){return this.$msg}},pattern:{$get(){return this.$pattern}},pos:{$get(){return this.$pos}}}});const zero=new pyInt(0),maxsize=Number.MAX_SAFE_INTEGER;re.Pattern=buildNativeClass("re.Pattern",{constructor:function(e,t,r){this.v=e,this.str=t,this.$flags=r,this.$groups=null,this.$groupindex=null},slots:{$r(){const e=objectRepr(this.str).slice(0,200),t=objectRepr(this.$flags.nb$and(re.U.nb$invert()));return new pyStr("re.compile("+e+(t?", "+t:"")+")")},tp$richcompare(e,t){if("Eq"!==t&&"NotEq"!==t||!(e instanceof re.Pattern))return pyNotImplemented;const r=this.str===e.str&&this.$flags===e.$flags;return"Eq"===t?r:!r},tp$hash(){},tp$doc:"Compiled regular expression object."},methods:{match:{$meth:function match(e,t,r){return this.$match(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:"Matches zero or more characters at the beginning of the string."},fullmatch:{$meth:function fullmatch(e,t,r){return this.full$match(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:"Matches against all of the string."},search:{$meth:function search(e,t,r){return this.$search(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:"Scan through string looking for a match, and return a corresponding match object instance.\\n\\nReturn None if no position in the string matches."},sub:{$meth:function sub(e,t,r){return this.$sub(e,t,r)},$flags:{NamedArgs:["repl","string","count"],Defaults:[zero]},$textsig:"($self, /, repl, string, count=0)",$doc:"Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl."},subn:{$meth:function(e,t,r){return this.$subn(e,t,r)},$flags:{NamedArgs:["repl","string","count"],Defaults:[zero]},$textsig:"($self, /, repl, string, count=0)",$doc:"Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl."},findall:{$meth:function findall(e,t,r){return this.find$all(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:"Return a list of all non-overlapping matches of pattern in string."},split:{$meth:function split(e,t){return this.$split(e,t)},$flags:{NamedArgs:["string","maxsplit"],Defaults:[zero]},$textsig:"($self, /, string, maxsplit=0)",$doc:"Split string by the occurrences of pattern."},finditer:{$meth:function finditer(e,t,r){return this.find$iter(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:"Return an iterator over all non-overlapping matches for the RE pattern in string.\\n\\nFor each match, the iterator returns a match object."},scanner:{$meth:function scanner(e,t,r){return this.$scanner(e,t,r)},$flags:{NamedArgs:["string","pos","endpos"],Defaults:[zero,maxsize]},$textsig:"($self, /, string, pos=0, endpos=sys.maxsize)",$doc:null},__copy__:{$meth:function copy(){return this},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:null},__deepcopy__:{$meth:function(){return this},$flags:{OneArg:!0},$textsig:"($self, memo, /)",$doc:null}},getsets:{pattern:{$get(){return this.str},$doc:"The pattern string from which the RE object was compiled."},flags:{$get(){return this.$flags},$doc:"The regex matching flags."},groups:{$get(){if(null===this.$groups){const e=(this.str.v.match(this.group$regex)||[]).length;this.$groups=new pyInt(e)}return this.$groups},$doc:"The number of capturing groups in the pattern."},groupindex:{$get(){if(null===this.$groupindex){const e=this.str.v.matchAll(this.group$regex),t=[];let r=1;for(const n of e)n[1]&&(t.push(new pyStr(n[1])),t.push(new pyInt(r))),r++;this.$groupindex=new pyMappingProxy(new pyDict(t))}return this.$groupindex},$doc:"A dictionary mapping group names to group numbers."}},proto:{group$regex:/\\((?!\\?(?!P<).*)(?:\\?P<([^\\d\\W]\\w*)>)?(?![^\\[]*\\])/g,get$count:e=>(e=asIndexSized(e,OverflowError))||Number.POSITIVE_INFINITY,get$jsstr(e,t,r){if(!checkString(e))throw new TypeError("expected string or bytes-like object");if(t===zero&&r===maxsize||void 0===t&&void 0===r)return{jsstr:e.toString(),pos:zero.valueOf(),endpos:e.sq$length()};const{start:n,end:s}=pySlice.startEnd$wrt(e,t,r);return{jsstr:e.toString().slice(n,s),pos:n,endpos:s}},find$all(e,t,r){let{jsstr:n}=this.get$jsstr(e,t,r);const s=this.v,i=n.matchAll(s),o=[];for(let a of i)o.push(1===a.length?new pyStr(a[0]):2===a.length?new pyStr(a[1]):new pyTuple(a.slice(1).map((e=>new pyStr(e)))));return new pyList(o)},$split(e,t){t=(t=asIndexSized(t))||Number.POSITIVE_INFINITY;let{jsstr:r}=this.get$jsstr(e);const n=this.v,s=[];let i,o=0,a=0;for(;null!==(i=n.exec(r))&&o1&&s.push(...i.slice(1).map((e=>void 0===e?pyNone:new pyStr(e)))),o++,a=n.lastIndex,i.index===n.lastIndex){if(!r)break;r=r.slice(i.index),a=0,n.lastIndex=1}return n.lastIndex=0,s.push(new pyStr(r.slice(a))),new pyList(s)},match$from_repl(e,t,r,n){let s;const i=e[e.length-1];return"object"==typeof i?(s=e.slice(0,e.length-3),Object.assign(s,{groups:i}),s.index=e[e.length-3]):(s=e.slice(0,e.length-2),s.groups=void 0,s.index=e[e.length-2]),new re.Match(s,this.str,t,r,n)},do$sub(e,t,r){const{jsstr:n,pos:s,endpos:i}=this.get$jsstr(t);let o;checkCallable(e)?o=t=>{const r=pyCall(e,[t]);if(!checkString(r))throw new TypeError("expected str instance, "+typeName(r)+" found");return r.toString()}:(e=this.get$jsstr(e).jsstr,o=t=>t.template$repl(e)),r=this.get$count(r);let a=0;const l=n.replace(this.v,((...e)=>{if(a>=r)return e[0];a++;const n=this.match$from_repl(e,t,s,i);return o(n)}));return[new pyStr(l),new pyInt(a)]},$sub(e,t,r){const[n]=this.do$sub(e,t,r);return n},$subn(e,t,r){return new pyTuple(this.do$sub(e,t,r))},do$match(e,t,r,n){let s;({jsstr:s,pos:r,endpos:n}=this.get$jsstr(t,r,n));const i=s.match(e);return null===i?pyNone:new re.Match(i,this,t,r,n)},$search(e,t,r){var n=new RegExp(this.v.source,this.v.flags.replace("g",""));return this.do$match(n,e,t,r)},$match(e,t,r){let n=this.v.source,s=this.v.flags.replace("g","").replace("m","");n="^"+n;var i=new RegExp(n,s);return this.do$match(i,e,t,r)},full$match(e,t,r){let n=this.v.source,s=this.v.flags.replace("g","").replace("m","");n="^(?:"+n+")$";var i=new RegExp(n,s);return this.do$match(i,e,t,r)},find$iter(e,t,r){let n;({jsstr:n,pos:t,endpos:r}=this.get$jsstr(e,t,r));const s=n.matchAll(this.v);return new pyIterator((()=>{const n=s.next().value;if(void 0!==n)return new re.Match(n,this,e,t,r)}))}},flags:{sk$unacceptableBase:!0}}),re.Match=buildNativeClass("re.Match",{constructor:function(e,t,r,n,s){this.v=e,this.$match=new pyStr(this.v[0]),this.str=r,this.$re=t,this.$pos=n,this.$endpos=s,this.$groupdict=null,this.$groups=null,this.$lastindex=null,this.$lastgroup=null,this.$regs=null},slots:{tp$doc:"The result of re.match() and re.search().\\nMatch objects always have a boolean value of True.",$r(){let e="",new pyStr(e)},tp$as_squence_or_mapping:!0,mp$subscript(e){const t=this.get$group(e);return void 0===t?pyNone:new pyStr(t)}},methods:{group:{$meth:function group(...e){let t;return e.length<=1?(t=this.get$group(e[0]),void 0===t?pyNone:new pyStr(t)):(t=[],e.forEach((e=>{e=this.get$group(e),t.push(void 0===e?pyNone:new pyStr(e))})),new pyTuple(t))},$flags:{MinArgs:0},$textsig:null,$doc:"group([group1, ...]) -> str or tuple.\\n Return subgroup(s) of the match by indices or names.\\n For 0 returns the entire match."},start:{$meth:function start(e){const t=this.get$group(e);return new pyInt(void 0===t?-1:this.str.v.indexOf(t,this.v.index+this.$pos))},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, group=0, /)",$doc:"Return index of the start of the substring matched by group."},end:{$meth:function end(e){const t=this.get$group(e);return new pyInt(void 0===t?-1:this.str.v.indexOf(t,this.v.index+this.$pos)+[...t].length)},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, group=0, /)",$doc:"Return index of the end of the substring matched by group."},span:{$meth:function span(e){return this.$span(e)},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, group=0, /)",$doc:"For match object m, return the 2-tuple (m.start(group), m.end(group))."},groups:{$meth:function groups(e){return null!==this.$groups||(this.$groups=Array.from(this.v.slice(1),(t=>void 0===t?e:new pyStr(t))),this.$groups=new pyTuple(this.$groups)),this.$groups},$flags:{NamedArgs:["default"],Defaults:[pyNone]},$textsig:"($self, /, default=None)",$doc:"Return a tuple containing all the subgroups of the match, from 1.\\n\\n default\\n Is used for groups that did not participate in the match."},groupdict:{$meth:function groupdict(e){if(null!==this.$groupdict)return this.$groupdict;if(void 0===this.v.groups)this.$groupdict=new pyDict;else{const t=[];Object.entries(this.v.groups).forEach((([r,n])=>{t.push(new pyStr(r)),t.push(void 0===n?e:new pyStr(n))})),this.$groupdict=new pyDict(t)}return this.$groupdict},$flags:{NamedArgs:["default"],Defaults:[pyNone]},$textsig:"($self, /, default=None)",$doc:"Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name.\\n\\n default\\n Is used for groups that did not participate in the match."},expand:{$meth:function expand(e){if(!checkString(e))throw new TypeError("expected str instance got "+typeName(e));return e=e.toString(),e=this.template$repl(e),new pyStr(e)},$flags:{OneArg:!0},$textsig:"($self, /, template)",$doc:"Return the string obtained by doing backslash substitution on the string template, as done by the sub() method."},__copy__:{$meth:function __copy__(){return this},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:null},__deepcopy__:{$meth:function __deepcopy__(){return this},$flags:{OneArg:!0},$textsig:"($self, memo, /)",$doc:null}},getsets:{lastindex:{$get(){if(null!==this.$lastindex)return this.$lastindex;let e,t=0;return this.v.forEach(((r,n)=>{n&&void 0!==r&&e!==r&&(t=n,e=r)})),this.$lastindex=t?new pyInt(t):pyNone,this.$lastindex},$doc:"The integer index of the last matched capturing group."},lastgroup:{$get(){if(null!==this.$lastgroup)return this.$lastgroup;if(void 0===this.v.groups)this.$lastgroup=pyNone;else{let e;Object.entries(this.v.groups).forEach((([t,r])=>{void 0!==r&&(e=t)})),this.$lastgroup=void 0===e?pyNone:new pyStr(e)}return this.$lastgroup},$doc:"The name of the last matched capturing group."},regs:{$get(){if(null!==this.$regs)return this.$regs;const e=[];return this.v.forEach(((t,r)=>{e.push(this.$span(r))})),this.$regs=new pyTuple(e),this.$regs}},string:{$get(){return this.str},$doc:"The string passed to match() or search()."},re:{$get(){return this.$re},$doc:"The regular expression object."},pos:{$get(){return new pyInt(this.$pos)},$doc:"The index into the string at which the RE engine started looking for a match."},endpos:{$get(){return new pyInt(this.$endpos)},$doc:"The index into the string beyond which the RE engine will not go."}},proto:{get$group(e){if(void 0===e)return this.v[0];if(checkString(e)){if(e=e.toString(),this.v.groups&&Object.prototype.hasOwnProperty.call(this.v.groups,e))return this.v.groups[e]}else if(isIndex(e)&&(e=asIndexSized(e))>=0&&e|\\\\g<([^\\d\\W]\\w*)>|\\\\g?/g,template$repl(e){return e.replace(this.template$regex,((e,t,r,n,s,i)=>{let o;if(void 0!==(t=t||r)?o=t{delete _compiled_patterns[e]})),pyNone},$flags:{NoArgs:!0},$textsig:"($module, / )",$doc:"Clear the regular expression caches"},template:{$meth:function template(e,t){return _compile(e,numberBinOp(re.T,t,"BitOr"))},$flags:{NamedArgs:["pattern","flags"],Defaults:[zero]},$textsig:"($module, / , pattern, flags=0)",$doc:"Compile a template pattern, returning a Pattern object"},escape:{$meth:function(e){if(!checkString(e))throw new TypeError("expected a str instances, got "+typeName(e));return e=(e=e.toString()).replace(escape_chrs,"\\\\$&"),new pyStr(e)},$flags:{NamedArgs:["pattern"],Defaults:[]},$textsig:"($module, / , pattern)",$doc:"\\n Escape special characters in a string.\\n "}});const escape_chrs=/[\\&\\~\\#.*+\\-?^${}()|[\\]\\\\\\t\\r\\v\\f\\n ]/g;return re}',"src/lib/signal.js":'var $builtinmodule=function(n){var i={};return i.SIG_DFL=new Sk.builtin.int_(0),i.SIG_IGN=new Sk.builtin.int_(1),i.CTRL_C_EVENT=new Sk.builtin.int_(0),i.CTRL_BREAK_EVENT=new Sk.builtin.int_(0),i.NSIG=new Sk.builtin.int_(23),i.SIGHUP=new Sk.builtin.int_(1),i.SIGNINT=new Sk.builtin.int_(2),i.SIGILL=new Sk.builtin.int_(4),i.SIGFPE=new Sk.builtin.int_(8),i.SIGKILL=new Sk.builtin.int_(9),i.SIGSEGV=new Sk.builtin.int_(11),i.SIGTERM=new Sk.builtin.int_(15),i.SIGBREAK=new Sk.builtin.int_(21),i.SIGABRT=new Sk.builtin.int_(22),i.pause=new Sk.builtin.func((function(){Sk.builtin.pyCheckArgsLen("pause",arguments.length,0,0);var n=new Sk.misceval.Suspension;return n.resume=function(){return Sk.builtin.none.none$},n.data={type:"Sk.promise",promise:new Promise((function(n,i){if(null!=Sk.signals&&Sk.signals.addEventListener){Sk.signals.addEventListener((function handleSignal(i){Sk.signals.removeEventListener(handleSignal),n()}))}else console.warn("signal.pause() not supported"),Sk.misceval.print_("signal.pause() not supported"),n()}))},n})),i.signal=new Sk.builtin.func((function(){throw new Sk.builtin.NotImplementedError("signal.signal is not supported.")})),i};',"src/lib/string.js":'var $builtinmodule=function(i){var t={};return t.ascii_lowercase=new Sk.builtin.str("abcdefghijklmnopqrstuvwxyz"),t.ascii_uppercase=new Sk.builtin.str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),t.ascii_letters=new Sk.builtin.str(t.ascii_lowercase.v+t.ascii_uppercase.v),t.lowercase=new Sk.builtin.str("abcdefghijklmnopqrstuvwxyz"),t.uppercase=new Sk.builtin.str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),t.letters=new Sk.builtin.str(t.lowercase.v+t.uppercase.v),t.digits=new Sk.builtin.str("0123456789"),t.hexdigits=new Sk.builtin.str("0123456789abcdefABCDEF"),t.octdigits=new Sk.builtin.str("01234567"),t.punctuation=new Sk.builtin.str("!\\"#$%&\'()*+,-./:;<=>?@[\\\\]^_`{|}~"),t.whitespace=new Sk.builtin.str("\\t\\n\\v\\f\\r "),t.printable=new Sk.builtin.str(t.digits.v+t.letters.v+t.punctuation.v+" \\t\\n\\r\\v\\f"),t.split=new Sk.builtin.func((function(...i){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.split,i)})),t.capitalize=new Sk.builtin.func((function(i){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.capitalize,[i])})),t.join=new Sk.builtin.func((function(i,t){return void 0===t&&(t=new Sk.builtin.str(" ")),Sk.misceval.callsimArray(Sk.builtin.str.prototype.join,[t,i])})),t.capwords=new Sk.builtin.func((function(i,n){if(Sk.builtin.pyCheckArgsLen("capwords",arguments.length,1,2),!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError("s must be a string");if(void 0===n&&(n=new Sk.builtin.str(" ")),!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError("sep must be a string");for(var e=Sk.misceval.callsimArray(t.split,[i,n]).v,r=[],l=0;l1&&function isLeapYear(t){return 0==(3&t)&&(t%100!=0||t%400==0)}(e?t.getUTCFullYear():t.getFullYear())&&u++,u}function stdTimezoneOffset(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return Math.max(t.getTimezoneOffset(),e.getTimezoneOffset())}function dst(t){return t.getTimezoneOffset()1)return n[1];if(void 0===e)return null;try{return(n=t.toLocaleString(e,{timeZoneName:"short"}).split(" "))[n.length-1]}catch(i){return null}}function from_seconds(t,e){var i=new Date;if(t){Sk.builtin.pyCheckType("secs","number",Sk.builtin.checkNumber(t));var u=Sk.builtin.asnum$(t);i.setTime(1e3*u)}return function date_to_struct_time(t,e){let i;if(e=e||!1)i=[new Sk.builtin.str("UTC"),new Sk.builtin.int_(0)];else{var u=-t.getTimezoneOffset()/60,r=(u<0?"-":"+")+(""+Math.abs(u)).padStart(2,"0");i=[new Sk.builtin.str(r),new Sk.builtin.int_(3600*u)]}return new n([Sk.builtin.assk$(e?t.getUTCFullYear():t.getFullYear()),Sk.builtin.assk$((e?t.getUTCMonth():t.getMonth())+1),Sk.builtin.assk$(e?t.getUTCDate():t.getDate()),Sk.builtin.assk$(e?t.getUTCHours():t.getHours()),Sk.builtin.assk$(e?t.getUTCMinutes():t.getMinutes()),Sk.builtin.assk$(e?t.getUTCSeconds():t.getSeconds()),Sk.builtin.assk$(((e?t.getUTCDay():t.getDay())+6)%7),Sk.builtin.assk$(getDayOfYear(t,e)),Sk.builtin.assk$(e?0:dst(t)?1:0)],i)}(i,e)}e.struct_time=n,e.time=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen("time",arguments.length,0,0),new Sk.builtin.float_(Date.now()/1e3)})),e.sleep=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen("sleep",arguments.length,1,1),Sk.builtin.pyCheckType("delay","float",Sk.builtin.checkNumber(t)),new Sk.misceval.promiseToSuspension(new Promise((function(e){Sk.setTimeout((function(){e(Sk.builtin.none.none$)}),1e3*Sk.ffi.remapToJs(t))})))})),e.localtime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen("localtime",arguments.length,0,1),from_seconds(t,!1)})),e.gmtime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen("gmtime",arguments.length,0,1),from_seconds(t,!0)}));var i=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],u=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];function asctime_f(t){if(Sk.builtin.pyCheckArgsLen("asctime",arguments.length,0,1),!t||Sk.builtin.checkNone(t)?t=from_seconds():t instanceof n||(t=new n(t)),t instanceof Sk.builtin.tuple&&9==t.v.length){var e=[];return e.push(u[Sk.builtin.asnum$(t.v[6])]),e.push(i[Sk.builtin.asnum$(t.v[1])-1]),e.push(padLeft(Sk.builtin.asnum$(t.v[2]).toString(),2,"0")),e.push(padLeft(Sk.builtin.asnum$(t.v[3]).toString(),2,"0")+":"+padLeft(Sk.builtin.asnum$(t.v[4]).toString(),2,"0")+":"+padLeft(Sk.builtin.asnum$(t.v[5]).toString(),2,"0")),e.push(padLeft(Sk.builtin.asnum$(t.v[0]).toString(),4,"0")),new Sk.builtin.str(e.join(" "))}}function mktime_f(t){if(Sk.builtin.pyCheckArgsLen("mktime",arguments.length,1,1),t instanceof Sk.builtin.tuple&&9==t.v.length){var e=new Date(Sk.builtin.asnum$(t.v[0]),Sk.builtin.asnum$(t.v[1])-1,Sk.builtin.asnum$(t.v[2]),Sk.builtin.asnum$(t.v[3]),Sk.builtin.asnum$(t.v[4]),Sk.builtin.asnum$(t.v[5]));return Sk.builtin.assk$(e.getTime()/1e3,void 0)}throw new Sk.builtin.TypeError("mktime() requires a struct_time or 9-tuple")}e.asctime=new Sk.builtin.func(asctime_f),e.ctime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen("ctime",arguments.length,0,1),asctime_f(from_seconds(t))})),e.mktime=new Sk.builtin.func(mktime_f),e.timezone=new Sk.builtin.int_(60*stdTimezoneOffset()),e.altzone=new Sk.builtin.int_(60*function altTimezoneOffset(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return Math.min(t.getTimezoneOffset(),e.getTimezoneOffset())}()),e.daylight=new Sk.builtin.int_(function daylight_check(){const t=new Date(2002,0,1),e=new Date(2002,6,1);return t.getTimezoneOffset()!=e.getTimezoneOffset()}()?1:0),e.tzname=new Sk.builtin.tuple(function timeZoneNames(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return dst(t)?[new Sk.builtin.str(timeZoneName(e)),new Sk.builtin.str(timeZoneName(t))]:[new Sk.builtin.str(timeZoneName(t)),new Sk.builtin.str(timeZoneName(e))]}()),e.accept2dyear=Sk.builtin.assk$(1),e.clock=new Sk.builtin.func((function(){var t=0;return t=Sk.global.performance&&Sk.global.performance.now?performance.now()/1e3:(new Date).getTime()/1e3,new Sk.builtin.float_(t)})),e.strftime=new Sk.builtin.func((function strftime_f(t,e){var i;if(Sk.builtin.pyCheckArgsLen("strftime",arguments.length,1,2),!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("format must be a string");return e?e instanceof n||(e=new n(e)):e=from_seconds(),function check_struct_time(t){if(!(t instanceof n))throw new Sk.builtin.TypeError("Required argument \'struct_time\' must be of type: \'struct_time\'");var e,i=t.v.length,u=t.v;for(e=0;e(r=e.tp$getattr(new Sk.builtin.str("_strptime_time")),r.tp$call(t)))):r.tp$call(t)})),e};',"src/lib/token.js":'var $builtinmodule=function(n){var e={};e.__file__=new Sk.builtin.str("/src/lib/token.py");const t=[];for(let i in Sk.token.tok_name){const n=Sk.token.tok_name[i].slice(2),k=parseInt(i,10);t.push(Sk.ffi.remapToPy(k)),t.push(Sk.ffi.remapToPy(n)),e[n]=Sk.ffi.remapToPy(k)}return e.tok_name=new Sk.builtin.dict(t),e.ISTERMINAL=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen("ISTERMINAL",arguments.length,1,1),Sk.token.ISTERMINAL(Sk.ffi.remapToJs(n))})),e.ISNONTERMINAL=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen("ISNONTERMINAL",arguments.length,1,1),Sk.token.ISNONTERMINAL(Sk.ffi.remapToJs(n))})),e.ISEOF=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen("ISEOF",arguments.length,1,1),Sk.token.ISEOF(Sk.ffi.remapToJs(n))})),e};',"src/lib/tokenize.js":'var $builtinmodule=function(e){var i={};return i.tokenize=new Sk.builtin.func((function(e){Sk.builtin.pyCheckArgsLen("tokenize",1,1),Sk.builtin.checkFunction(e);const i=[];return Sk._tokenize("",(function jsReadline(){const i=Sk.misceval.callsimArray(e);return Sk.ffi.remapToJs(i)}),"UTF-8",(function receiveToken(e){i.push(new Sk.builtin.tuple([Sk.ffi.remapToPy(e.type),Sk.ffi.remapToPy(e.string),new Sk.builtin.tuple([Sk.ffi.remapToPy(e.start[0]),Sk.ffi.remapToPy(e.start[1])]),new Sk.builtin.tuple([Sk.ffi.remapToPy(e.end[0]),Sk.ffi.remapToPy(e.end[1])]),Sk.ffi.remapToPy(e.line)]))})),new Sk.builtin.list(i)})),i};',"src/lib/turtle.js":'var $builtinmodule=function(e){"use strict";var t=function getConfiguredTarget(){var e,t;for(t="string"==typeof(e=Sk.TurtleGraphics&&Sk.TurtleGraphics.target||"turtle")?document.getElementById(e):e;t.firstChild;)t.removeChild(t.firstChild);return t}();return t.turtleInstance?t.turtleInstance.reset():t.turtleInstance=function generateTurtleModule(e){var t,n,r,i,s,a,o,l,u={__name__:new Sk.builtin.str("turtle")},c=!0,h=1e3/30,d={},f={},_={target:"turtle",width:400,height:400,worldWidth:0,worldHeight:0,animate:!0,bufferSize:0,allowUndo:!0,assets:{}};function getAsset(e){var t=i.assets,n="function"==typeof t?t(e):t[e];return"string"==typeof n?new Promise((function(t,r){var s=new Image;s.onload=function(){i.assets[e]=this,t(s)},s.onerror=function(){r(new Error("Missing asset: "+n))},s.src=n})):new InstantPromise(void 0,n)}function InstantPromise(e,t){this.lastResult=t,this.lastError=e}function FrameManager(){this.reset()}function getFrameManager(){return o||(o=new FrameManager),o}function MouseHandler(){var e=this;for(var t in this._target=getTarget(),this._managers={},this._handlers={mousedown:function(t){e.onEvent("mousedown",t)},mouseup:function(t){e.onEvent("mouseup",t)},mousemove:function(t){e.onEvent("mousemove",t)}},this._handlers)this._target.addEventListener(t,this._handlers[t])}function EventManager(e,t){this._type=e,this._target=t,this._handlers=void 0,function getMouseHandler(){return a||(a=new MouseHandler),a}().addManager(e,this)}function Turtle(e){if(getFrameManager().addTurtle(this),this._screen=getScreen(),this._managers={},this._shape=e.v,!d.hasOwnProperty(this._shape))throw new Sk.builtin.ValueError("Shape:\'"+this._shape+"\' not in default shape, please check shape again!");this.reset()}function Screen(){var e,t;this._frames=1,this._delay=void 0,this._bgcolor="none",this._mode="standard",this._managers={},this._keyLogger={},e=(i.worldWidth||i.width||getWidth())/2,t=(i.worldHeight||i.height||getHeight())/2,this.setUpWorld(-e,-t,e,t)}function ensureAnonymous(){return s||(s=Sk.misceval.callsimArray(u.Turtle)),s.instance}function getTarget(){return e}function getScreen(){return r||(r=new Screen),r}function getWidth(){return 0|(r&&r._width||i.width||getTarget().clientWidth||_.width)}function getHeight(){return 0|(r&&r._height||i.height||getTarget().clientHeight||_.height)}function createLayer(e,t){var n,r=document.createElement("canvas"),i=getWidth(),s=getHeight(),a=getTarget().firstChild?-s+"px":"0";return r.width=i,r.height=s,r.style.position="relative",r.style.display="block",r.style.setProperty("margin-top",a),r.style.setProperty("z-index",e),t&&(r.style.display="none"),getTarget().appendChild(r),(n=r.getContext("2d")).lineCap="round",n.lineJoin="round",applyWorld(getScreen(),n),n}function cancelAnimationFrame(){t&&((window.cancelAnimationFrame||window.mozCancelAnimationFrame)(t),t=void 0),n&&(window.clearTimeout(n),n=void 0)}function applyWorld(e,t){var n=e.llx,r=(e.lly,e.urx,e.ury),i=e.xScale,s=e.yScale;t&&(clearLayer(t),t.restore(),t.save(),t.scale(1/i,1/s),t.translate(-n,-r))}function pushUndo(e){var t,n,r;if(i.allowUndo&&e._bufferSize){for(e._undoBuffer||(e._undoBuffer=[]);e._undoBuffer.length>e._bufferSize;)e._undoBuffer.shift();for(n={},t="x y angle radians color fill down filling shown shape size".split(" "),r=0;r=0;)this._turtles[e].reset();this._turtles=[],this._frames=[],this._frameCount=0,this._buffer=1,this._rate=0,this._animationFrame=animationFrame()},e.addFrame=function(e,t){return t&&(this._frameCount+=1),this.frames().push(e),!i.animate||this._buffer&&this._frameCount===this.frameBuffer()?this.update():new InstantPromise},e.frames=function(){return this._frames},e.frameBuffer=function(e){return"number"==typeof e&&(this._buffer=0|e,e&&e<=this._frameCount)?this.update():this._buffer},e.refreshInterval=function(e){return"number"==typeof e&&(this._rate=0|e,this._animationFrame=animationFrame(e)),this._rate},e.update=function(){return this._frames&&this._frames.length?this.requestAnimationFrame():new InstantPromise},e.requestAnimationFrame=function(){var e,t,n=this._frames,r=this._animationFrame,i=this._turtles,s=getScreen().spriteLayer();return this._frames=[],this._frameCount=0,new Promise((function(a){r((function paint(){for(t=0;t=0;)l[a].test(n,r,i,s)&&l[a].canMove("mousedown"===e);if(o&&o.length)for(computeCoordinates(),a=o.length;--a>=0;)("mousemove"===e&&o[a].canMove()&&o[a].test(n,r,i,s)||"mousedown"===e&&o[a].test(n,r,i,s))&&o[a].trigger([i,s])},l.reset=function(){this._managers={}},l.addManager=function(e,t){this._managers[e]||(this._managers[e]=[]),this._managers[e].push(t)},function(e){e.reset=function(){this._handlers=void 0},e.canMove=function(e){return!(!this._target||!this._target.hitTest)&&(void 0!==e&&(this._target.hitTest.hit=e),this._target.hitTest.hit)},e.test=function(e,t,n,r){return this._target&&this._target.hitTest?this._target.hitTest(e,t,n,r):!!this._target},e.trigger=function(e){var t,n=this._handlers;if(n&&n.length)for(t=0;t.5&&e<10.5?Sk.builtin.asnum$(Sk.builtin.round(Sk.builtin.assk$(e))):0,this._speed=e,this._computed_speed=2*e,this.addUpdate(void 0,!1,{speed:this._computed_speed})},e.$speed.minArgs=0,e.$speed.co_varnames=["speed"],e.$pencolor=function(e,t,n,r){return void 0!==e?(this._color=createColor(this._colorMode,e,t,n,r),this.addUpdate(void 0,this._shown,{color:this._color})):hexToRGB(this._color)},e.$pencolor.co_varnames=["r","g","b","a"],e.$pencolor.minArgs=0,e.$pencolor.returnType=f.COLOR,e.$fillcolor=function(e,t,n,r){return void 0!==e?(this._fill=createColor(this._colorMode,e,t,n,r),this.addUpdate(void 0,this._shown,{fill:this._fill})):hexToRGB(this._fill)},e.$fillcolor.co_varnames=["r","g","b","a"],e.$fillcolor.minArgs=0,e.$fillcolor.returnType=f.COLOR,e.$color=function(e,t,n,r){return void 0!==e?(void 0===t||void 0!==n?(this._color=createColor(this._colorMode,e,t,n,r),this._fill=this._color):(this._color=createColor(this._colorMode,e),this._fill=createColor(this._colorMode,t)),this.addUpdate(void 0,this._shown,{color:this._color,fill:this._fill})):[this.$pencolor(),this.$fillcolor()]},e.$color.minArgs=0,e.$color.co_varnames=["color","fill","b","a"],e.$color.returnType=function(e){return new Sk.builtin.tuple([f.COLOR(e[0]),f.COLOR(e[1])])},e.$fill=function(e){if(void 0!==e){if((e=!!e)===this._filling)return;return this._filling=e,e?(pushUndo(this),this.addUpdate(void 0,!1,{filling:!0,fillBuffer:[{x:this._x,y:this._y}]})):(pushUndo(this),this.addUpdate((function(){this.fillBuffer.push(this),drawFill.call(this)}),!0,{filling:!1,fillBuffer:void 0}))}return this._filling},e.$fill.co_varnames=["flag"],e.$fill.minArgs=0,e.$begin_fill=function(){return this.$fill(!0)},e.$end_fill=function(){return this.$fill(!1)},e.$stamp=function(){return pushUndo(this),this.addUpdate((function(){drawTurtle(this,this.context())}),!0)},e.$dot=function(e,t,n,r,i){return pushUndo(this),e="number"==typeof(e=Sk.builtin.asnum$(e))?Math.max(1,0|Math.abs(e)):Math.max(this._size+4,2*this._size),t=void 0!==t?createColor(this._colorMode,t,n,r,i):this._color,this.addUpdate(drawDot,!0,void 0,e,t)},e.$dot.co_varnames=["size","color","g","b","a"],e.$write=function(e,t,n,r){var i,s,a,o,l,u=this;return pushUndo(this),e=String(e),r&&r.constructor===Array&&(s="string"==typeof r[0]?r[0]:"Arial",a=String(r[1]||"12pt"),o="string"==typeof r[2]?r[2]:"normal",/^\\d+$/.test(a)&&(a+="pt"),r=[o,a,s].join(" ")),n||(n="left"),i=this.addUpdate(drawText,!0,void 0,e,n,r),!t||"left"!==n&&"center"!==n||(l=function measureText(e,t){return t&&(p.font=t),p.measureText(e).width}(e,r),"center"===n&&(l/=2),i=i.then((function(){var e=u.getState();return u.translate(e.x,e.y,l,0,!0)}))),i},e.$write.co_varnames=["message","move","align","font"],e.$write.minArgs=1,e.$pensize=e.$width=function(e){return void 0!==e?(this._size=e,this.addUpdate(void 0,this._shown,{size:e})):this._size},e.$pensize.minArgs=e.$width.minArgs=0,e.$pensize.co_varnames=e.$width.co_varnames=["width"],e.$showturtle=e.$st=function(){return this._shown=!0,this.addUpdate(void 0,!0,{shown:!0})},e.$hideturtle=e.$ht=function(){return this._shown=!1,this.addUpdate(void 0,!0,{shown:!1})},e.$isvisible=function(){return this._shown},e.$shape=function(e){return e&&d[e]?(this._shape=e,this.addUpdate(void 0,this._shown,{shape:e})):this._shape},e.$shape.minArgs=0,e.$shape.co_varnames=["name"],e.$window_width=function(){return this._screen.$window_width()},e.$window_height=function(){return this._screen.$window_height()},e.$tracer=function(e,t){return this._screen.$tracer(e,t)},e.$tracer.minArgs=0,e.$tracer.co_varnames=["n","delay"],e.$update=function(){return this._screen.$update()},e.$delay=function(e){return this._screen.$delay(e)},e.$delay.minArgs=0,e.$delay.co_varnames=["delay"],e.$reset=function(){return this.reset(),this.$clear()},e.$mainloop=e.$done=function(){return this._screen.$mainloop()},e.$clear=function(){return this.addUpdate((function(){clearLayer(this.context())}),!0)},e.$dot.minArgs=0,e.$onclick=function(e,t,n){this.getManager("mousedown").addHandler(e,n)},e.$onclick.minArgs=1,e.$onclick.co_varnames=["method","btn","add"],e.$onrelease=function(e,t,n){this.getManager("mouseup").addHandler(e,n)},e.$onrelease.minArgs=1,e.$onrelease.co_varnames=["method","btn","add"],e.$ondrag=function(e,t,n){this.getManager("mousemove").addHandler(e,n)},e.$ondrag.minArgs=1,e.$ondrag.co_varnames=["method","btn","add"],e.$getscreen=function(){return Sk.misceval.callsimArray(u.Screen)},e.$getscreen.isSk=!0,e.$clone=function(){var e=Sk.misceval.callsimOrSuspendArray(u.Turtle);return e.instance._x=this._x,e.instance._y=this._y,e.instance._angle=this._angle,e.instance._radians=this._radians,e.instance._shape=this._shape,e.instance._color=this._color,e.instance._fill=this._fill,e.instance._filling=this._filling,e.instance._size=this._size,e.instance._computed_speed=this._computed_speed,e.instance._down=this._down,e.instance._shown=this._shown,e.instance._colorMode=this._colorMode,e.instance._isRadians=this._isRadians,e.instance._fullCircle=this._fullCircle,e.instance._bufferSize=this._bufferSize,e.instance._undoBuffer=this._undoBuffer,e._clonedFrom=this,e},e.$clone.returnType=function(e){return e},e.$getturtle=e.$getpen=function(){return this.skInstance},e.$getturtle.isSk=!0}(Turtle.prototype),function(e){e.spriteLayer=function(){return this._sprites||(this._sprites=createLayer(3))},e.bgLayer=function(){return this._background||(this._background=createLayer(1))},e.hitTestLayer=function(){return this._hitTest||(this._hitTest=createLayer(0,!0))},e.getManager=function(e){return this._managers[e]||(this._managers[e]=new EventManager(e,this)),this._managers[e]},e.reset=function(){var e;for(e in this._keyListeners=void 0,this._keyLogger)window.clearInterval(this._keyLogger[e]),window.clearTimeout(this._keyLogger[e]),delete this._keyLogger[e];for(e in this._keyDownListener&&(getTarget().removeEventListener("keydown",this._keyDownListener),this._keyDownListener=void 0),this._keyUpListener&&(getTarget().removeEventListener("keyup",this._keyUpListener),this._keyUpListener=void 0),this._timer&&(window.clearTimeout(this._timer),this._timer=void 0),this._managers)this._managers[e].reset();this._mode="standard",removeLayer(this._sprites),this._sprites=void 0,removeLayer(this._background),this._background=void 0},e.setUpWorld=function(e,t,n,r){var i=this;i.llx=e,i.lly=t,i.urx=n,i.ury=r,i.xScale=(n-e)/getWidth(),i.yScale=-1*(r-t)/getHeight(),i.lineScale=Math.min(Math.abs(i.xScale),Math.abs(i.yScale))},e.$setup=function(e,t,n,r){return isNaN(parseFloat(e))&&(e=getWidth()),isNaN(parseFloat(t))&&(t=getHeight()),e<=1&&(e=getWidth()*e),t<=1&&(t=getHeight()*t),this._width=e,this._height=t,this._xOffset=void 0===n||isNaN(parseInt(n))?0:parseInt(n),this._yOffset=void 0===r||isNaN(parseInt(r))?0:parseInt(r),"world"===this._mode?this._setworldcoordinates(this.llx,this.lly,this.urx,this.ury):this._setworldcoordinates(-e/2,-t/2,e/2,t/2)},e.$setup.minArgs=0,e.$setup.co_varnames=["width","height","startx","starty"],e.$register_shape=e.$addshape=function(e,t){if(!t)return getAsset(e).then((function(t){d[e]=t}));d[e]=t},e.$register_shape.minArgs=1,e.$register_shape.co_varnames=["name","shape"],e.$getshapes=function(){return Object.keys(d)},e.$tracer=function(e,t){return void 0!==e||void 0!==t?("number"==typeof t&&(this._delay=t,getFrameManager().refreshInterval(t)),"number"==typeof e?(this._frames=e,getFrameManager().frameBuffer(e)):void 0):this._frames},e.$tracer.co_varnames=["frames","delay"],e.$tracer.minArgs=0,e.$delay=function(e){return void 0!==e?this.$tracer(void 0,e):void 0===this._delay?h:this._delay},e.$delay.co_varnames=["delay"],e._setworldcoordinates=function(e,t,n,r){return getFrameManager().turtles(),this.setUpWorld(e,t,n,r),this._sprites&&applyWorld(this,this._sprites),this._background&&applyWorld(this,this._background),this.$clear()},e.$setworldcoordinates=function(e,t,n,r){return this._mode="world",this._setworldcoordinates(e,t,n,r)},e.$setworldcoordinates.co_varnames=["llx","lly","urx","ury"],e.minArgs=4,e.$clear=e.$clearscreen=function(){return this.reset(),this.$reset()},e.$update=function(){return getFrameManager().update()},e.$reset=e.$resetscreen=function(){var e=this,t=getFrameManager().turtles();return getFrameManager().addFrame((function(){applyWorld(e,e._sprites),applyWorld(e,e._background);for(var n=0;n1&&t[s]&&t[s].test(r),r===a||i){e._keyListeners[r](),e._createKeyRepeater(r,s),n.preventDefault();break}}},getTarget().addEventListener("keydown",this._keyDownListener))},e._createKeyUpListener=function(){var e=this;this._keyUpListener||(this._keyUpListener=function(t){var n=e._keyLogger[t.charCode||t.keyCode];void 0!==n&&(t.preventDefault(),window.clearInterval(n),window.clearTimeout(n),delete e._keyLogger[t.charCode||t.keyCode])},getTarget().addEventListener("keyup",this._keyUpListener))},e.$title=function(e){document.title=e},e.$title.minArgs=1,e.$title.co_varnames=["title"],e.$listen=function(){this._createKeyUpListener(),this._createKeyDownListener()},e.$onkey=function(e,t){if("function"==typeof t){var n=e;e=t,t=n}t=String(t).toLowerCase(),e&&"function"==typeof e?(this._keyListeners||(this._keyListeners={}),this._keyListeners[t]=e):delete this._keyListeners[t]},e.$onkey.minArgs=2,e.$onkey.co_varnames=["method","keyValue"],e.$onscreenclick=function(e,t,n){this.getManager("mousedown").addHandler(e,n)},e.$onscreenclick.minArgs=1,e.$onscreenclick.co_varnames=["method","btn","add"],e.$ontimer=function(e,t){this._timer&&(window.clearTimeout(this._timer),this._timer=void 0),e&&"number"==typeof t&&(this._timer=window.setTimeout(e,Math.max(0,0|t)))},e.$ontimer.minArgs=0,e.$ontimer.co_varnames=["method","interval"]}(Screen.prototype);var g=new Image;function removeLayer(e){e&&e.canvas&&e.canvas.parentNode&&e.canvas.parentNode.removeChild(e.canvas)}function clearLayer(e,t,n){e&&(e.save(),e.setTransform(1,0,0,1,0,0),t?(e.fillStyle=t,e.fillRect(0,0,e.canvas.width,e.canvas.height)):e.clearRect(0,0,e.canvas.width,e.canvas.height),n&&e.drawImage(n,0,0),e.restore())}function drawTurtle(e,t){var n,r,i,s=d[e.shape],a=getScreen(),o=(getWidth(),getHeight(),a.xScale),l=a.yScale;if(t){if(n=Math.cos(e.radians)/o,r=Math.sin(e.radians)/l,i=Math.atan2(r,n)-Math.PI/2,t.save(),t.translate(e.x,e.y),t.scale(o,l),s.nodeName){var u=s.naturalWidth,c=s.naturalHeight;t.drawImage(s,0,0,u,c,-u/2,-c/2,u,c)}else{t.rotate(i),t.beginPath(),t.lineWidth=1,t.strokeStyle=e.color,t.fillStyle=e.fill,t.moveTo(-s[0][0],s[0][1]);for(var h=1;ho)throw u=l===o?"exactly "+o:"between "+l+" and "+o,new Sk.builtin.TypeError(a+"() takes "+u+" positional argument(s) ("+d.length+" given)");for(e=d.length;--e>=0;)void 0!==d[e]&&(d[e]instanceof Sk.builtin.func?d[e]=pythonToJavascriptFunction(d[e]):d[e]instanceof Sk.builtin.method?d[e]=pythonToJavascriptFunction(d[e].im_func,d[e].im_self):d[e]&&d[e].$d instanceof Sk.builtin.dict&&d[e].instance?d[e]=d[e].instance:d[e]=Sk.ffi.remapToJs(d[e]));var _=d.slice(0);for(d=[],e=_.length;e>=0;--e)null!==_[e]&&(d[e]=_[e]);try{t=f[n].apply(f,d)}catch(g){throw window&&window.console&&(window.console.log("wrapped method failed"),window.console.log(g.stack)),g}return t instanceof InstantPromise&&(t=t.lastResult),t instanceof Promise?(t=t.catch((function(e){throw window&&window.console&&(window.console.log("promise failed"),window.console.log(e.stack)),e})),(i=new Sk.misceval.Suspension).resume=function(){return void 0===s?Sk.builtin.none.none$:Sk.ffi.remapToPy(s)},i.data={type:"Sk.promise",promise:t.then((function(e){return s=e,e}))},i):void 0===t?Sk.builtin.none.none$:h?t:"function"==typeof c?c(t):Sk.ffi.remapToPy(t)},i.co_name=new Sk.builtin.str(a),i.co_varnames=u.slice(),i.$defaults=[];for(var d=l;d")})),e.__iter__=new Sk.builtin.func((function(n){var e=n.lineList;return Sk.builtin.makeGenerator((function(){if(!(this.$index>=this.$lines.length))return new Sk.builtin.str(this.$lines[this.$index++])}),{$obj:n,$index:0,$lines:e})})),e.read=new Sk.builtin.func((function(n,e){if(n.closed)throw new Sk.builtin.ValueError("I/O operation on closed file");var i=n.data$.length;void 0===e&&(e=i);var t=new Sk.builtin.str(n.data$.substr(n.pos$,e));return n.pos$+=e,n.pos$>=i&&(n.pos$=i),t})),e.readline=new Sk.builtin.func((function(n,e){var i="";return n.currentLinee===o)).length)throw new i("one of the hex, bytes, bytes_le, fields, or int arguments must be given");if(u!==o){u=u.toString().replace("urn:","").replace("uuid:","");let e=0,i=u.length-1;for(;"{}".indexOf(u[e])>=0;)e++;for(;"{}".indexOf(u[i])>=0;)i--;if(u=u.slice(e,i+1),u=u.replace(S,""),32!==u.length)throw new s("badly formed hexadecimal UUID string");f=d(n,[new t(u),U])}if(c!==o){if(!(c instanceof e))throw new i("bytes_le should be a bytes instance");if(c=c.valueOf(),16!==c.length)throw new s("bytes_le is not a 16-char string");h=switchBytesBytesLe(c),h=new e(h)}if(h!==o){if(!(h instanceof e))throw new i("bytes_le should be a bytes instance");if(16!==h.valueOf().length)throw new s("bytes is not a 16-char string");f=d(w,[h],["byteorder",v])}if(p!==o)throw new r("fields argument is not yet supported");if(f!==o&&(g(f,_,"Lt")||((e,t)=>g(e,t,"GtE"))(f,y)))throw new s("int is out of range (need a 128-bit value)");this.$int=f,this.$isSafe=I},tp$str(){const e=E.nb$remainder(this.$int).toString();return new t(`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`)},$r(){const e=u(this.ob$type,t.$name),n=c(this.tp$str());return new t(`${e}(${n})`)},tp$hash(){return this.$int.tp$hash()},tp$richcompare(e,t){return e instanceof R?this.$int.tp$richcompare(e.$int,t):l},tp$as_number:!0,nb$int(){return this.$int}},getsets:{int:{$get(){return this.$int}},is_safe:{$get(){return this.$isSafe}},bytes:{$get(){return d(b,[this.$int,U,v])}},bytes_le:{$get(){const n=this.tp$getattr(new t("bytes")).valueOf();return new e(switchBytesBytesLe(n))}},fields:{$get:()=>notImplemented()},time_low:{$get:()=>notImplemented()},time_mid:{$get:()=>notImplemented()},time_hi_version:{$get:()=>notImplemented()},clock_seq_hi_variant:{$get:()=>notImplemented()},clock_seq_low:{$get:()=>notImplemented()},time:{$get:()=>notImplemented()},clock_seq:{$get:()=>notImplemented()},node:{$get:()=>notImplemented()},hex:{$get(){return E.nb$remainder(this.$int)}},urn:{$get(){return new t(`urn:uuid:${this}`)}},variant:{$get:()=>notImplemented()},version:{$get:()=>notImplemented()}}});return h("uuid",p,{uuid1:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid2:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid3:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid4:{$meth(){const t=new e(f.getRandomValues(new Uint8Array(16)));return d(R,[],["bytes",t,"version",I])},$flags:{NoArgs:!0}},uuid5:{$meth(){notImplemented()},$flags:{FastCall:!0}}}),p}',"src/lib/webbrowser.js":'var $builtinmodule=function(n){var e={},t="undefined"!=typeof window&&"undefined"!=typeof window.navigator;function open_tab(n){return Sk.builtin.pyCheckType("url","string",Sk.builtin.checkString(n)),t?(n=n.$jsstr(),window.open(n,"_blank"),Sk.builtin.bool.true$):Sk.builtin.bool.false$}return e.__name__=new Sk.builtin.str("webbrowser"),e.open=new Sk.builtin.func((function open(n){return Sk.builtin.pyCheckArgsLen("open",arguments.length+1,1,3),open_tab(n)})),e.open_new=new Sk.builtin.func((function open_new(n){return Sk.builtin.pyCheckArgsLen("open_new",arguments.length,1,1),open_tab(n)})),e.open_new_tab=new Sk.builtin.func((function open_new_tab(n){return Sk.builtin.pyCheckArgsLen("open_new_tab",arguments.length,1,1),open_tab(n)})),e.DefaultBrowser=Sk.misceval.buildClass(e,(function dflbrowser(n,e){e.__init__=new Sk.builtin.func((function __init__(n){return Sk.builtin.none.none$})),e.open=new Sk.builtin.func((function open(n,e){return Sk.builtin.pyCheckArgsLen("open",arguments.length,2,4),open_tab(e)})),e.open_new=new Sk.builtin.func((function open_new(n,e){return Sk.builtin.pyCheckArgsLen("open_new",arguments.length,2,2),open_tab(e)})),e.open_new_tab=new Sk.builtin.func((function open_new_tab(n,e){return Sk.builtin.pyCheckArgsLen("open_new_tab",arguments.length,2,2),open_tab(e)}))}),"DefaultBrowser",[]),e.get=new Sk.builtin.func((function get(){return Sk.builtin.pyCheckArgsLen("get",arguments.length,0,1),Sk.misceval.callsimArray(e.DefaultBrowser,[])})),e};',"src/lib/webgl/__init__.js":'var $builtinmodule=function(n){var t={__name__:new Sk.builtin.str("webgl")},makeFailHTML=function(n){return\'
    \'+n+"
    "},e=\'This page requires a browser that supports WebGL.
    Click here to upgrade your browser.\';return t.Context=Sk.misceval.buildClass(t,(function(n,t){t.__init__=new Sk.builtin.func((function(n,t){var i=document.getElementById(t.v),r=function(n,t){var i=document.getElementById(n);if(t||(t=i.getElementsByTagName("canvas")[0]),t){var r=function(n){for(var t=["webgl","experimental-webgl","webkit-3d","moz-webgl"],e=null,i=0;i7||7==a.Chrome[0]&&a.Chrome[1]>0||7==a.Chrome[0]&&0==a.Chrome[1]&&a.Chrome[2]>=521)?i.innerHTML=makeFailHTML(\'It doesn\\\'t appear your computer can support WebGL.
    Click here for more information.\'):i.innerHTML=makeFailHTML(e)}return r}i.innerHTML=makeFailHTML(e)}(t.v,i);if(!r)throw new Error("Your browser does not appear to support WebGL.");for(var u in n.gl=r,r.__proto__)if("number"==typeof r.__proto__[u])Sk.abstr.objectSetItem(n.$d,new Sk.builtin.str(u),r.__proto__[u]);else if("function"==typeof r.__proto__[u])switch(u){case"bufferData":case"clearColor":case"drawArrays":case"getAttribLocation":case"getUniformLocation":case"shaderSource":case"uniformMatrix4fv":case"vertexAttribPointer":case"viewport":break;default:!function(t){Sk.abstr.objectSetItem(n.$d,new Sk.builtin.str(u),new Sk.builtin.func((function(){return r.__proto__[t].apply(r,arguments)})))}(u)}r.clearColor(100/255,149/255,237/255,1),r.clear(r.COLOR_BUFFER_BIT)})),t.tp$getattr=Sk.generic.getAttr,t.bufferData=new Sk.builtin.func((function(n,t,e,i){n.gl.bufferData(t,e.v,i)})),t.clearColor=new Sk.builtin.func((function(n,t,e,i,r){n.gl.clearColor(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),Sk.builtin.asnum$(r))})),t.getAttribLocation=new Sk.builtin.func((function(n,t,e){return n.gl.getAttribLocation(t,e.v)})),t.getUniformLocation=new Sk.builtin.func((function(n,t,e){return n.gl.getUniformLocation(t,e.v)})),t.shaderSource=new Sk.builtin.func((function(n,t,e){n.gl.shaderSource(t,e.v)})),t.drawArrays=new Sk.builtin.func((function(n,t,e,i){n.gl.drawArrays(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i))})),t.vertexAttribPointer=new Sk.builtin.func((function(n,t,e,i,r,u,a){n.gl.vertexAttribPointer(t,Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),r,Sk.builtin.asnum$(u),Sk.builtin.asnum$(a))})),t.viewport=new Sk.builtin.func((function(n,t,e,i,r){n.gl.viewport(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),Sk.builtin.asnum$(r))})),t.uniformMatrix4fv=new Sk.builtin.func((function(n,t,e,i){n.gl.uniformMatrix4fv(Sk.builtin.asnum$(t),e,i.v)})),t.setDrawFunc=new Sk.builtin.func((function(n,t){var e=(new Date).getTime();setInterval((function(){Sk.misceval.callsimArray(t,[n,(new Date).getTime()-e])}),1e3/60)}))}),"Context",[]),t.Float32Array=Sk.misceval.buildClass(t,(function(n,t){t.__init__=new Sk.builtin.func((function(n,t){n.v="number"==typeof t?new Float32Array(t):new Float32Array(Sk.ffi.remapToJs(t))})),t.__repr__=new Sk.builtin.func((function(n){for(var t=[],e=0;e0&&(i=(l/=v)*l,a=(s/=v)*s,c=(m/=v)*m,u=l*s,r=s*m,f=m*l,o=l*_,k=s*_,S=m*_,y=1-w,(b=Sk.misceval.callsimArray(n.Mat44)).elements[0]=y*i+w,b.elements[1]=y*u-S,b.elements[2]=y*f+k,b.elements[3]=0,b.elements[4]=y*u+S,b.elements[5]=y*a+w,b.elements[6]=y*r-o,b.elements[7]=0,b.elements[8]=y*f-k,b.elements[9]=y*r+o,b.elements[10]=y*c+w,b.elements[11]=0,b.elements[12]=0,b.elements[13]=0,b.elements[14]=0,b.elements[15]=1,b=b.multiply(e),e.elements=b.elements);return e})),t.multiply=new Sk.builtin.func((function(e,t){for(var l=Sk.misceval.callsimArray(n.Mat44),s=0;s<4;s++)l.elements[4*s+0]=e.elements[4*s+0]*t.elements[0]+e.elements[4*s+1]*t.elements[4]+e.elements[4*s+2]*t.elements[8]+e.elements[4*s+3]*t.elements[12],l.elements[4*s+1]=e.elements[4*s+0]*t.elements[1]+e.elements[4*s+1]*t.elements[5]+e.elements[4*s+2]*t.elements[9]+e.elements[4*s+3]*t.elements[13],l.elements[4*s+2]=e.elements[4*s+0]*t.elements[2]+e.elements[4*s+1]*t.elements[6]+e.elements[4*s+2]*t.elements[10]+e.elements[4*s+3]*t.elements[14],l.elements[4*s+3]=e.elements[4*s+0]*t.elements[3]+e.elements[4*s+1]*t.elements[7]+e.elements[4*s+2]*t.elements[11]+e.elements[4*s+3]*t.elements[15];return e.elements=l.elements,e})),t.lookAt=new Sk.builtin.func((function(e,t,l,s,m,i,a,c,u,r){var f=[t-m,l-i,s-a],o=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);o&&(f[0]/=o,f[1]/=o,f[2]/=o);var k=[c,u,r],S=[];S[0]=k[1]*f[2]-k[2]*f[1],S[1]=-k[0]*f[2]+k[2]*f[0],S[2]=k[0]*f[1]-k[1]*f[0],k[0]=f[1]*S[2]-f[2]*S[1],k[1]=-f[0]*S[2]+f[2]*S[0],k[2]=f[0]*S[1]-f[1]*S[0],(o=Math.sqrt(S[0]*S[0]+S[1]*S[1]+S[2]*S[2]))&&(S[0]/=o,S[1]/=o,S[2]/=o),(o=Math.sqrt(k[0]*k[0]+k[1]*k[1]+k[2]*k[2]))&&(k[0]/=o,k[1]/=o,k[2]/=o);var y=Sk.misceval.callsimArray(n.Mat44);return y.elements[0]=S[0],y.elements[4]=S[1],y.elements[8]=S[2],y.elements[12]=0,y.elements[1]=k[0],y.elements[5]=k[1],y.elements[9]=k[2],y.elements[13]=0,y.elements[2]=f[0],y.elements[6]=f[1],y.elements[10]=f[2],y.elements[14]=0,y.elements[3]=0,y.elements[7]=0,y.elements[11]=0,y.elements[15]=1,y=y.multiply(e),e.elements=y.elements,e.translate(-t,-l,-s),e}))}),"Mat44",[]),n.Mat33=Sk.misceval.buildClass(n,(function(e,n){n.__init__=new Sk.builtin.func((function(e){Sk.misceval.callsimArray(n.loadIdentity,[e])})),n.loadIdentity=new Sk.builtin.func((function(e){e.elements=[1,0,0,0,1,0,0,0,1]}))}),"Mat33",[]),n.Vec3=Sk.misceval.buildClass(n,(function(e,t){t.__init__=new Sk.builtin.func((function(e,n,t,l){e.x=n,e.y=t,e.z=l})),t.__sub__=new Sk.builtin.func((function(e,t){return Sk.misceval.callsimArray(n.Vec3,[e.x-t.x,e.y-t.y,e.z-t.z])}))}),"Vec3",[]),n.cross=new Sk.builtin.func((function(e,t){return Sk.asserts.assert(e instanceof n.Vec3&&t instanceof n.Vec3),Sk.misceval.callsimArray(n.Vec3,[e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x])})),n};',"src/lib/webgl/matrix4.js":"var $builtinmodule=function(n){var r={},t=new Float32Array(3),a=new Float32Array(3),u=new Float32Array(3),e=(new Float32Array(4),new Float32Array(4),new Float32Array(4),new Float32Array(16),new Float32Array(16),new Float32Array(16),function(n,r){for(var t=0,a=r.length,u=0;u1e-5)for(u=0;u{const n=e.$d;var r={},Buffer=function(t,e){var r=e||n.ARRAY_BUFFER,i=n.createBuffer();if(this.target=r,this.buf=i,this.set(t),this.numComponents_=t.numComponents,this.numElements_=t.numElements,this.totalComponents_=this.numComponents_*this.numElements_,t.buffer instanceof Float32Array)this.type_=n.FLOAT;else if(t.buffer instanceof Uint8Array)this.type_=n.UNSIGNED_BYTE;else if(t.buffer instanceof Int8Array)this.type_=n._BYTE;else if(t.buffer instanceof Uint16Array)this.type_=n.UNSIGNED_SHORT;else{if(!(t.buffer instanceof Int16Array))throw"unhandled type:"+typeof t.buffer;this.type_=n.SHORT}};return Buffer.prototype.set=function(t){n.bindBuffer(this.target,this.buf),n.bufferData(this.target,t.buffer,n.STATIC_DRAW)},Buffer.prototype.type=function(){return this.type_},Buffer.prototype.numComponents=function(){return this.numComponents_},Buffer.prototype.numElements=function(){return this.numElements_},Buffer.prototype.totalComponents=function(){return this.totalComponents_},Buffer.prototype.buffer=function(){return this.buf},Buffer.prototype.stride=function(){return 0},Buffer.prototype.offset=function(){return 0},r.Model=Sk.misceval.buildClass(r,(function(e,r){r.__init__=new Sk.builtin.func((function(e,r,i,f){e.buffers={};var setBuffer=function(t,r){var i="indices"==t?n.ELEMENT_ARRAY_BUFFER:n.ARRAY_BUFFER;let f=e.buffers[t];f?f.set(r):f=new Buffer(r,i),e.buffers[t]=f};for(t in i)setBuffer(t,i[t]);var o={},s=0;for(var u in f)o[u]=s++;e.mode=n.TRIANGLES,e.textures=f.v,e.textureUnits=o,e.shader=r})),r.drawPrep=new Sk.builtin.func((function(t,e){var r=t.shader,i=t.buffers,f=t.textures;for(var o in e=Sk.ffi.remapToJs(e),Sk.misceval.callsimArray(r.use,[r]),i){var s=i[o];if("indices"==o)n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,s.buffer());else{var u=r.attrib[o];u&&u(s)}}for(var a in f){var m=t.textureUnits[a];r.setUniform$impl(r,f,m),f[a].bindToUnit(m)}for(var p in e)r.setUniform$impl(r,p,e[p])})),r.draw=new Sk.builtin.func((function(t,e,r){var i=t.shader;e=Sk.ffi.remapToJs(e);for(let n in e)i.setUniform$impl(i,n,e[n]);if(r)for(var f in r){var o=t.textureUnits[f];i.setUniform$impl(i,f,o),r[f].bindToUnit(o)}var s=t.buffers;n.drawElements(t.mode,s.indices.totalComponents(),n.UNSIGNED_SHORT,0)}))}),"Model",[]),r}))};',"src/lib/webgl/primitives.js":'var $builtinmodule=function(t){var n={},AttribBuffer=function(t,n,e){e=e||"Float32Array";var r=window[e];n.length?(this.buffer=new r(n),n=this.buffer.length/t,this.cursor=n):(this.buffer=new r(t*n),this.cursor=0),this.numComponents=t,this.numElements=n,this.type=e};return AttribBuffer.prototype.stride=function(){return 0},AttribBuffer.prototype.offset=function(){return 0},AttribBuffer.prototype.getElement=function(t){for(var n=t*this.numComponents,e=[],r=0;r{"use strict";__webpack_require__.d(__webpack_exports__,{A:()=>JSActiveCode});var _activecode_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(54215);class JSActiveCode extends _activecode_js__WEBPACK_IMPORTED_MODULE_0__.K{constructor(e){super(e)}outputfun(e){$(this.output).css("visibility","visible");var t="[";if("object"==typeof e&&e.length)for(var n=0;n"};this.saveCode=await this.manage_scrubber(saveCode),$(this.eContainer).remove(),$(this.output).text(""),$(this.outDiv).show({duration:700,queue:!1});try{eval(prog),this.errinfo="success"}catch(e){this.addErrorMessage(e),this.errinfo=e}}addErrorMessage(e){this.errLastRun=!0;var t=$("

    ").html("Error");this.eContainer=this.outerDiv.appendChild(document.createElement("div")),this.eContainer.setAttribute("aria-live","polite"),this.eContainer.setAttribute("aria-atomic","true"),this.eContainer.setAttribute("role","log"),this.eContainer.className="error alert alert-danger",this.eContainer.id=this.divid+"_errinfo",this.eContainer.appendChild(t[0]);var n=this.eContainer.appendChild(document.createElement("pre")),i=e.toString();setTimeout((()=>{n.innerHTML=i}),10),console.log("Runtime Error: "+e.toString())}}},30691:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});class i{constructor(e,t){const n="===============================================================================";let i,r,s,o=e.split(n);o.length>2?(i=o[0],r=o[1],s=o[2]):(i=o[0],r="",s=o[1]);let a="\n",l=i.split("\n").slice(2);a="Program output:\n";for(let e of l)a+=e+"\n";if(a+=n+"\n",""!=r.trim()){let e=r.split("\n");a+="Test messages:";for(let t of e)a+=t+"\n";a+=n+"\n"}let u=s.split("\n");a+="Test results:";for(let e of u)a+=e+"\n";a=a.trim(),this.stdout=a;let c=new RegExp("\\[doctest\\] assertions: (?\\d+?) \\| (?\\d+?) passed \\| (?\\d+?) failed","g"),d=[...s.matchAll(c)];if(d.length>0){let e=d[0];this.pct=100*e.groups.passed/e.groups.tests;let n=document.createElement("span");n.innerHTML=e[0].replace("[doctest] ",""),this.pctString=n,this.passed=parseInt(e.groups.passed),this.failed=parseInt(e.groups.failed);let i=document.createElement("div");i.classList.add("unittest-results");let r=document.createElement("table");r.classList.add("ac-feedback"),i.appendChild(r),i.setAttribute("id",`${t}_unit_results`);let s=document.createElement("tr");s.innerHTML=`Result${$.i18n("msg_activecode_assertions_checked")}Passed:Failed:`,r.appendChild(s);let o=document.createElement("tr"),a=document.createElement("td");a.classList.add("ac-feedback"),100==this.pct?(a.innerHTML=$.i18n("msg_activecode_passed"),a.classList.add("ac-feedback-pass")):(a.innerHTML=$.i18n("msg_activecode_failed"),a.classList.add("ac-feedback-fail")),o.appendChild(a),r.appendChild(o),a=document.createElement("td"),a.innerHTML=this.passed+this.failed,a.classList.add("ac-feedback"),o.appendChild(a),a=document.createElement("td"),a.innerHTML=this.passed,a.classList.add("ac-feedback"),o.appendChild(a),a=document.createElement("td"),a.innerHTML=this.failed,a.classList.add("ac-feedback"),o.appendChild(a),r.appendChild(o),this.table=i}}}},32756:()=>{$.i18n().load({"pt-br":{msg_activecode_load_history:"Carregar histórico",msg_activecode_audio_tour:"Tour de áudio",msg_activecode_loaded_code:"Código salvo carregado.",msg_activecode_no_saved_code:"Não há código salvo.",msg_activecode_run_code:"Executar",msg_activecode_show_feedback:"Exibir Feedbacks",msg_activecode_show_code:"Mostrar Código",msg_activecode_hide_code:"Ocultar Código",msg_activecode_show_codelens:"Mostrar CodeLens",msg_activecode_show_in_codelens:"Mostrar em CodeLens",msg_activecode_hide_codelens:"Ocultar Codelens",msg_activecode_reformat:"Reformatar",msg_activecode_parse_error:"Um erro de Parse significa que Python não entende a sintaxe da linha que a mensagem de erro aponta. Exemplos comuns são esquecer vírgulas entre argumentos ou esquecer ':' em um comando for.",msg_activecode_parse_error_fix:"Para corrigir um erro de Parse, você só precisa olhar cuidadosamente a linha com o erro e possivelmente a linha antes dela. Tenha certeza que estão de acordo com todas as regras de Python.",msg_activecode_type_error:"Erros de tipagem ocorrem mais frequentemente quando uma expressão tenta combinar dois objetos com tipos que não deveriam ser combinados. Como elevar uma String a uma potência.",msg_activecode_type_error_fix:"Para corrigir um erro de tipagem você provavelmente precisará percorrer seu código e ter certeza de que as variáveis possuem os tipos que você espera que elas tenham. Pode ser útil imprimir cada variável ao longo do caminho para checar se elas possuem o valor que você acha que deveriam ter.",msg_activecode_name_error:"Um erro de nome quase sempre significa que você usou uma variável antes dela ter um valor. Frequentemente isso pode ser um erro de digitação, então cheque a ortografia cuidadosamente.",msg_activecode_name_error_fix:"Cheque o lado direito das atribuições e suas chamadas de funções, são os lugares mais prováveis de encontrar um erro de nome.",msg_activecode_value_error:"Um erro de valor ocorre mais frequentemente quando uma função está esperando um tipo mas você passa um parâmetro de outro tipo.",msg_activecode_value_error_fix:"A mensagem de erro te dá uma boa dica sobre o nome da função e o valor incorreto. Leia atentamente a mensagem de erro e volte à variável que contém o valor problemático.",msg_activecode_attribute_error:"Essa mensagem de erro está te dizendo que o objeto do lado esquerdo do ponto não tem o atributo ou método do seu lado direito.",msg_activecode_attribute_error_fix:"A variante mais comum dessa mensagem é que o objeto indefinido não tem o atributo X. Isso diz que o objeto do lado esquerdo do ponto não é o que você pensa. Rastreie essa variável e imprima-a em vários lugares até descobrir onde ela se torna indefinida. Caso contrário, cheque se há erro de digitação no atributo do lado direito do ponto.",msg_activecode_token_error:"Na maioria das vezes este erro indica que você esqueceu de fechar um parênteses ou aspas.",msg_activecode_token_error_fix:"Cheque cada linha do seu programa e certifique-se de que todos os parênteses estão fechados.",msg_activecode_time_limit_error:"Seu programa está demorando muito. Os programas deste livro deveriam rodar em menos de 10 segundos. Isso provavelmente indica que seu programa está em um loop infinito.",msg_activecode_time_limit_error_fix:"Imprima mensagens em algumas linhas para descobrir se seu programa está em um loop infinito. Caso não esteja, você pode aumentar o tempo limite de execução com o comando sys.setExecutionLimit(ms)",msg_activecode_general_error:"Seu programa está demorando muito. Os programas deste livro deveriam rodar em menos de 30 segundos. Isso provavelmente indica que seu programa está em um loop infinito.",msg_activecode_general_error_fix:"Imprima mensagens em algumas linhas para descobrir se seu programa está em um loop infinito. Caso não esteja, você pode aumentar o tempo limite de execução com o comando sys.setExecutionLimit(ms)",msg_activecode_syntax_error:"Esta mensagem indica que Python não entendeu a sintaxe de um comando. Alguns exemplos são atribuição de um literal, ou uma chamada de função",msg_activecode_syntax_error_fix:"Cheque as atribuições de seu programa e certifique-se de que o lado esquerdo é uma variável, e não um literal ou função.",msg_activecode_key_error:"Esta mensagem indica que você está tentando acessar um elemento cuja chave não existe no dicionário.",msg_activecode_key_error_fix:"Você pode ter um erro de digitação no nome da sua chave. É uma boa prática checar se a chave existe usando um comando 'if (chave) in meu_dicionario'. Você também pode usar o comando 'meu_dicionario.get(chave, valorPadrão)' para obter o valor padrão ao invés de um erro caso a chave não exista.",msg_activecode_index_error:"Você está tentando acessar um índice além do final de uma string ou lista. Por exemplo, se sua lista possui 3 elementos nela e você tenta acessar o item na posição 3 ou mais.",msg_activecode_index_error_fix:"Lembre-se que o primeiro elemento de uma lista ou string está no índice 0, normalmente esta mensagem é exibida porque você errou o índice por 1. Em uma lista de tamanho 3, o último índice válido é 2",msg_activecode_uri_error:"",msg_activecode_uri_error_fix:"",msg_activecode_import_error:"Esta mensagem indica que você está tentando importar um módulo que não existe",msg_activecode_import_error_fix:"Um problema pode ser apenas um erro de digitação. Também pode ser que você está tentando importar um módulo que existe em Python 'real', mas não existe neste livro. Se este é o caso, por favor envie um pedido para ter esse módulo adicionado.",msg_activecode_reference_error:"Isso parece ser um erro interno, especialmente se a mensagem faz referência ao console.",msg_activecode_reference_error_fix:"Tente atualizar a página. Se o erro persistir, envie um relatório de bug junto com seu código",msg_activecode_zero_division_error:"Isso diz que você está tentando dividir por 0. Normalmente é porque o valor da variável no denominador de uma divisão tem o valor 0",msg_activecode_zero_division_error_fix:"Você pode proteger contra dividir por 0 com um comando 'if', ou você pode precisar reavaliar suas suposições sobre os valores das variáveis, pois um comando anterior pode ter inesperadamente atribuído o valor 0 a essa variável.",msg_activecode_range_error:"Esta mensagem quase sempre aparece na forma de 'Tamanho máximo da pilha de chamadas excedido'.",msg_activecode_range_error_fix:"Isso sempre ocorre quando uma função chama ela mesma. Provavelmente você não está fazendo isso de propósito, exceto no capítulo sobre recursão. Se você está nesse capítulo, então provavelmente ainda não identificou um bom caso base.",msg_activecode_internal_error:"Um erro interno pode significar que você desencadeou um bug no nosso Python",msg_activecode_internal_error_fix:"Reporte este erro como um bug, juntamente com seu código",msg_activecode_indentation_error:"Este erro ocorre quando você não indentou seu código devidamente. Isso é mais provável de ocorrer como parte de um comando if, for, while ou def.",msg_activecode_indentation_error_fix:"Cheque seus comandos if, def, for e while para ter certeza de que as linhas estão devidamente indentadas abaixo delas. Outra fonte deste erro é copiar e colar código em que você acidentalmente deixou restos de código que não pertencem mais ali.",msg_activecode_not_implemented_error:"Este erro ocorre quando você tenta usar uma função embutida de Python que não foi implementada nesta versão browser de Python.",msg_activecode_not_implemented_error_fix:"Por enquanto a única maneira de consertar isso é não usando a função. Podem haver soluções alternativas. Se você realmente precisa desta função embutida, envie-nos um relatório de bug e digac omo está tentando usar a função.",msg_activecode_file_not_found:"Arquivo não encontrado: '$1'",msg_activecode_no_file_or_dir:"[Erro nº 2] Arquivo ou diretório inexistente: '$1'",msg_activecode_starting:"Clique no botão de execução para começar $1",msg_activecode_playing:"Executando $1",msg_activecode_loading_audio:"Carregando áudio. Por favor, espere. Se o tour não começar logo, clique em 'Stop Tour' e tente novamente.",msg_activecode_pause_current_audio:"Pausar áudio atual",msg_activecode_pause_audio:"Pausar áudio",msg_activecode_play_paused_audio:"Reproduzir áudio pausado",msg_activecode_audio_paused:"$1 foi pausado. Clique no botão de execução para retomar o tour.",msg_activecode_input_prg:"Entrada para o programa",msg_activecode_were_compiling_err:"Houveram erros ao compilar seu código. Veja abaixo.",msg_activecode_time_limit_exc:"Limite de tempo excedido no seu programa",msg_activecode_server_err:"Um erro de servidor ocorreu",msg_activecode_compiling_running:"Compilando e executando seu código...",msg_activecode_server_comm_err:"Erro ao comunicar com o servidor.",msg_activecode_save_run:"Salvar & Executar",msg_activecode_render:"Salvar & Renderizar",msg_activecode_assertion_error:"Um erro de asserção ocorre quando python encontra um comando 'assert'. Python avalia a expressão do lado direito; se é verdadeira, o programa continua normalmente. Se é falsa, python gera um erro e para a execução.",msg_activecode_assertion_error_fix:"Cheque a expressão do lado direito de 'assert'. Essa expressão é falsa e é preciso verificar o motivo. Você pode querer imprimir cada parte da expressão e entender porque é falsa.",msg_activecode_load_db:"Carregando banco de dados..."}})},35358:(e,t,n)=>{var i={"./af":25177,"./af.js":25177,"./ar":61509,"./ar-dz":41488,"./ar-dz.js":41488,"./ar-kw":58676,"./ar-kw.js":58676,"./ar-ly":42353,"./ar-ly.js":42353,"./ar-ma":24496,"./ar-ma.js":24496,"./ar-sa":82682,"./ar-sa.js":82682,"./ar-tn":89756,"./ar-tn.js":89756,"./ar.js":61509,"./az":95533,"./az.js":95533,"./be":28959,"./be.js":28959,"./bg":47777,"./bg.js":47777,"./bm":54903,"./bm.js":54903,"./bn":61290,"./bn.js":61290,"./bo":31545,"./bo.js":31545,"./br":11470,"./br.js":11470,"./bs":44429,"./bs.js":44429,"./ca":7306,"./ca.js":7306,"./cs":56464,"./cs.js":56464,"./cv":73635,"./cv.js":73635,"./cy":64226,"./cy.js":64226,"./da":93601,"./da.js":93601,"./de":77853,"./de-at":26111,"./de-at.js":26111,"./de-ch":54697,"./de-ch.js":54697,"./de.js":77853,"./dv":60708,"./dv.js":60708,"./el":54691,"./el.js":54691,"./en-au":53872,"./en-au.js":53872,"./en-ca":28298,"./en-ca.js":28298,"./en-gb":56195,"./en-gb.js":56195,"./en-ie":66584,"./en-ie.js":66584,"./en-nz":79402,"./en-nz.js":79402,"./eo":32934,"./eo.js":32934,"./es":97650,"./es-do":20838,"./es-do.js":20838,"./es-us":56575,"./es-us.js":56575,"./es.js":97650,"./et":3035,"./et.js":3035,"./eu":3508,"./eu.js":3508,"./fa":119,"./fa.js":119,"./fi":90527,"./fi.js":90527,"./fo":52477,"./fo.js":52477,"./fr":85498,"./fr-ca":26435,"./fr-ca.js":26435,"./fr-ch":37892,"./fr-ch.js":37892,"./fr.js":85498,"./fy":37071,"./fy.js":37071,"./gd":70217,"./gd.js":70217,"./gl":77329,"./gl.js":77329,"./gom-latn":93383,"./gom-latn.js":93383,"./gu":95050,"./gu.js":95050,"./he":11713,"./he.js":11713,"./hi":43861,"./hi.js":43861,"./hr":26308,"./hr.js":26308,"./hu":90609,"./hu.js":90609,"./hy-am":17160,"./hy-am.js":17160,"./id":74063,"./id.js":74063,"./is":89374,"./is.js":89374,"./it":88383,"./it.js":88383,"./ja":23827,"./ja.js":23827,"./jv":89722,"./jv.js":89722,"./ka":41794,"./ka.js":41794,"./kk":27088,"./kk.js":27088,"./km":96870,"./km.js":96870,"./kn":84451,"./kn.js":84451,"./ko":63164,"./ko.js":63164,"./ky":78474,"./ky.js":78474,"./lb":79680,"./lb.js":79680,"./lo":15867,"./lo.js":15867,"./lt":45766,"./lt.js":45766,"./lv":69532,"./lv.js":69532,"./me":58076,"./me.js":58076,"./mi":41848,"./mi.js":41848,"./mk":30306,"./mk.js":30306,"./ml":73739,"./ml.js":73739,"./mr":86169,"./mr.js":86169,"./ms":73386,"./ms-my":92297,"./ms-my.js":92297,"./ms.js":73386,"./mt":77075,"./mt.js":77075,"./my":72264,"./my.js":72264,"./nb":22274,"./nb.js":22274,"./ne":8235,"./ne.js":8235,"./nl":92572,"./nl-be":43784,"./nl-be.js":43784,"./nl.js":92572,"./nn":54566,"./nn.js":54566,"./pa-in":29849,"./pa-in.js":29849,"./pl":94418,"./pl.js":94418,"./pt":79834,"./pt-br":48303,"./pt-br.js":48303,"./pt.js":79834,"./ro":24457,"./ro.js":24457,"./ru":82271,"./ru.js":82271,"./sd":1221,"./sd.js":1221,"./se":33478,"./se.js":33478,"./si":17538,"./si.js":17538,"./sk":5784,"./sk.js":5784,"./sl":46637,"./sl.js":46637,"./sq":86794,"./sq.js":86794,"./sr":45719,"./sr-cyrl":3322,"./sr-cyrl.js":3322,"./sr.js":45719,"./ss":56e3,"./ss.js":56e3,"./sv":41011,"./sv.js":41011,"./sw":40748,"./sw.js":40748,"./ta":11025,"./ta.js":11025,"./te":11885,"./te.js":11885,"./tet":28861,"./tet.js":28861,"./th":55802,"./th.js":55802,"./tl-ph":29231,"./tl-ph.js":29231,"./tlh":31052,"./tlh.js":31052,"./tr":85096,"./tr.js":85096,"./tzl":79846,"./tzl.js":79846,"./tzm":81765,"./tzm-latn":97711,"./tzm-latn.js":97711,"./tzm.js":81765,"./uk":16618,"./uk.js":16618,"./ur":57777,"./ur.js":57777,"./uz":57609,"./uz-latn":72475,"./uz-latn.js":72475,"./uz.js":57609,"./vi":21135,"./vi.js":21135,"./x-pseudo":64051,"./x-pseudo.js":64051,"./yo":82218,"./yo.js":82218,"./zh-cn":52648,"./zh-cn.js":52648,"./zh-hk":1632,"./zh-hk.js":1632,"./zh-tw":50304,"./zh-tw.js":50304};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=s,e.exports=r,r.id=35358},39234:()=>{},43337:()=>{jQuery.fn.highlight=function(e){function t(e,n){var i=0;if(3==e.nodeType){var r=e.data.toUpperCase().indexOf(n);if(r>=0){var s=document.createElement("span");s.className="highlight";var o=e.splitText(r),a=(o.splitText(n.length),o.cloneNode(!0));s.appendChild(a),o.parentNode.replaceChild(s,o),i=1}}else if(1==e.nodeType&&e.childNodes&&!/(script|style)/i.test(e.tagName))for(var l=0;l{},49494:function(e,t,n){(function(){"use strict";var e=e||{};e.scope={},e.ASSUME_ES5=!1,e.ASSUME_NO_NATIVE_MAP=!1,e.ASSUME_NO_NATIVE_SET=!1,e.SIMPLE_FROUND_POLYFILL=!1,e.ISOLATE_POLYFILLS=!1,e.FORCE_POLYFILL_PROMISE=!1,e.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1,e.defineProperty=e.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(e,t,n){return e==Array.prototype||e==Object.prototype||(e[t]=n.value),e},e.getGlobal=function(e){e=["object"==typeof globalThis&&globalThis,e,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof n.g&&n.g];for(var t=0;t(t=t||0)&&(t=Math.max(t+i,0));t\\|~\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC",So:"\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u166D\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B97-\\u2BFF\\u2CE5-\\u2CEA\\u2E50\\u2E51\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD",Zl:"\\u2028",Zp:"\\u2029",Zs:" \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000"}).C=e.Cc+e.Cf+e.Cs+e.Co+e.Cn,e.L=e.Lu+e.Ll+e.Lt+e.Lm+e.Mn+e.Lo,e.LC=e.Lu+e.Ll+e.Lt,e.M=e.Mn+e.Mc+e.Me,e.N=e.Nd+e.Nl+e.No,e.P=e.Pc+e.Pd+e.Ps+e.Pe+e.Pi+e.Pf+e.Po,e.S=e.Sm+e.Sc+e.Sk+e.So,e.Z=e.Zs+e.Zl+e.Zp,e.w="_"+e.L+e.N,e.b="(?:["+e.w+"](?:[^"+e.w+"]|$)|(?:^|[^"+e.w+"])["+e.w+"])",e.bOut="(?=[^"+e.w+"]|$)",e.bIn="(?:^|[^"+e.w+"])",e.bInCapture="(?:^|([^"+e.w+"]))",e.B="(?:["+e.w+"]["+e.w+"]|[^"+e.w+"][^"+e.w+"])",e.d=e.N,t.default=e},function(e,t,n){n(3),Sk.global.strftime=n(4),n(5),n(7),n(8),n(10),n(11),n(12),n(13),n(14),n(15),n(16),n(17),n(18),n(19),[Sk.builtin.object,Sk.builtin.type].forEach((e=>{Sk.abstr.setUpSlots(e),Sk.abstr.setUpMethods(e),Sk.abstr.setUpGetSets(e),Sk.abstr.setUpClassMethods(e)})),n(20),n(21),n(22),[Sk.builtin.str,Sk.builtin.none,Sk.builtin.NotImplemented,Sk.builtin.object].forEach((e=>{(e=e.prototype).__doc__=e.hasOwnProperty("tp$doc")?new Sk.builtin.str(e.tp$doc):Sk.builtin.none.none$})),n(23),n(24),n(25),n(26),n(27),n(28),n(29),n(30),n(32),n(33),n(34),n(35),n(36),n(37),n(38),n(39),n(40),n(41),n(42),n(43),n(44),n(45),n(46),n(47),n(48),n(49),n(50),n(51),n(52),n(53),n(54),n(55),n(56),n(57),n(58),n(59),n(60),n(61),n(62),n(63),n(64),n(65),n(66),n(67)},function(e,t,n){(function(e){var t={build:{githash:"0fe28593db57ef5bdfe04e372d61c5fb2b10d235",date:"2025-07-31T16:07:07.506Z"}};t.global=void 0!==e?e:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t.exportSymbol=function(e,n){e=e.split(".");var i,r=t.global;for(i=0;i=e||0===t||4<=t)return"th";switch(t){case 1:return"st";case 2:return"nd";case 3:return"rd"}}function o(e){"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}var a={de_DE:{identifier:"de-DE",days:"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag".split(" "),shortDays:"So Mo Di Mi Do Fr Sa".split(" "),months:"Januar Februar März April Mai Juni Juli August September Oktober November Dezember".split(" "),shortMonths:"Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d.%m.%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},en_CA:{identifier:"en-CA",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},en_US:{identifier:"en-US",days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),ordinalSuffixes:"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%m/%d/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}},es_MX:{identifier:"es-MX",days:"domingo lunes martes miércoles jueves viernes sábado".split(" "),shortDays:"dom lun mar mié jue vie sáb".split(" "),months:"enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre".split(" "),shortMonths:"ene feb mar abr may jun jul ago sep oct nov dic".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},fr_FR:{identifier:"fr-FR",days:"dimanche lundi mardi mercredi jeudi vendredi samedi".split(" "),shortDays:"dim. lun. mar. mer. jeu. ven. sam.".split(" "),months:"janvier février mars avril mai juin juillet août septembre octobre novembre décembre".split(" "),shortMonths:"janv. févr. mars avril mai juin juil. août sept. oct. nov. déc.".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},it_IT:{identifier:"it-IT",days:"domenica lunedì martedì mercoledì giovedì venerdì sabato".split(" "),shortDays:"dom lun mar mer gio ven sab".split(" "),months:"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre".split(" "),shortMonths:"gen feb mar apr mag giu lug ago set ott nov dic".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},nl_NL:{identifier:"nl-NL",days:"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag".split(" "),shortDays:"zo ma di wo do vr za".split(" "),months:"januari februari maart april mei juni juli augustus september oktober november december".split(" "),shortMonths:"jan feb mrt apr mei jun jul aug sep okt nov dec".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},pt_BR:{identifier:"pt-BR",days:"domingo segunda terça quarta quinta sexta sábado".split(" "),shortDays:"Dom Seg Ter Qua Qui Sex Sáb".split(" "),months:"janeiro fevereiro março abril maio junho julho agosto setembro outubro novembro dezembro".split(" "),shortMonths:"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},ru_RU:{identifier:"ru-RU",days:"Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" "),shortDays:"Вс Пн Вт Ср Чт Пт Сб".split(" "),months:"Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь".split(" "),shortMonths:"янв фев мар апр май июн июл авг сен окт ноя дек".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm",formats:{c:"%a %d %b %Y %X",D:"%d.%m.%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},tr_TR:{identifier:"tr-TR",days:"Pazar Pazartesi Salı Çarşamba Perşembe Cuma Cumartesi".split(" "),shortDays:"Paz Pzt Sal Çrş Prş Cum Cts".split(" "),months:"Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım Aralık".split(" "),shortMonths:"Oca Şub Mar Nis May Haz Tem Ağu Eyl Eki Kas Ara".split(" "),AM:"ÖÖ",PM:"ÖS",am:"ÖÖ",pm:"ÖS",formats:{c:"%a %d %b %Y %X %Z",D:"%d-%m-%Y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%T",x:"%D"}},zh_CN:{identifier:"zh-CN",days:"星期日 星期一 星期二 星期三 星期四 星期五 星期六".split(" "),shortDays:"日一二三四五六".split(""),months:"一月份 二月份 三月份 四月份 五月份 六月份 七月份 八月份 九月份 十月份 十一月份 十二月份".split(" "),shortMonths:"一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月".split(" "),AM:"上午",PM:"下午",am:"上午",pm:"下午",formats:{c:"%a %d %b %Y %X %Z",D:"%d/%m/%y",F:"%Y-%m-%d",R:"%H:%M",r:"%I:%M:%S %p",T:"%H:%M:%S",v:"%e-%b-%Y",X:"%r",x:"%D"}}},l=a.en_US,u=new function e(u,c,d){function f(e,a,l,u){for(var c="",d=null,h=!1,p=e.length,b=!1,g=0;ga.getHours()?l.am:l.pm;break;case 82:c+=f(l.formats.R,a,l,u);break;case 83:c+=t(a.getSeconds(),d);break;case 84:c+=f(l.formats.T,a,l,u);break;case 85:c+=t(r(a,"sunday"),d);break;case 87:c+=t(r(a,"monday"),d);break;case 88:c+=f(l.formats.X,a,l,u);break;case 89:c+=a.getFullYear();break;case 90:c+=_&&0===m?"GMT":(d=(d=(d=a).toString().match(/\(([\w\s]+)\)/))&&d[1])||"";break;case 97:c+=l.shortDays[a.getDay()];break;case 98:case 104:c+=l.shortMonths[a.getMonth()];break;case 99:c+=f(l.formats.c,a,l,u);break;case 100:c+=t(a.getDate(),d);break;case 101:c+=t(a.getDate(),null==d?" ":d);break;case 106:d=new Date(a.getFullYear(),0,1),c+=n(d=Math.ceil((a.getTime()-d.getTime())/864e5));break;case 107:c+=t(a.getHours(),null==d?" ":d);break;case 108:c+=t(i(a.getHours()),null==d?" ":d);break;case 109:c+=t(a.getMonth()+1,d);break;case 110:c+="\n";break;case 111:d=a.getDate(),c=l.ordinalSuffixes?c+(String(d)+(l.ordinalSuffixes[d-1]||s(d))):c+(String(d)+s(d));break;case 112:c+=12>a.getHours()?l.AM:l.PM;break;case 114:c+=f(l.formats.r,a,l,u);break;case 115:c+=Math.floor(u/1e3);break;case 116:c+="\t";break;case 117:c+=0===(d=a.getDay())?7:d;break;case 118:c+=f(l.formats.v,a,l,u);break;case 119:c+=a.getDay();break;case 120:c+=f(l.formats.x,a,l,u);break;case 121:c+=t(h=a.getFullYear()%100,d);break;case 122:_&&0===m?c+=b?"+00:00":"+0000":(d=0!==m?m/6e4:-a.getTimezoneOffset(),h=b?":":"",k=Math.abs(d%60),c+=(0>d?"-":"+")+t(Math.floor(Math.abs(d/60)))+h+t(k));break;default:h&&(c+="%"),c+=e[g]}d=null,h=!1}else 37===k?h=!0:c+=e[g]}return c}var h,p=u||l,m=c||0,_=d||!1,b=0,g=function(e,t){if(t){var n=t.getTime();if(_){var i=6e4*(t.getTimezoneOffset()||0);6e4*((t=new Date(n+i+m)).getTimezoneOffset()||0)!==i&&(t=6e4*(t.getTimezoneOffset()||0),t=new Date(n+t+m))}}else(n=Date.now())>b?(b=n,h=new Date(b),n=b,_&&(h=new Date(b+6e4*(h.getTimezoneOffset()||0)+m))):n=b,t=h;return f(e,t,p,n)};return g.localize=function(t){return new e(t||p,m,_)},g.localizeByIdentifier=function(e){var t=a[e];return t?g.localize(t):(o('[WARNING] No locale found with identifier "'+e+'".'),g)},g.timezone=function(t){var n=m,i=_,r=typeof t;return"number"!==r&&"string"!==r||(i=!0,"string"===r?n=(n="-"===t[0]?-1:1)*(60*(r=parseInt(t.slice(1,3),10))+(t=parseInt(t.slice(3,5),10)))*6e4:"number"===r&&(n=6e4*t)),new e(p,n,i)},g.utc=function(){return new e(p,m,!0)},g}(l,0,!1);void 0!==e?e.exports=u:(function(){return this||(0,eval)("this")}()).strftime=u,"function"!=typeof Date.now&&(Date.now=function(){return+new Date})}()},function(e,t,n){e=n(6);const i=Sk.global.JSBI=void 0!==Sk.global.BigInt?{}:e;void 0===Sk.global.BigInt?(i.__isBigInt||(i.__isBigInt=e=>e instanceof i),i.powermod=(e,t,n)=>{const r=i.BigInt(1);let s=r;for(t=i.greaterThan(t,i.__ZERO)?t:i.unaryMinus(t);i.greaterThan(t,i.__ZERO);)i.bitwiseAnd(t,r)&&(s=i.remainder(i.multiply(s,e),n)),t=i.signedRightShift(t,r),e=i.remainder(i.multiply(e,e),n);return s}):Object.assign(i,{BigInt:Sk.global.BigInt,toNumber:e=>Number(e),toString:e=>e.toString(),__isBigInt:e=>"bigint"==typeof e,unaryMinus:e=>-e,bitwiseNot:e=>~e,bitwiseAnd:(e,t)=>e&t,bitwiseOr:(e,t)=>e|t,bitwiseXor:(e,t)=>e^t,exponentiate:(e,t)=>{const n=i.BigInt(1);let r=n;for(t=t>i.__ZERO?t:-t;t>i.__ZERO;)t&n&&(r*=e),t>>=n,e*=e;return r},powermod:(e,t,n)=>{const r=i.BigInt(1);let s=r;for(t=t>i.__ZERO?t:-t;t>i.__ZERO;)t&r&&(s=s*e%n),t>>=r,e=e*e%n;return s},multiply:(e,t)=>e*t,divide:(e,t)=>e/t,remainder:(e,t)=>e%t,add:(e,t)=>e+t,subtract:(e,t)=>e-t,leftShift:(e,t)=>e<e>>t,unsignedRightShift:(e,t)=>e>>>t,lessThan:(e,t)=>ee<=t,greaterThan:(e,t)=>e>t,greaterThanOrEqual:(e,t)=>e>=t,equal:(e,t)=>e===t,notEqual:(e,t)=>e!==t}),i.__ZERO=i.BigInt(0),i.__MAX_SAFE=i.BigInt(Number.MAX_SAFE_INTEGER),i.__MIN_SAFE=i.BigInt(-Number.MAX_SAFE_INTEGER),i.numberIfSafe=e=>i.lessThan(e,i.__MAX_SAFE)&&i.greaterThan(e,i.__MIN_SAFE)?i.toNumber(e):e,i.BigUp=e=>i.__isBigInt(e)?e:i.BigInt(e)},function(e,t,n){e.exports=function(){var e=Math.imul,t=Math.clz32,n=Math.abs,i=Math.max,r=Math.floor;class s extends Array{constructor(e,t){if(super(e),this.sign=t,e>s.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded")}static BigInt(e){var t=Number.isFinite;if("number"==typeof e){if(0===e)return s.__zero();if(s.__isOneDigitInt(e))return 0>e?s.__oneDigit(-e,!0):s.__oneDigit(e,!1);if(!t(e)||r(e)!==e)throw new RangeError("The number "+e+" cannot be converted to BigInt because it is not an integer");return s.__fromDouble(e)}if("string"==typeof e){if(null===(t=s.__fromString(e)))throw new SyntaxError("Cannot convert "+e+" to a BigInt");return t}if("boolean"==typeof e)return!0===e?s.__oneDigit(1,!1):s.__zero();if("object"==typeof e)return e.constructor===s?e:(e=s.__toPrimitive(e),s.BigInt(e));throw new TypeError("Cannot convert "+e+" to a BigInt")}toDebugString(){const e=["BigInt["];for(const t of this)e.push((t?(t>>>0).toString(16):t)+", ");return e.push("]"),e.join("")}toString(e){if(2>(e=void 0===e?10:e)||36>>12;const l=a-12;for(t=12<=a?0:i<<20+a,a=20+a,0>>30-l,t=i<>>30-a,a-=30;return 1!==(i=s.__decideRounding(e,a,o,i))&&(0!==i||1&~t)||0!=(t=t+1>>>0)||!(0!=++r>>>20&&(r=0,1023<++n))?(e=e.sign?-2147483648:0,n=n+1023<<20,s.__kBitConversionInts[1]=e|n|r,s.__kBitConversionInts[0]=t,s.__kBitConversionDouble[0]):e.sign?-1/0:1/0}static unaryMinus(e){if(0===e.length)return e;const t=e.__copy();return t.sign=!e.sign,t}static bitwiseNot(e){return e.sign?s.__absoluteSubOne(e).__trim():s.__absoluteAddOne(e,!0)}static exponentiate(e,t){if(t.sign)throw new RangeError("Exponent must be positive");if(0===t.length)return s.__oneDigit(1,!1);if(0===e.length)return e;if(1===e.length&&1===e.__digit(0))return!e.sign||1&t.__digit(0)?e:s.unaryMinus(e);if(1=s.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===e.length&&2===e.__digit(0)){var n=1+(0|t/30);return(e=new s(n,e.sign&&!!(1&t))).__initializeDigits(),e.__setDigit(n-1,1<>=1;0!==t;t>>=1)i=s.multiply(i,i),1&t&&(n=null===n?i:s.multiply(n,i));return n}static multiply(e,t){if(0===e.length)return e;if(0===t.length)return t;var n=e.length+t.length;30<=e.__clzmsd()+t.__clzmsd()&&n--,(n=new s(n,e.sign!==t.sign)).__initializeDigits();for(let i=0;is.__absoluteCompare(e,t))return s.__zero();const n=e.sign!==t.sign,i=t.__unsignedDigit(0);if(1===t.length&&32767>=i){if(1===i)return n===e.sign?e:s.unaryMinus(e);e=s.__absoluteDivSmall(e,i,null)}else e=s.__absoluteDivLarge(e,t,!0,!1);return e.sign=n,e.__trim()}static remainder(e,t){if(0===t.length)throw new RangeError("Division by zero");if(0>s.__absoluteCompare(e,t))return e;const n=t.__unsignedDigit(0);return 1===t.length&&32767>=n?1===n||0===(t=s.__absoluteModSmall(e,n))?s.__zero():s.__oneDigit(t,e.sign):((t=s.__absoluteDivLarge(e,t,!1,!0)).sign=e.sign,t.__trim())}static add(e,t){const n=e.sign;return n===t.sign?s.__absoluteAdd(e,t,n):0<=s.__absoluteCompare(e,t)?s.__absoluteSub(e,t,n):s.__absoluteSub(t,e,!n)}static subtract(e,t){const n=e.sign;return n===t.sign?0<=s.__absoluteCompare(e,t)?s.__absoluteSub(e,t,n):s.__absoluteSub(t,e,!n):s.__absoluteAdd(e,t,n)}static leftShift(e,t){return 0===t.length||0===e.length?e:t.sign?s.__rightShiftByAbsolute(e,t):s.__leftShiftByAbsolute(e,t)}static signedRightShift(e,t){return 0===t.length||0===e.length?e:t.sign?s.__leftShiftByAbsolute(e,t):s.__rightShiftByAbsolute(e,t)}static unsignedRightShift(){throw new TypeError("BigInts have no unsigned right shift; use >> instead")}static lessThan(e,t){return 0>s.__compareToBigInt(e,t)}static lessThanOrEqual(e,t){return 0>=s.__compareToBigInt(e,t)}static greaterThan(e,t){return 0(e=r(e)))throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===e)return s.__zero();if(e>=s.__kMaxLengthBits)return t;const n=0|(e+29)/30;if(t.length(e=r(e)))throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===e)return s.__zero();if(t.sign){if(e>s.__kMaxLengthBits)throw new RangeError("BigInt too big");return s.__truncateAndSubFromPowerOfTwo(e,t,!1)}if(e>=s.__kMaxLengthBits)return t;const n=0|(e+29)/30;if(t.length>>i?s.__truncateToNBits(e,t):t}static ADD(e,t){if(e=s.__toPrimitive(e),t=s.__toPrimitive(t),"string"==typeof e)return"string"!=typeof t&&(t=t.toString()),e+t;if("string"==typeof t)return e.toString()+t;if(e=s.__toNumeric(e),t=s.__toNumeric(t),s.__isBigInt(e)&&s.__isBigInt(t))return s.add(e,t);if("number"==typeof e&&"number"==typeof t)return e+t;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions")}static LT(e,t){return s.__compare(e,t,0)}static LE(e,t){return s.__compare(e,t,1)}static GT(e,t){return s.__compare(e,t,2)}static GE(e,t){return s.__compare(e,t,3)}static EQ(e,t){for(;;){if(s.__isBigInt(e))return s.__isBigInt(t)?s.equal(e,t):s.EQ(t,e);if("number"==typeof e){if(s.__isBigInt(t))return s.__equalToNumber(t,e);if("object"!=typeof t)return e==t;t=s.__toPrimitive(t)}else if("string"==typeof e){if(s.__isBigInt(t))return null!==(e=s.__fromString(e))&&s.equal(e,t);if("object"!=typeof t)return e==t;t=s.__toPrimitive(t)}else if("boolean"==typeof e){if(s.__isBigInt(t))return s.__equalToNumber(t,+e);if("object"!=typeof t)return e==t;t=s.__toPrimitive(t)}else if("symbol"==typeof e){if(s.__isBigInt(t))return!1;if("object"!=typeof t)return e==t;t=s.__toPrimitive(t)}else{if("object"!=typeof e)return e==t;if("object"==typeof t&&t.constructor!==s)return e==t;e=s.__toPrimitive(e)}}}static NE(e,t){return!s.EQ(e,t)}static __zero(){return new s(0,!1)}static __oneDigit(e,t){return(t=new s(1,t)).__setDigit(0,e),t}__copy(){const e=new s(this.length,this.sign);for(let t=0;tt)t=-t-1;else{if(0===n)return-1;n--,i=e.__digit(n),t=29}if(!(i&(t=1<>>20)-1023,n=1+(0|t/30);e=new s(n,0>e);let i,r=1048575&s.__kBitConversionInts[1]|1048576,o=s.__kBitConversionInts[0];if(20>(t%=30)){var a=20-t;i=a+32,t=r>>>a,r=r<<32-a|o>>>a,o<<=32-a}else 20===t?(i=32,t=r,r=o):(i=32-(a=t-20),t=r<>>32-a,r=o<>>2,r=r<<30|o>>>2,o<<=30):t=0,e.__setDigit(n,t);return e.__trim()}static __isWhitespace(e){return!!(13>=e&&9<=e)||(159>=e?32==e:131071>=e?160==e||5760==e:196607>=e?10>=(e&=131071)||40==e||41==e||47==e||95==e||4096==e:65279==e)}static __fromString(e,t){t=void 0===t?0:t;let n=0;const i=e.length;let r=0;if(r===i)return s.__zero();let o=e.charCodeAt(r);for(;s.__isWhitespace(o);){if(++r===i)return s.__zero();o=e.charCodeAt(r)}if(43===o){if(++r===i)return null;o=e.charCodeAt(r),n=1}else if(45===o){if(++r===i)return null;o=e.charCodeAt(r),n=-1}if(0===t){if(t=10,48===o){if(++r===i)return s.__zero();if(o=e.charCodeAt(r),88===o||120===o){if(t=16,++r===i)return null;o=e.charCodeAt(r)}else if(79===o||111===o){if(t=8,++r===i)return null;o=e.charCodeAt(r)}else if(66===o||98===o){if(t=2,++r===i)return null;o=e.charCodeAt(r)}}}else if(16===t&&48===o){if(++r===i)return s.__zero();if(o=e.charCodeAt(r),88===o||120===o){if(++r===i)return null;o=e.charCodeAt(r)}}if(0!=n&&10!==t)return null;for(;48===o;){if(++r===i)return s.__zero();o=e.charCodeAt(r)}var a=i-r;let l=s.__kMaxBitsPerChar[t];var u=s.__kBitsPerCharTableMultiplier-1;if(a>1073741824/l)return null;a=new s(0|(29+(l*a+u>>>s.__kBitsPerCharTableShift))/30,!1);const c=10>t?t:10,d=10>>0>>0>>s.__kBitsPerCharTableShift)/30)}while(!f)}else{l>>=s.__kBitsPerCharTableShift,t=[];var f=[],h=!1;do{for(var p=0,m=0;;){if(o-48>>>0>>0>>l-s)}if(0!==r){if(i>=e.length)throw Error("implementation bug");e.__setDigit(i++,r)}for(;i>>1)+(85&i))>>>2)+(51&i))>>>4)+(15&i),--t;const r=e.__digit(n-1);var o=s.__clz30(r),a=0|(30*n-o+i-1)/i;if(e.sign&&a++,268435456>>(u=i-u),u=30-u;u>=i;)o[a--]=s.__kConversionChars[l&t],l>>>=i,u-=i}for(o[a--]=s.__kConversionChars[(l|r<>>i-u;0!==l;)o[a--]=s.__kConversionChars[l&t],l>>>=i;if(e.sign&&(o[a--]="-"),-1!=a)throw Error("implementation bug");return o.join("")}static __toStringGeneric(e,t,n){var i=e.length;if(0===i)return"";if(1===i)return t=e.__unsignedDigit(0).toString(t),!1===n&&e.sign&&(t="-"+t),t;var r=30*i-s.__clz30(e.__digit(i-1));i=s.__kMaxBitsPerChar[t]-1,i=1+(0|((r*=s.__kBitsPerCharTableMultiplier)+(i-1))/i)>>1;var o=(r=s.exponentiate(s.__oneDigit(t,!1),s.__oneDigit(i,!1))).__unsignedDigit(0);if(1===r.length&&32767>=o){(r=new s(e.length,!1)).__initializeDigits();var a=0;for(let t=2*e.length-1;0<=t;t--)a=a<<15|e.__halfDigit(t),r.__setHalfDigit(t,0|a/o),a=0|a%o;o=a.toString(t)}else r=(o=s.__absoluteDivLarge(e,r,!0,!0)).quotient,o=o.remainder.__trim(),o=s.__toStringGeneric(o,t,!0);for(r.__trim(),t=s.__toStringGeneric(r,t,!0);o.lengthe?s.__absoluteLess(n):0}static __compareToNumber(e,t){if(s.__isOneDigitInt(t)){const i=e.sign,r=0>t;if(i!==r)return s.__unequalSign(i);if(0===e.length){if(r)throw Error("implementation bug");return 0===t?0:-1}return 1t?s.__absoluteGreater(i):et)return s.__unequalSign(n);if(0===t)throw Error("implementation bug: should be handled elsewhere");if(0===e.length)return-1;if(s.__kBitConversionDouble[0]=t,2047==(t=2047&s.__kBitConversionInts[1]>>>20))throw Error("implementation bug: handled elsewhere");var i=t-1023;if(0>i)return s.__absoluteGreater(n);t=e.length;var r=e.__digit(t-1),o=s.__clz30(r),a=30*t-o;if(a<(i+=1))return s.__absoluteLess(n);if(a>i)return s.__absoluteGreater(n);i=1048576|1048575&s.__kBitConversionInts[1];let l=s.__kBitConversionInts[0];if((o=29-o)!=(0|(a-1)%30))throw Error("implementation bug");if(20>o){var u=20-o;o=u+32,a=i>>>u,i=i<<32-u|l>>>u,l<<=32-u}else 20===o?(o=32,a=i,i=l):(o=32-(u=o-20),a=i<>>32-u,i=l<>>=0)>(a>>>=0))return s.__absoluteGreater(n);if(r>>2,i=i<<30|l>>>2,l<<=30):a=0,(r=e.__unsignedDigit(t))>a)return s.__absoluteGreater(n);if(rt&&e.__unsignedDigit(0)===n(t):0===s.__compareToDouble(e,t)}static __comparisonResultToBool(e,t){return 0===t?0>e:1===t?0>=e:2===t?0t;case 3:return e>=t}if(s.__isBigInt(e)&&"string"==typeof t)return null!==(t=s.__fromString(t))&&s.__comparisonResultToBool(s.__compareToBigInt(e,t),n);if("string"==typeof e&&s.__isBigInt(t))return null!==(e=s.__fromString(e))&&s.__comparisonResultToBool(s.__compareToBigInt(e,t),n);if(e=s.__toNumeric(e),t=s.__toNumeric(t),s.__isBigInt(e)){if(s.__isBigInt(t))return s.__comparisonResultToBool(s.__compareToBigInt(e,t),n);if("number"!=typeof t)throw Error("implementation bug");return s.__comparisonResultToBool(s.__compareToNumber(e,t),n)}if("number"!=typeof e)throw Error("implementation bug");if(s.__isBigInt(t))return s.__comparisonResultToBool(s.__compareToNumber(t,e),2^n);if("number"!=typeof t)throw Error("implementation bug");return 0===n?et:3===n?e>=t:void 0}__clzmsd(){return s.__clz30(this.__digit(this.length-1))}static __absoluteAdd(e,t,n){if(e.length>>30,n.__setDigit(r,1073741823&s)}for(;r>>30,n.__setDigit(r,1073741823&t);return r>>30,n.__setDigit(r,1073741823&s)}for(;r>>30,n.__setDigit(r,1073741823&t);return n.__trim()}static __absoluteAddOne(e,t,n){n=void 0===n?null:n;const i=e.length;null===n?n=new s(i,t):n.sign=t,t=1;for(let r=0;r>>30,n.__setDigit(r,1073741823&i)}return 0!=t&&n.__setDigitGrow(i,1),n}static __absoluteSubOne(e,t){const n=e.length,i=new s(t=t||n,!1);let r=1;for(let t=0;t>>30,i.__setDigit(t,1073741823&n)}if(0!=r)throw Error("implementation bug");for(e=n;en?0:e.__unsignedDigit(n)>t.__unsignedDigit(n)?1:-1}static __multiplyAccumulate(e,t,n,i){if(0!==t){var r=32767&t,o=t>>>15,a=t=0;for(let d,f=0;f>>15;l=s.__imul(u,r),u=s.__imul(u,o);const h=s.__imul(c,r);d+=a+l+t,t=d>>>30,d&=1073741823,d+=((32767&u)<<15)+((32767&h)<<15),t+=d>>>30,a=(c=s.__imul(c,o))+(u>>>15)+(h>>>15),n.__setDigit(i,1073741823&d)}for(;0!=t||0!==a;i++)e=n.__digit(i),e+=t+a,a=0,t=e>>>30,n.__setDigit(i,1073741823&e)}}static __internalMultiplyAdd(e,t,n,i,r){let o=0;for(let u=0;u>>15,t)))<<15)+o+n)>>>30,o=a>>>15,r.__setDigit(u,1073741823&l)}if(r.length>i)for(r.__setDigit(i++,n+o);ithis.length&&(n=this.length);const i=32767&e;e>>>=15;let r=0;for(let u=0;u>>15;o=s.__imul(a,i),a=s.__imul(a,e);const n=s.__imul(l,i);r=(o=t+o+r)>>>30,o&=1073741823,r+=(o+=((32767&a)<<15)+((32767&n)<<15))>>>30,t=(l=s.__imul(l,e))+(a>>>15)+(n>>>15),this.__setDigit(u,1073741823&o)}if(0!=r||0!==t)throw Error("implementation bug")}static __absoluteDivSmall(e,t,n){null===(n=void 0===n?null:n)&&(n=new s(e.length,!1));let i=0;for(let r,s=2*e.length-1;0<=s;s-=2){r=(i<<15|e.__halfDigit(s))>>>0;const o=0|r/t;i=0|r%t,r=(i<<15|e.__halfDigit(s-1))>>>0;const a=0|r/t;i=0|r%t,n.__setDigit(s>>>1,o<<15|a)}return n}static __absoluteModSmall(e,t){let n=0;for(let i=2*e.length-1;0<=i;i--)n=0|((n<<15|e.__halfDigit(i))>>>0)%t;return n}static __absoluteDivLarge(e,t,n,i){const r=t.__halfDigitLength(),o=t.length;var a=e.__halfDigitLength()-r;let l=null;n&&(l=new s(a+2>>>1,!1),l.__initializeDigits());const u=new s(r+2>>>1,!1);u.__initializeDigits();const c=s.__clz15(t.__halfDigit(r-1));0>>0)/d,a=0|a%d;const n=t.__halfDigit(r-2),o=e.__halfDigit(c+r-2);for(;s.__imul(i,n)>>>0>(a<<16|o)>>>0&&(i--,!(32767<(a+=d))););}s.__internalMultiplyAdd(t,i,0,o,u),0!==(a=e.__inplaceSub(u,c,r+1))&&(a=e.__inplaceAdd(t,c,r),e.__setHalfDigit(c+r,32767&e.__halfDigit(c+r)+a),i--),n&&(1&c?f=i<<15:l.__setDigit(c>>>1,f|i))}if(i)return e.__inplaceRightShift(c),n?{quotient:l,remainder:e}:e;if(n)return l;throw Error("unreachable")}static __clz15(e){return s.__clz30(e)-15}__inplaceAdd(e,t,n){let i=0;for(let r=0;r>>15,this.__setHalfDigit(t+r,32767&n)}return i}__inplaceSub(e,t,n){let i=0;if(1&t){t>>=1;for(var r=this.__digit(t),s=32767&r,o=0;o>>1;o++){var a=e.__digit(o);i=1&(r=(r>>>15)-(32767&a)-i)>>>15,this.__setDigit(t+o,(32767&r)<<15|32767&s),i=1&(s=(32767&(r=this.__digit(t+o+1)))-(a>>>15)-i)>>>15}const l=(r>>>15)-(32767&(a=e.__digit(o)))-i;if(i=1&l>>>15,this.__setDigit(t+o,(32767&l)<<15|32767&s),t+o+1>=this.length)throw new RangeError("out of bounds");!(1&n)&&(i=1&(s=(32767&(r=this.__digit(t+o+1)))-(a>>>15)-i)>>>15,this.__setDigit(t+e.length,1073709056&r|32767&s))}else{for(t>>=1,s=0;s>>15,i=1&(r=(r>>>15)-(a>>>15)-i)>>>15,this.__setDigit(t+s,(32767&r)<<15|32767&o);i=1&(r=(32767&(o=this.__digit(t+s)))-(32767&(e=e.__digit(s)))-i)>>>15,a=0,!(1&n)&&(i=1&(a=(o>>>15)-(e>>>15)-i)>>>15),this.__setDigit(t+s,(32767&a)<<15|32767&r)}return i}__inplaceRightShift(e){if(0!==e){var t=this.__digit(0)>>>e,n=this.length-1;for(let i=0;i>>e}this.__setDigit(n,t)}}static __specialLeftShift(e,t,n){const i=e.length,r=new s(i+n,!1);if(0===t){for(t=0;t>>30-t}return 0n)throw new RangeError("BigInt too big");t=0|n/30;var i=n%30;const r=e.length,o=0!==i&&0!=e.__digit(r-1)>>>30-i;var a=r+t+(o?1:0);if(n=new s(a,e.sign),0===i){for(i=0;i>>30-i}if(o)n.__setDigit(r+t,a);else if(0!==a)throw Error("implementation bug")}return n.__trim()}static __rightShiftByAbsolute(e,t){var n=e.length,i=e.sign,r=s.__toShiftAmount(t);if(0>r)return s.__rightShiftByMaximum(i);var o=r%30,a=n-(t=0|r/30);if(0>=a)return s.__rightShiftByMaximum(i);if(r=!1,i)if(e.__digit(t)&(1<>>o,n=n-t-1,l=0;l>>o}i.__setDigit(n,a)}return r&&(i=s.__absoluteAddOne(i,!0,i)),i.__trim()}static __rightShiftByMaximum(e){return e?s.__oneDigit(1,!0):s.__zero()}static __toShiftAmount(e){return 1s.__kMaxLengthBits?-1:e}static __toPrimitive(e,t){if(t=void 0===t?"default":t,"object"!=typeof e||e.constructor===s)return e;if("undefined"!=typeof Symbol&&"symbol"==typeof Symbol.toPrimitive){const n=e[Symbol.toPrimitive];if(n){if("object"!=typeof(e=n(t)))return e;throw new TypeError("Cannot convert object to primitive value")}}if((t=e.valueOf)&&"object"!=typeof(t=t.call(e)))return t;if((t=e.toString)&&"object"!=typeof(e=t.call(e)))return e;throw new TypeError("Cannot convert object to primitive value")}static __toNumeric(e){return s.__isBigInt(e)?e:+e}static __isBigInt(e){return"object"==typeof e&&null!==e&&e.constructor===s}static __truncateToNBits(e,t){var n=0|(e+29)/30;const i=new s(n,t.sign);--n;for(let e=0;e>>e),i.__setDigit(n,t),i.__trim()}static __truncateAndSubFromPowerOfTwo(e,t,n){var i=Math.min,r=0|(e+29)/30;n=new s(r,n);let o=0;var a=0;for(i=i(--r,t.length);o>>30,n.__setDigit(o,1073741823&e)}for(;o>>e,a=(e=1<<32-e)-t-a,a&=e-1),n.__setDigit(r,a),n.__trim()}__digit(e){return this[e]}__unsignedDigit(e){return this[e]>>>0}__setDigit(e,t){this[e]=0|t}__setDigitGrow(e,t){this[e]=0|t}__halfDigitLength(){const e=this.length;return 32767>=this.__unsignedDigit(e-1)?2*e-1:2*e}__halfDigit(e){return 32767&this[e>>>1]>>>15*(1&e)}__setHalfDigit(e,t){const n=e>>>1,i=this.__digit(n);this.__setDigit(n,1&e?32767&i|t<<15:1073709056&i|32767&t)}static __digitPow(e,t){let n=1;for(;0>>=1,e*=e;return n}static __isOneDigitInt(e){return(1073741823&e)===e}}return s.__kMaxLength=33554432,s.__kMaxLengthBits=s.__kMaxLength<<5,s.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],s.__kBitsPerCharTableShift=5,s.__kBitsPerCharTableMultiplier=1<>>0)/t)},s.__imul=e||function(e,t){return 0|e*t},s}()},function(e,t){[..."abc"].flat(),"a".matchAll(/a/g)},function(e,t,n){(function(e,t){!function(e){function n(e){delete o[e]}function i(e){if(a)setTimeout(i,0,e);else{var t=o[e];if(t){a=!0;try{var r=t.callback,s=t.args;switch(s.length){case 0:r();break;case 1:r(s[0]);break;case 2:r(s[0],s[1]);break;case 3:r(s[0],s[1],s[2]);break;default:r.apply(void 0,s)}}finally{n(e),a=!1}}}}if(!e.setImmediate){var r,s=1,o={},a=!1,l=e.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(e);u=u&&u.setTimeout?u:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick((function(){i(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?(c="setImmediate$"+Math.random()+"$",d=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(c)&&i(+t.data.slice(c.length))},e.addEventListener?e.addEventListener("message",d,!1):e.attachEvent("onmessage",d),r=function(t){e.postMessage(c+t,"*")}):e.MessageChannel?function(){var e=new MessageChannel;e.port1.onmessage=function(e){i(e.data)},r=function(t){e.port2.postMessage(t)}}():l&&"onreadystatechange"in l.createElement("script")?function(){var e=l.documentElement;r=function(t){var n=l.createElement("script");n.onreadystatechange=function(){i(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}():r=function(e){setTimeout(i,0,e)},u.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=Array(arguments.length-1),n=0;n the object's type\ntype(name, bases, dict) -> a new type",tp$call:function(e,t){if(this===Sk.builtin.type){if(1===e.length&&(void 0===t||!t.length))return e[0].ob$type;if(3!==e.length)throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments")}let n=this.prototype.tp$new(e,t);if(n.$isSuspension)return Sk.misceval.chain(n,(i=>{if(n=i,n.ob$type.$isSubType(this))return n.tp$init(e,t)}),(()=>n));if(n.ob$type.$isSubType(this)){const i=n.tp$init(e,t);return void 0!==i&&i.$isSuspension?Sk.misceval.chain(i,(()=>n)):n}return n},tp$new:function(e,t){if(3!==e.length){if(1===e.length&&(void 0===t||!t.length))return e[0].ob$type;throw new Sk.builtin.TypeError("type() takes 1 or 3 arguments")}const s=e[0];var o=e[1];const l=e[2];if("dict"!==l.tp$name)throw new Sk.builtin.TypeError("type() argument 3 must be dict, not "+Sk.abstr.typeName(l));if(!Sk.builtin.checkString(s))throw new Sk.builtin.TypeError("type() argument 1 must be str, not "+Sk.abstr.typeName(s));if("tuple"!==o.tp$name)throw new Sk.builtin.TypeError("type() argument 2 must be tuple, not "+Sk.abstr.typeName(o));o=o.sk$asarray(),function(e,t,n,s){const o=function(e){function t(e){return e.sk$solidBase||e.sk$solidSlotBase?e:t(e.prototype.tp$base)}let n,i,r,s;0===e.length&&e.push(Sk.builtin.object);for(let o=0;o{if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__slots__ items must be strings, not '"+Sk.abstr.typeName(e)+"'");if(!e.$isIdentifier())throw new Sk.builtin.TypeError("__slots__ must be identifiers");if("__dict__"===e.v){if(f)throw new Sk.builtin.TypeError("__dict__ slot disallowed: we already got one");d=!0}else c.add(Sk.mangleName(s,e).v)})),function(e,t){const n=t.prototype,i=n.sk$nslots||0;Object.defineProperty(n,"sk$nslots",{value:i+e.length,writable:!0}),e.length&&Object.defineProperty(t,"sk$solidSlotBase",{value:!0,writable:!0}),e.forEach(((e,r)=>{r+=i;const s=Sk.builtin.str.$fixReserved(e);n[s]=new Sk.builtin.getset_descriptor(t,{$get(){const t=this.$s[r];if(void 0===t)throw new Sk.builtin.AttributeError(e);return t},$set(e){this.$s[r]=e}})}))}(o=[...c].sort(((e,t)=>e.localeCompare(t))),e)),d&&!f&&(u.__dict__=new Sk.builtin.getset_descriptor(e,a),f=!0),Object.defineProperties(u,{ht$slots:{value:o||null,writable:!0},sk$hasDict:{value:f,writable:!0}}),l.$items().forEach((e=>{var[t,n]=e;if(Sk.builtin.checkString(t)){if(c&&c.has(t.v))throw new Sk.builtin.ValueError("'"+t.toString()+"' in __slots__ conflicts with class variable");u[t.$mangled]=n}})),u.hasOwnProperty("__qualname__")){if(o=u.__qualname__,!Sk.builtin.checkString(o))throw new Sk.builtin.TypeError("type __qualname__ must be a str, not '"+Sk.abstr.typeName(o)+"'");u.ht$qualname=o}return n(o=e.prototype,"__init_subclass__","classmethod"),n(o,"__new__","staticmethod"),n(o,"__class_getitem__","classmethod"),e.$allocateSlots(),function(e){const t=e.prototype;Object.keys(t).forEach((n=>{const i=Sk.abstr.lookupSpecial(t[n],Sk.builtin.str.$setname);if(void 0!==i){const r=Sk.unfixReserved(n);try{Sk.misceval.callsimArray(i,[e,new Sk.builtin.str(r)])}catch(i){throw(n=new Sk.builtin.RuntimeError("Error calling __set_name__ on '"+Sk.abstr.typeName(t[n])+"' instance '"+r+"' in '"+e.prototype.tp$name+"'")).$cause=i,n}}}))}(e),function(e,t){e=new Sk.builtin.super_(e,e).tp$getattr(Sk.builtin.str.$initsubclass),Sk.misceval.callsimArray(e,[],t)}(e,t),e},tp$init:function(e,t){if(e&&1==e.length&&t&&t.length)throw new Sk.builtin.TypeError("type.__init__() takes no keyword arguments");if(3!=e.length&&1!=e.length)throw new Sk.builtin.TypeError("type.__init__() takes 1 or 3 arguments");return Sk.builtin.object.prototype.tp$init.call(this,[])},tp$getattr:function(e,t){var n=this.ob$type;const i=n.$typeLookup(e);let r;return void 0!==i&&(r=i.tp$descr_get,void 0!==r&&void 0!==i.tp$descr_set)?r.call(i,this,n,t):void 0!==(e=this.$typeLookup(e))?void 0!==(n=e.tp$descr_get)?t=n.call(e,null,this,t):e:void 0!==r?r.call(i,this,n,t):void 0!==i?i:void 0},tp$setattr:function(e,t,n){if(!this.sk$klass){if(void 0!==t)throw new Sk.builtin.TypeError("can't set attributes of built-in/extension type '"+this.prototype.tp$name+"'");throw new Sk.builtin.TypeError("can't delete attributes on type object '"+this.prototype.tp$name+"'")}const i=this.ob$type.$typeLookup(e);if(void 0!==i){const e=i.tp$descr_set;if(e)return e.call(i,this,t,n)}if(n=e.$mangled,void 0===t){if(!(t=this.prototype).hasOwnProperty(n))throw new Sk.builtin.AttributeError("type object '"+this.prototype.tp$name+"' has no attribute '"+e.$jsstr()+"'");delete t[n],void 0!==(e=Sk.dunderToSkulpt[n])&&(delete this.prototype[e],t.sk$prototypical||this.$allocateGetterSlot(n))}else this.prototype[n]=t,n in Sk.dunderToSkulpt&&this.$allocateSlot(n,t)},$r:function(){let e=this.prototype.__module__,t="",n="class";return e&&Sk.builtin.checkString(e)?t=e.v+".":e=null,e||this.sk$klass||Sk.__future__.class_repr||(n="type"),new Sk.builtin.str("<"+n+" '"+t+this.prototype.tp$name+"'>")}},writable:!0},tp$methods:{value:null,writable:!0},tp$classmethods:{value:null,writable:!0},tp$getsets:{value:null,writable:!0},sk$type:{value:!0},$isSubType:{value:function(e){return this===e||this.prototype instanceof e||!this.prototype.sk$prototypical&&this.prototype.tp$mro.includes(e)}},$allocateSlot:{value:function(e,t){const n=(e=Sk.slots[e]).$slot_name,i=this.prototype;i.hasOwnProperty(n)&&delete i[n],Object.defineProperty(i,n,{value:e.$slot_func(t),writable:!0,configurable:!0})}},$allocateSlots:{value:function(){const e=this.prototype;this.prototype.sk$prototypical?Object.keys(e).forEach((t=>{t in Sk.slots&&this.$allocateSlot(t,e[t])})):Object.keys(Sk.slots).forEach((t=>{e.hasOwnProperty(t)?this.$allocateSlot(t,e[t]):this.$allocateGetterSlot(t)})),e.hasOwnProperty("__eq__")&&!e.hasOwnProperty("__hash__")&&(e.tp$hash=e.__hash__=Sk.builtin.none.none$)}},$allocateGetterSlot:{value:function(e){const t=Sk.slots[e].$slot_name,n=this.prototype;n.hasOwnProperty(t)||Object.defineProperty(n,t,{configurable:!0,get(){const e=n.tp$mro;for(let n=1;nnew Sk.builtin.dict([]),$flags:{FastCall:!0}}};const a={$get(){const e=s(this.ob$type);return void 0!==e?e.tp$descr_get(this,this.ob$type):Sk.generic.getSetDict.$get.call(this)},$set(e){const t=s(this.ob$type);return void 0!==t?t.tp$descr_set(this,e):void 0!==e?Sk.generic.getSetDict.$set.call(this,e):void(this.$d=new Sk.builtin.dict([]))},$doc:"dictionary for instance variables (if defined)",$name:"__dict__"}},function(e,t){Sk.generic={},Sk.generic.getAttr=function(e,t){let n;const i=this.ob$type,r=i.$typeLookup(e);if(void 0!==r&&(n=r.tp$descr_get,void 0!==n&&void 0!==r.tp$descr_set))return n.call(r,this,i,t);const s=this.$d;return void 0!==s&&void 0!==(e=s.quick$lookup(e))?e:void 0!==n?n.call(r,this,i,t):void 0!==r?r:void 0},Sk.exportSymbol("Sk.generic.getAttr",Sk.generic.getAttr),Sk.generic.setAttr=function(e,t,n){var i=this.ob$type.$typeLookup(e);if(null!=i){const e=i.tp$descr_set;if(e)return e.call(i,this,t,n)}if(null!=(n=this.$d)){if(n.dict$setItem){if(void 0!==t)return n.dict$setItem(e,t);if(n.dict$delItem(e))throw new Sk.builtin.AttributeError("'"+Sk.abstr.typeName(this)+"' object has no attribute '"+e.$jsstr()+"'");return}if("object"==typeof n&&!n.sk$object){if(i=e.$mangled,void 0!==t)return void(n[i]=t);if(void 0!==n[i])return void delete n[i]}}throw new Sk.builtin.AttributeError(this.sk$attrError()+" has no attribute '"+e.$jsstr()+"'")},Sk.exportSymbol("Sk.generic.setAttr",Sk.generic.setAttr),Sk.generic.new=function(e){return function(t,n){return this.constructor===e?new this.constructor:(t=new this.constructor,e.call(t),t)}},Sk.generic.newMethodDef={$meth(e,t){const n=this.prototype;if(1>e.length)throw e=n.tp$name,new Sk.builtin.TypeError(e+".__new__(): not enough arguments");var i=e.shift();if(void 0===i.sk$type)throw e=n.tp$name,new Sk.builtin.TypeError(e+"__new__(X): X is not a type object ("+Sk.abstr.typeName(i)+")");if(!i.$isSubType(this))throw e=n.tp$name,i=i.prototype.tp$name,new Sk.builtin.TypeError(e+".__new__("+i+"): "+i+" is not a subtype of "+e);const r=i.prototype.sk$staticNew.prototype;if(r.tp$new!==n.tp$new)throw e=n.tp$name,i=i.prototype.tp$name,new Sk.builtin.TypeError(e+".__new__("+i+") is not safe, use "+r.tp$name+".__new__()");return n.tp$new.call(i.prototype,e,t)},$flags:{FastCall:!0},$textsig:"($type, *args, **kwargs)",$name:"__new__"},Sk.generic.selfIter=function(){return this},Sk.generic.iterNextWithArrayCheckSize=function(){if(this.$seq.length!==this.$orig.get$size()){const e=this.tp$name.split("_")[0];throw new Sk.builtin.RuntimeError(e+" changed size during iteration")}if(!(this.$index>=this.$seq.length))return this.$seq[this.$index++]},Sk.generic.iterNextWithArray=function(){const e=this.$seq[this.$index++];return void 0===e&&(this.tp$iternext=()=>{}),e},Sk.generic.iterLengthHintWithArrayMethodDef={$meth:function(){return new Sk.builtin.int_(this.$seq.length-this.$index)},$flags:{NoArgs:!0}},Sk.generic.iterReverseLengthHintMethodDef={$meth:function(){return new Sk.builtin.int_(this.$index)},$flags:{NoArgs:!0}},Sk.generic.getSetDict={$get(){return this.$d},$set(e){if(void 0===e)throw new Sk.builtin.TypeError("cannot delete __dict__");if(!(e instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError("__dict__ must be set to a dictionary, not a '"+Sk.abstr.typeName(e)+"'");this.$d=e},$doc:"dictionary for instance variables (if defined)",$name:"__dict__"},Sk.generic.seqCompare=function(e,t){if(this===e&&Sk.misceval.opAllowsEquality(t))return!0;if(!(e instanceof this.sk$builtinBase))return Sk.builtin.NotImplemented.NotImplemented$;const n=this.v;let i;if(e=e.v,n.length!==e.length&&("Eq"===t||"NotEq"===t))return"Eq"!==t;for(i=0;i=r||i>=s)switch(t){case"Lt":return rs;case"GtE":return r>=s;default:Sk.asserts.fail()}return"Eq"!==t&&("NotEq"===t||Sk.misceval.richCompareBool(n[i],e[i],t))},Sk.generic.classGetItem={__class_getitem__:{$meth(e){return new Sk.builtin.GenericAlias(this,e)},$flags:{OneArg:!0}}}},function(e,t){Sk.builtin.pyCheckArgs=function(e,t,n,i,r,s){if(t=t.length,void 0===i&&(i=1/0),r&&--t,s&&--t,ti)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":ti)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":t"};const s={Add:"+",Sub:"-",Mult:"*",MatMult:"@",Div:"/",FloorDiv:"//",Mod:"%",DivMod:"divmod()",Pow:"** or pow()",LShift:"<<",RShift:">>",BitAnd:"&",BitXor:"^",BitOr:"|"},o={UAdd:"+",USub:"-",Invert:"~"};Sk.abstr.numberBinOp=function(e,t,n){var r;if(!(r=i(e,t,n)))throw e=Sk.abstr.typeName(e),t=Sk.abstr.typeName(t),new Sk.builtin.TypeError("unsupported operand type(s) for "+s[n]+": '"+e+"' and '"+t+"'");return r},Sk.exportSymbol("Sk.abstr.numberBinOp",Sk.abstr.numberBinOp),Sk.abstr.numberInplaceBinOp=function(e,t,n){var i;if(!(i=r(e,t,n)))throw e=Sk.abstr.typeName(e),t=Sk.abstr.typeName(t),new Sk.builtin.TypeError("unsupported operand type(s) for "+s[n]+"=: '"+e+"' and '"+t+"'");return i},Sk.exportSymbol("Sk.abstr.numberInplaceBinOp",Sk.abstr.numberInplaceBinOp),Sk.abstr.numberUnaryOp=function(e,t){if("Not"===t)return Sk.misceval.isTrue(e)?Sk.builtin.bool.false$:Sk.builtin.bool.true$;e:{switch(t){case"USub":var n=e.nb$negative;break e;case"UAdd":n=e.nb$positive;break e;case"Invert":n=e.nb$invert;break e}n=void 0}if(!(n=void 0!==n?n.call(e):void 0))throw e=Sk.abstr.typeName(e),new Sk.builtin.TypeError("bad operand type for unary "+o[t]+": '"+e+"'");return n},Sk.exportSymbol("Sk.abstr.numberUnaryOp",Sk.abstr.numberUnaryOp),Sk.abstr.fixSeqIndex_=function(e,t){return 0>(t=Sk.builtin.asnum$(t))&&e.sq$length&&(t+=e.sq$length()),t},Sk.abstr.sequenceContains=function(e,t,n){return e.sq$contains?e.sq$contains(t,n):(e=Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){return!(e!==t&&!Sk.misceval.richCompareBool(e,t,"Eq"))&&new Sk.misceval.Break(!0)}),!1),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e))},Sk.abstr.sequenceConcat=function(e,t){if(e.sq$concat)return e.sq$concat(t);if(Sk.builtin.checkSequence(e)&&Sk.builtin.checkSequence(t)&&void 0!==(t=i(e,t,"Add")))return t;throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object can't be concatenated")},Sk.abstr.sequenceInPlaceConcat=function(e,t){if(e.sq$inplace_concat)return e.sq$inplace_concat(t);if(e.sq$concat)return e.sq$concat(t);if(Sk.builtin.checkSequence(e)&&Sk.builtin.checkSequence(t)&&void 0!==(t=r(e,t,"Add")))return t;throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object can't be concatenated")},Sk.abstr.sequenceGetIndexOf=function(e,t){if(e.index)return Sk.misceval.callsimArray(e.index,[e,t]);let n=0;for(let i=Sk.abstr.iter(e),r=i.tp$iternext();void 0!==r;r=i.tp$iternext()){if(Sk.misceval.richCompareBool(t,r,"Eq"))return new Sk.builtin.int_(n);n+=1}throw new Sk.builtin.ValueError("sequence.index(x): x not in sequence")},Sk.abstr.sequenceGetCountOf=function(e,t){if(e.count)return Sk.misceval.callsimArray(e.count,[e,t]);let n=0;for(let i=Sk.abstr.iter(e),r=i.tp$iternext();void 0!==r;r=i.tp$iternext())Sk.misceval.richCompareBool(t,r,"Eq")&&(n+=1);return new Sk.builtin.int_(n)},Sk.abstr.sequenceGetItem=function(e,t,n){return"number"==typeof t&&(t=new Sk.builtin.int_(t)),Sk.abstr.objectGetItem(e,t,n)},Sk.abstr.sequenceSetItem=function(e,t,n,i){return"number"==typeof t&&(t=new Sk.builtin.int_(t)),Sk.abstr.objectSetItem(e,t,n,i)},Sk.abstr.sequenceDelItem=function(e,t,n){return Sk.abstr.objectDelItem(e,t,n)},Sk.abstr.sequenceGetSlice=function(e,t,n){return Sk.abstr.objectGetItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceDelSlice=function(e,t,n){return Sk.abstr.objectDelItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceSetSlice=function(e,t,n,i){return Sk.abstr.objectSetItem(e,new Sk.builtin.slice(t,n))},Sk.abstr.sequenceUnpack=function(e,t,n,i){if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError("cannot unpack non-iterable "+Sk.abstr.typeName(e)+" object");const r=Sk.abstr.iter(e),s=[];let o,a=0;return 0{if(s.push(e),++a===t)return new Sk.misceval.Break}))),Sk.misceval.chain(o,(()=>{if(s.length{if(void 0!==e)throw new Sk.builtin.ValueError("too many values to unpack (expected "+t+")");return s}));const e=[];return Sk.misceval.chain(Sk.misceval.iterFor(r,(t=>{e.push(t)})),(()=>{const i=e.length+t-n;if(0>i)throw new Sk.builtin.ValueError("not enough values to unpack (expected at least "+n+", got "+(n+i)+")");return s.push(new Sk.builtin.list(e.slice(0,i))),s.push(...e.slice(i)),s}))}))},Sk.abstr.mappingUnpackIntoKeywordArray=function(e,t,n){if(!(t instanceof Sk.builtin.dict)){var i=Sk.abstr.lookupSpecial(t,Sk.builtin.str.$keys);if(void 0===i)throw new Sk.builtin.TypeError("Object is not a mapping");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(i),(i=>Sk.misceval.iterFor(Sk.abstr.iter(i),(i=>{if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError((n.$qualname?n.$qualname+"() ":"")+"keywords must be strings");return Sk.misceval.chain(t.mp$subscript(i,!0),(t=>{e.push(i.v),e.push(t)}))}))))}t.$items().forEach((t=>{var[i,r]=t;if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError((n.$qualname?n.$qualname+"() ":"")+"keywords must be strings");e.push(i.v),e.push(r)}))},Sk.abstr.keywordArrayFromPyDict=function(e){const t=[];return e.$items().forEach((e=>{var[n,i]=e;if(!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError("keywords must be strings");t.push(n.toString()),t.push(i)})),t},Sk.abstr.keywordArrayToPyDict=function(e){const t=new Sk.builtin.dict;for(let n=0;nt.length)throw new Sk.builtin.TypeError(e+"() expected at most "+t.length+" arguments ("+s+" given)");if(!i.length&&void 0===r)return n;if(s===t.length&&!i.length)return n;if(0===s&&t.length===(r&&r.length))return r;for(n=n.slice(0),s=0;svoid 0===n[t]))).length)throw new Sk.builtin.TypeError(e+"() missing "+t.length+" required positional arguments: "+t.join(", "))}return n},Sk.exportSymbol("Sk.abstr.copyKeywordsToNamedArgs",Sk.abstr.copyKeywordsToNamedArgs),Sk.abstr.checkNoKwargs=function(e,t){if(t&&t.length)throw new Sk.builtin.TypeError(e+"() takes no keyword arguments")},Sk.exportSymbol("Sk.abstr.checkNoKwargs",Sk.abstr.checkNoKwargs),Sk.abstr.checkNoArgs=function(e,t,n){if(t=t.length+(n?n.length:0))throw new Sk.builtin.TypeError(e+"() takes no arguments ("+t+" given)")},Sk.exportSymbol("Sk.abstr.checkNoArgs",Sk.abstr.checkNoArgs),Sk.abstr.checkOneArg=function(e,t,n){if(Sk.abstr.checkNoKwargs(e,n),1!==t.length)throw new Sk.builtin.TypeError(e+"() takes exactly one argument ("+t.length+" given)")},Sk.exportSymbol("Sk.abstr.checkOneArg",Sk.abstr.checkOneArg),Sk.abstr.checkArgsLen=function(e,t,n,i){if(void 0===i&&(i=1/0),(t=t.length)i)throw new Sk.builtin.TypeError((n===i?e+"() takes exactly "+n+" arguments":tSk.builtin.str&&Sk.builtin.str.$fixReserved?(a=Sk.builtin.str.$fixReserved,Sk.builtin.str.$fixReserved(e)):e;Sk.abstr.setUpGetSets=function(e,t){if(void 0!==Sk.builtin.getset_descriptor){var n=e.prototype;t=t||n.tp$getsets||{},Object.entries(t).forEach((t=>{var[i,r]=t;r.$name=i,n[a(i)]=new Sk.builtin.getset_descriptor(e,r)})),Object.defineProperty(n,"tp$getsets",{value:null,writable:!0})}},Sk.abstr.setUpMethods=function(e,t){if(void 0!==Sk.builtin.method_descriptor){var n=e.prototype;t=t||n.tp$methods||{},Object.entries(t).forEach((t=>{var[i,r]=t;r.$name=i,n[a(i)]=new Sk.builtin.method_descriptor(e,r)})),Object.defineProperty(n,"tp$methods",{value:null,writable:!0})}},Sk.abstr.setUpClassMethods=function(e,t){if(void 0!==Sk.builtin.classmethod_descriptor){var n=e.prototype;t=t||n.tp$classmethods||{},Object.entries(t).forEach((t=>{var[i,r]=t;r.$name=i,n[a(i)]=new Sk.builtin.classmethod_descriptor(e,r)})),Object.defineProperty(n,"tp$classmethods",{value:null,writable:!0})}};const l={Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"},u=Object.entries(l);Sk.abstr.setUpSlots=function(e,t){function n(t,n){r[t]=new Sk.builtin.wrapper_descriptor(e,Sk.slots[t],n)}function i(e,t){"string"==typeof e?n(e,t):e.forEach((e=>{n(e,t)}))}if(void 0!==Sk.builtin.wrapper_descriptor){var r=e.prototype;(t=t||r.tp$slots||{}).tp$new===Sk.generic.new&&(t.tp$new=Sk.generic.new(e)),t.tp$richcompare?function(e){u.forEach((t=>{var[n,i]=t;e[i]=function(e){return this.tp$richcompare(e,n)}}))}(t):t.ob$eq&&(t.tp$richcompare=function(e,t){return this[l[t]].call(this,e)}),t.tp$as_number&&function(e){const t=Sk.reflectedNumberSlots;Object.keys(t).forEach((n=>{if(void 0!==e[n]){const i=t[n],r=i.reflected,s=e[r];void 0!==s?null===s&&delete e[r]:e[r]=i.slot||e[n]}}))}(t),t.tp$as_sequence_or_mapping&&function(e){const t=Sk.sequenceAndMappingSlots;Object.keys(t).forEach((n=>{void 0!==e[n]&&t[n].forEach((t=>{e[t]=e[n]}))}))}(t),Object.entries(t).forEach((e=>{var[t,n]=e;Object.defineProperty(r,t,{value:n,writable:!0})})),t.tp$new&&(r.__new__=new Sk.builtin.sk_method(Sk.generic.newMethodDef,e),Object.defineProperty(r,"sk$staticNew",{value:e,writable:!0})),Sk.subSlots.main_slots.forEach((e=>{var[n,r]=e;void 0!==(e=t[n])&&i(r,e)}));var s=t.tp$hash;void 0!==s&&("function"==typeof s?n("__hash__",s):s===Sk.builtin.none.none$?r.__hash__=s:Sk.asserts.fail("invalid tp$hash")),t.tp$as_number&&Sk.subSlots.number_slots.forEach((e=>{var[n,r]=e;void 0!==(e=t[n])&&i(r,e)})),t.tp$as_sequence_or_mapping&&Sk.subSlots.sequence_and_mapping_slots.forEach((e=>{var[n,r]=e;void 0!==(e=t[n])&&i(r,e)})),Object.defineProperty(r,"tp$slots",{value:null,writable:!0})}},Sk.abstr.buildNativeClass=function(e,t){t=t||{},Sk.asserts.assert(t.hasOwnProperty("constructor"),"A constructor is required to build a native class");let n=t.constructor;Sk.abstr.setUpInheritance(e,n,t.base,t.meta),Sk.abstr.setUpBuiltinMro(n);const i=n.prototype;return Object.defineProperties(i,{tp$slots:{value:t.slots,writable:!0},tp$getsets:{value:t.getsets,writable:!0},tp$methods:{value:t.methods,writable:!0},tp$classmethods:{value:t.classmethods,writable:!0}}),Sk.abstr.setUpSlots(n,t.slots||{}),Sk.abstr.setUpMethods(n,t.methods),Sk.abstr.setUpGetSets(n,t.getsets),Sk.abstr.setUpClassMethods(n,t.classmethods),Object.entries(t.proto||{}).forEach((e=>{var[t,n]=e;Object.defineProperty(i,t,{value:n,writable:!0,enumerable:!(t.includes("$")||t in Object.prototype)})})),Object.entries(t.flags||{}).forEach((e=>{var[t,i]=e;Object.defineProperty(n,t,{value:i,writable:!0})})),i.hasOwnProperty("tp$iter")&&(i[Symbol.iterator]=function(){return this.tp$iter()[Symbol.iterator]()}),void 0!==Sk.builtin.str&&i.hasOwnProperty("tp$doc")&&!i.hasOwnProperty("__doc__")&&(e=i.tp$doc||null,i.__doc__="string"==typeof e?new Sk.builtin.str(e):Sk.builtin.none.none$),n},Sk.abstr.buildIteratorClass=function(e,t){return Sk.asserts.assert(t.hasOwnProperty("constructor"),"must provide a constructor"),t.slots=t.slots||{},t.slots.tp$iter=Sk.generic.selfIter,t.slots.tp$iternext=t.slots.tp$iternext||t.iternext,t.slots.tp$getattr=t.slots.tp$getattr||Sk.generic.getAttr,e=Sk.abstr.buildNativeClass(e,t),Sk.abstr.built$iterators.push(e),e.prototype[Symbol.iterator]=function(){return{next:()=>{const e=this.tp$iternext();return{value:e,done:void 0===e}}}},e},Sk.abstr.built$iterators=[],Sk.abstr.setUpModuleMethods=function(e,t,n){return Object.entries(n).forEach((n=>{var[i,r]=n;r.$name=r.$name||i,t[i]=new Sk.builtin.sk_method(r,null,e)})),t},Sk.abstr.superConstructor=function(e,t,n){var i=Array.prototype.slice.call(arguments,2);e.prototype.tp$base.apply(t,i)}},function(e,t){function n(e){const t=e.prototype,n=t.tp$base;if(null==n)return!1;const i=n.prototype;return!(n.sk$solidSlotBase||e.sk$solidSlotBase||i.sk$hasDict!==t.sk$hasDict||n.sk$solidBase&&n!==Sk.builtin.module)}const i=new WeakMap;Sk.builtin.object=Sk.abstr.buildNativeClass("object",{constructor:function(){Sk.asserts.assert(this instanceof Sk.builtin.object,"bad call to object, use 'new'")},base:null,slots:{tp$new(e,t){if(e.length||t&&t.length){if(this.tp$new!==Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError("object.__new__() takes exactly one argument (the type to instantiate)");if(this.tp$init===Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+"() takes no arguments")}return new this.constructor},tp$init(e,t){if(e.length||t&&t.length){if(this.tp$init!==Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError("object.__init__() takes exactly one argument (the instance to initialize)");if(this.tp$new===Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+".__init__() takes exactly one argument (the instance to initialize)")}},tp$getattr:Sk.generic.getAttr,tp$setattr:Sk.generic.setAttr,$r(){const e=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$module);let t="";return e&&Sk.builtin.checkString(e)&&(t=e.v+"."),new Sk.builtin.str("<"+t+Sk.abstr.typeName(this)+" object>")},tp$str(){return this.$r()},tp$hash(){let e=i.get(this);return void 0!==e||(e=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2),i.set(this,e)),e},tp$richcompare(e,t){switch(t){case"Eq":e=this===e||Sk.builtin.NotImplemented.NotImplemented$;break;case"NotEq":(e=this.ob$eq(e,"Eq"))!==Sk.builtin.NotImplemented.NotImplemented$&&(e=!Sk.misceval.isTrue(e));break;default:e=Sk.builtin.NotImplemented.NotImplemented$}return e},tp$doc:"The most base type"},getsets:{__class__:{$get(){return this.ob$type},$set(e){if(void 0===e)throw new Sk.builtin.TypeError("can't delete __class__ attribute");if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError("__class__ must be set to a class, not '"+Sk.abstr.typeName(e)+"' object");const t=this.ob$type;if(!(t.$isSubType(Sk.builtin.module)&&e.$isSubType(Sk.builtin.module)||void 0!==t.prototype.ht$type&&void 0!==e.prototype.ht$type))throw new Sk.builtin.TypeError(" __class__ assignment only supported for heap types or ModuleType subclasses");{let i=t,r=e;for(;n(i);)i=i.prototype.tp$base;for(;n(r);)r=r.prototype.tp$base;if(i!==r&&(i.prototype.tp$base!==r.prototype.tp$base||!function(e,t){e=e.prototype,t=t.prototype;const n=e.ht$slots,i=t.ht$slots;return e.sk$hasDict===t.sk$hasDict&&(n===i||(n&&i?n.length===i.length&&n.every(((e,t)=>e===i[t])):(n&&(n.length||null))===(i&&(i.length||null))))}(i,r)))throw new Sk.builtin.TypeError("__class__ assignment: '"+e.prototype.tp$name+"' object layout differs from '"+t.prototype.tp$name+"'")}Object.setPrototypeOf(this,e.prototype)},$doc:"the object's class"}},methods:{__dir__:{$meth:function(){let e=Sk.abstr.lookupAttr(this,Sk.builtin.str.$dict);e=void 0===e?new Sk.builtin.dict([]):e instanceof Sk.builtin.dict?e.dict$copy():new Sk.builtin.dict([]);const t=Sk.abstr.lookupAttr(this,Sk.builtin.str.$class);return void 0!==t&&t.$mergeClassDict(e),new Sk.builtin.list(e.sk$asarray())},$flags:{NoArgs:!0},$doc:"Default dir() implementation."},__format__:{$meth(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__format__() argument must be str, not "+Sk.abstr.typeName(e));if(""!==e.v)throw new Sk.builtin.TypeError(`unsupported format string passed to ${Sk.abstr.typeName(this)}.__format__`);return this.tp$str()},$flags:{OneArg:!0},$doc:"Default object formatter."}},classmethods:{__init_subclass__:{$meth:e=>Sk.builtin.none.none$,$flags:{FastCall:!0,NoKwargs:!0}}},proto:{valueOf:Object.prototype.valueOf,toString(){return this.tp$str().v},hasOwnProperty:Object.prototype.hasOwnProperty,ht$type:void 0,sk$attrError(){return"'"+this.tp$name+"' object"},$mergeClassDict(e){var t=Sk.abstr.lookupAttr(this,Sk.builtin.str.$dict);if(void 0!==t&&e.dict$merge(t),void 0!==(t=Sk.abstr.lookupAttr(this,Sk.builtin.str.$bases))){var n=Sk.builtin.len(t).valueOf();for(let i=0;ivoid 0===e?Sk.builtin.none.none$:e))}function s(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,1,2),void 0===(e=this.call(e,...t))?Sk.builtin.none.none$:e}function o(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,2,2),Sk.misceval.chain(this.call(e,t[0],t[1],!0),(()=>Sk.builtin.none.none$))}function a(e,t,n){return Sk.abstr.checkOneArg(this.$name,t,n),e=this.call(e,t[0],void 0,!0),Sk.misceval.chain(e,(e=>void 0===e?Sk.builtin.none.none$:e))}function l(e,t,n){return(e=i.call(this,e,t,n))===Sk.builtin.NotImplemented.NotImplemented$?e:new Sk.builtin.bool(e)}function u(e,t,n){return function(i,r,s){return i=e.call(this,i,r,s),n?Sk.misceval.chain(i,t):t(Sk.misceval.retryOptionalSuspensionOrThrow(i))}}function c(e){return function(){const t=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return Sk.misceval.callsimArray(t,[])}}function d(e,t,n,i){return function(r){return function(){var s=r.tp$descr_get?r.tp$descr_get(this,this.ob$type):r;if(s=Sk.misceval.callsimArray(s,[]),!t(s))throw new Sk.builtin.TypeError(e+" should return "+n+" (returned "+Sk.abstr.typeName(s)+")");return void 0!==i?i(s):s}}}function f(e){return function(t){const n=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return Sk.misceval.callsimArray(n,[t])}}function h(e,t){let n=this.ob$type.$typeLookup(Sk.builtin.str.$getattribute);if(n instanceof Sk.builtin.wrapper_descriptor)return n.d$wrapped.call(this,e,t);n.tp$descr_get&&(n=n.tp$descr_get(this,this.ob$type));const i=Sk.misceval.tryCatch((()=>Sk.misceval.callsimOrSuspendArray(n,[e])),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}function p(e,t,n){return function(i){return function(i,r,s){let o;void 0===r?(o=t,n=null):o=e;let a=this.ob$type.$typeLookup(new Sk.builtin.str(o));if(a instanceof Sk.builtin.wrapper_descriptor)return a.d$wrapped.call(this,i,r);if(a.tp$descr_get&&(a=a.tp$descr_get(this,this.ob$type,s)),void 0===a){if(n)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this)+"' object "+n);throw new Sk.builtin.AttributeError(o)}return i=Sk.misceval.callsimOrSuspendArray(a,void 0===r?[i]:[i,r]),s?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}}}function m(e,t){let n=e.ob$type;for(;n&&void 0!==n.sk$klass;)n=n.prototype.tp$base;if(n&&n.prototype.tp$setattr!==t)throw new Sk.builtin.TypeError("can't apply this "+t.$name+" to "+Sk.abstr.typeName(e)+" object")}Sk.slots=Object.create(null),e=Sk.slots,Sk.slots.__init__={$name:"__init__",$slot_name:"tp$init",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return t=Sk.misceval.callsimOrSuspendArray(i,t,n),Sk.misceval.chain(t,(e=>{if(!Sk.builtin.checkNone(e)&&void 0!==e)throw new Sk.builtin.TypeError("__init__() should return None, not "+Sk.abstr.typeName(e))}))}},$wrapper:function(e,t,n){return this.call(e,t,n),Sk.builtin.none.none$},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Initialize self. See help(type(self)) for accurate signature."},e.__new__={$name:"__new__",$slot_name:"tp$new",$slot_func:function(e){const t=function(t,n){let i=e;return e.tp$descr_get&&(i=e.tp$descr_get(null,this.constructor)),Sk.misceval.callsimOrSuspendArray(i,[this.constructor,...t],n)};return t.sk$static_new=!1,t},$wrapper:null,$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Create and return a new object."},e.__call__={$name:"__call__",$slot_name:"tp$call",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return Sk.misceval.callsimOrSuspendArray(i,t,n)}},$wrapper:function(e,t,n){return void 0===(e=this.call(e,t,n))?Sk.builtin.none.none$:e},$textsig:"($self, /, *args, **kwargs)",$flags:{FastCall:!0},$doc:"Call self as a function."},e.__repr__={$name:"__repr__",$slot_name:"$r",$slot_func:d("__repr__",Sk.builtin.checkString,"str"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return repr(self)."},e.__str__={$name:"__str__",$slot_name:"tp$str",$slot_func:d("__str__",Sk.builtin.checkString,"str"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return str(self)."};var _=d("__hash__",Sk.builtin.checkInt,"int",(e=>"number"==typeof e.v?e.v:e.tp$hash()));e.__hash__={$name:"__hash__",$slot_name:"tp$hash",$slot_func:function(e){return e===Sk.builtin.none.none$?Sk.builtin.none.none$:_(e)},$wrapper:u(n,(e=>new Sk.builtin.int_(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return hash(self)."},e.__getattribute__={$name:"__getattribute__",$slot_name:"tp$getattr",$slot_func:function(e){return function(e,t){let n=this.ob$type.$typeLookup(Sk.builtin.str.$getattr);if(void 0===n)return h.call(this,e,t);const i=Sk.misceval.chain(h.call(this,e,t),(t=>Sk.misceval.tryCatch((()=>void 0!==t?t:(n.tp$descr_get&&(n=n.tp$descr_get(this,this.ob$type)),Sk.misceval.callsimOrSuspendArray(n,[e]))),(function(e){if(!(e instanceof Sk.builtin.AttributeError))throw e}))));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}},$wrapper:function(e,t,n){Sk.abstr.checkOneArg(this.$name,t,n);const i=t[0];if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError("attribute name must be string, not '"+Sk.abstr.typeName(i)+"'");return t=this.call(e,i,!0),Sk.misceval.chain(t,(t=>{if(void 0===t)throw new Sk.builtin.AttributeError(Sk.abstr.typeName(e)+" has no attribute "+i.$jsstr());return t}))},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."},e.__getattr__={$name:"__getattr__",$slot_name:"tp$getattr",$slot_func:e.__getattribute__.$slot_func,$wrapper:null,$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Return getattr(self, name)."},e.__setattr__={$name:"__setattr__",$slot_name:"tp$setattr",$slot_func:p("__setattr__","__delattr__"),$wrapper:function(e,t,n){return Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,2,2),m(e,this),Sk.misceval.chain(this.call(e,t[0],t[1],!0),(()=>Sk.builtin.none.none$))},$textsig:"($self, name, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Implement setattr(self, name, value)."},e.__delattr__={$name:"__delattr__",$slot_name:"tp$setattr",$slot_func:e.__setattr__.$slot_func,$wrapper:function(e,t,n){return Sk.abstr.checkOneArg(this.$name,t,n),m(e,this),this.call(e,t[0]),Sk.builtin.none.none$},$textsig:"($self, name, /)",$flags:{OneArg:!0},$doc:"Implement delattr(self, name)."},e.__get__={$name:"__get__",$slot_name:"tp$descr_get",$slot_func:function(e){return function(t,n,i){null===t&&(t=Sk.builtin.none.none$),null==n&&(n=Sk.builtin.none.none$);const r=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return t=Sk.misceval.callsimOrSuspendArray(r,[t,n]),i?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},$wrapper:function(e,t,n){if(Sk.abstr.checkNoKwargs(this.$name,n),Sk.abstr.checkArgsLen(this.$name,t,1,2),n=t[0],t=t[1],n===Sk.builtin.none.none$&&(n=null),t===Sk.builtin.none.none$&&(t=null),null===t&&null===n)throw new Sk.builtin.TypeError("__get__(None, None) is invalid");return this.call(e,n,t,!0)},$textsig:"($self, instance, owner, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Return an attribute of instance, which is of type owner."},e.__set__={$name:"__set__",$slot_name:"tp$descr_set",$slot_func:p("__set__","__delete__"),$wrapper:o,$textsig:"($self, instance, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Set an attribute of instance to value."},e.__delete__={$name:"__delete__",$slot_name:"tp$descr_set",$slot_func:e.__set__.$slot_func,$wrapper:a,$textsig:"($self, instance, /)",$flags:{OneArg:!0},$doc:"Delete an attribute of instance."},e.__eq__={$name:"__eq__",$slot_name:"ob$eq",$slot_func:f,$wrapper:l,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self==value."},e.__ge__={$name:"__ge__",$slot_name:"ob$ge",$slot_func:f,$wrapper:l,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self>=value."},e.__gt__={$name:"__gt__",$slot_name:"ob$gt",$slot_func:f,$wrapper:l,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self>value."},e.__le__={$name:"__le__",$slot_name:"ob$le",$slot_func:f,$wrapper:l,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<=value."},e.__lt__={$name:"__lt__",$slot_name:"ob$lt",$slot_func:f,$wrapper:l,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return selfSk.misceval.callsimOrSuspendArray(n,[])),(e=>{if(!(e instanceof Sk.builtin.StopIteration))throw e;this.gi$ret=e.$value}));return t?i:Sk.misceval.retryOptionalSuspensionOrThrow(i)}},$wrapper:function(e,t,n){return Sk.abstr.checkNoArgs(this.$name,t,n),Sk.misceval.chain(e.tp$iternext(!0),(e=>{if(void 0===e)throw new Sk.builtin.StopIteration;return e}))},$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Implement next(self)."},e.__len__={$name:"__len__",$slot_name:"sq$length",$slot_func:function(e){return function(t){const n=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return t?(t=Sk.misceval.callsimOrSuspendArray(n,[]),Sk.misceval.chain(t,(e=>Sk.misceval.asIndexOrThrow(e)))):(t=Sk.misceval.callsimArray(n,[]),Sk.misceval.asIndexOrThrow(t))}},$wrapper:u((function(e,t,n){return Sk.abstr.checkNoArgs(this.$name,t,n),e=this.call(e,!0),Sk.misceval.chain(e,(e=>void 0===e?Sk.builtin.none.none$:e))}),(e=>new Sk.builtin.int_(e)),!0),$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return len(self)."},e.__contains__={$name:"__contains__",$slot_name:"sq$contains",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return t=Sk.misceval.callsimOrSuspendArray(i,[t]),(t=Sk.misceval.chain(t,(e=>Sk.misceval.isTrue(e)))).$isSuspension?n?t:Sk.misceval.retryOptionalSuspensionOrThrow(t):t}},$wrapper:u(r,(e=>new Sk.builtin.bool(e)),!0),$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return key in self."},e.__getitem__={$name:"__getitem__",$slot_name:"mp$subscript",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return t=Sk.misceval.callsimOrSuspendArray(i,[t]),n?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},$wrapper:r,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Return self[key]."},e.__setitem__={$name:"__setitem__",$slot_name:"mp$ass_subscript",$slot_func:p("__setitem__","__delitem__","does not support item assignment"),$wrapper:o,$textsig:"($self, key, value, /)",$flags:{MinArgs:2,MaxArgs:2},$doc:"Set self[key] to value."},e.__delitem__={$name:"__delitem__",$slot_name:"mp$ass_subscript",$slot_func:e.__setitem__.$slot_func,$wrapper:a,$textsig:"($self, key, /)",$flags:{OneArg:!0},$doc:"Delete self[key]."},e.__add__={$name:"__add__",$slot_name:"nb$add",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self+value."},e.__radd__={$name:"__radd__",$slot_name:"nb$reflected_add",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value+self."},e.__iadd__={$name:"__iadd__",$slot_name:"nb$inplace_add",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self+=value."},e.__sub__={$name:"__sub__",$slot_name:"nb$subtract",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self-value."},e.__rsub__={$name:"__rsub__",$slot_name:"nb$reflected_subtract",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value-self."},e.__imul__={$name:"__imul__",$slot_name:"nb$inplace_multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self*=value."},e.__mul__={$name:"__mul__",$slot_name:"nb$multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self*value."},e.__rmul__={$name:"__rmul__",$slot_name:"nb$reflected_multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value*self."},e.__isub__={$name:"__isub__",$slot_name:"nb$inplace_subtract",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self-=value."},e.__mod__={$name:"__mod__",$slot_name:"nb$remainder",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self%value."},e.__rmod__={$name:"__rmod__",$slot_name:"nb$reflected_remainder",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value%self."},e.__imod__={$name:"__imod__",$slot_name:"nb$inplace_remainder",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement value%=self."},e.__divmod__={$name:"__divmod__",$slot_name:"nb$divmod",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(self, value)."},e.__rdivmod__={$name:"__rdivmod__",$slot_name:"nb$reflected_divmod",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return divmod(value, self)"},e.__pos__={$name:"__pos__",$slot_name:"nb$positive",$slot_func:c,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"+self"},e.__neg__={$name:"__neg__",$slot_name:"nb$negative",$slot_func:c,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"-self"},e.__abs__={$name:"__abs__",$slot_name:"nb$abs",$slot_func:c,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"abs(self)"},e.__bool__={$name:"__bool__",$slot_name:"nb$bool",$slot_func:d("__bool__",Sk.builtin.checkBool,"bool",(e=>0!==e.v)),$wrapper:u(n,(e=>new Sk.builtin.bool(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"self != 0"},e.__invert__={$name:"__invert__",$slot_name:"nb$invert",$slot_func:c,$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"~self"},e.__lshift__={$name:"__lshift__",$slot_name:"nb$lshift",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self<>value."},e.__rrshift__={$name:"__rrshift__",$slot_name:"nb$reflected_rshift",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value>>self."},e.__ilshift__={$name:"__ilshift__",$slot_name:"nb$inplace_lshift",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self<<=value."},e.__irshift__={$name:"__irshift__",$slot_name:"nb$inplace_rshift",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self=>>value."},e.__and__={$name:"__and__",$slot_name:"nb$and",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self&value."},e.__rand__={$name:"__rand__",$slot_name:"nb$refelcted_and",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value&self."},e.__iand__={$name:"__iand__",$slot_name:"nb$inplace_and",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self&=value."},e.__xor__={$name:"__xor__",$slot_name:"nb$xor",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self^value."},e.__rxor__={$name:"__rxor__",$slot_name:"nb$reflected_xor",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value^self."},e.__ixor__={$name:"__ixor__",$slot_name:"nb$inplace_xor",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self^=value."},e.__or__={$name:"__or__",$slot_name:"nb$or",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self|value."},e.__ror__={$name:"__ror__",$slot_name:"nb$reflected_or",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value|self."},e.__ior__={$name:"__ior__",$slot_name:"nb$inplace_or",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self|=value."},e.__int__={$name:"__int__",$slot_name:"nb$int",$slot_func:d("__int__",Sk.builtin.checkInt,"int"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"int(self)"},e.__float__={$name:"__float__",$slot_name:"nb$float",$slot_func:d("__float__",Sk.builtin.checkFloat,"float"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"float(self)"},e.__floordiv__={$name:"__floordiv__",$slot_name:"nb$floor_divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self//value."},e.__rfloordiv__={$name:"__rfloordiv__",$slot_name:"nb$reflected_floor_divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value//self."},e.__ifloordiv__={$name:"__ifloordiv__",$slot_name:"nb$inplace_floor_divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self//=value."},e.__truediv__={$name:"__truediv__",$slot_name:"nb$divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self/value."},e.__rtruediv__={$name:"__rtruediv__",$slot_name:"nb$reflected_divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value/self."},e.__itruediv__={$name:"__itruediv__",$slot_name:"nb$inplace_divide",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self/=value."},e.__index__={$name:"__index__",$slot_name:"nb$index",$slot_func:d("__index__",Sk.builtin.checkInt,"int",(e=>e.v)),$wrapper:u(n,(e=>new Sk.builtin.int_(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"Return self converted to an integer, if self is suitable for use as an index into a list."},e.__pow__={$name:"__pow__",$slot_name:"nb$power",$slot_func:function(e){return function(t,n){const i=e.tp$descr_get?e.tp$descr_get(this,this.ob$type):e;return null==n?Sk.misceval.callsimArray(i,[t]):Sk.misceval.callsimArray(i,[t,n])}},$wrapper:s,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(self, value, mod)."},e.__rpow__={$name:"__rpow__",$slot_name:"nb$reflected_power",$slot_func:e.__pow__.$slot_func,$wrapper:s,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Return pow(value, self, mod)."},e.__ipow__={$name:"__ipow__",$slot_name:"nb$inplace_power",$slot_func:e.__pow__.$slot_func,$wrapper:s,$textsig:"($self, value, mod=None, /)",$flags:{MinArgs:1,MaxArgs:2},$doc:"Implement **="},e.__matmul__={$name:"__matmul__",$slot_name:"nb$matrix_multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return self@value."},e.__rmatmul__={$name:"__rmatmul__",$slot_name:"nb$reflected_matrix_multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Return value@self."},e.__imatmul__={$name:"__imatmul__",$slot_name:"nb$inplace_matrix_multiply",$slot_func:f,$wrapper:i,$textsig:"($self, value, /)",$flags:{OneArg:!0},$doc:"Implement self@=value."},e.__long__={$name:"__long__",$slot_name:"nb$long",$slot_func:d("__long__",Sk.builtin.checkInt,"int"),$wrapper:n,$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"int(self)"};var b,g={next:{$name:"next",$slot_name:"tp$iternext",$slot_func:e.__next__.$slot_func,$wrapper:e.__next__.$wrapper,$textsig:e.__next__.$textsig,$flags:e.__next__.$flags},__nonzero__:{$name:"__nonzero__",$slot_name:"nb$bool",$slot_func:d("__nonzero__",Sk.builtin.checkInt,"int",(e=>0!==e.v)),$wrapper:u(n,(e=>new Sk.builtin.bool(e))),$textsig:"($self, /)",$flags:{NoArgs:!0},$doc:"x.__nonzero__() <==> x != 0"},__div__:{$name:"__div__",$slot_name:"nb$divide",$slot_func:f,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"x.__div__(y) <==> x/y"},__rdiv__:{$name:"__rdiv__",$slot_name:"nb$reflected_divide",$slot_func:f,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"x.__rdiv__(y) <==> x/y"},__idiv__:{$name:"__idiv__",$slot_name:"nb$inplace_divide",$slot_func:f,$wrapper:i,$textsig:"($self, other/)",$flags:{OneArg:!0},$doc:"implement self /= other"}};Sk.subSlots={main_slots:Object.entries({tp$init:"__init__",tp$call:"__call__",$r:"__repr__",tp$str:"__str__",tp$getattr:"__getattribute__",tp$setattr:["__setattr__","__delattr__"],ob$eq:"__eq__",ob$ne:"__ne__",ob$lt:"__lt__",ob$le:"__le__",ob$gt:"__gt__",ob$ge:"__ge__",tp$descr_get:"__get__",tp$descr_set:["__set__","__delete__"],tp$iter:"__iter__",tp$iternext:"__next__"}),number_slots:Object.entries({nb$abs:"__abs__",nb$negative:"__neg__",nb$positive:"__pos__",nb$int:"__int__",nb$long:"__long__",nb$float:"__float__",nb$index:"__index__",nb$add:"__add__",nb$reflected_add:"__radd__",nb$inplace_add:"__iadd__",nb$subtract:"__sub__",nb$reflected_subtract:"__rsub__",nb$inplace_subtract:"__isub__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_multiply:"__imul__",nb$floor_divide:"__floordiv__",nb$reflected_floor_divide:"__rfloordiv__",nb$inplace_floor_divide:"__ifloordiv__",nb$invert:"__invert__",nb$remainder:"__mod__",nb$reflected_remainder:"__rmod__",nb$inplace_remainder:"__imod__",nb$divmod:"__divmod__",nb$reflected_divmod:"__rdivmod__",nb$power:"__pow__",nb$reflected_power:"__rpow__",nb$inplace_power:"__ipow__",nb$divide:"__truediv__",nb$reflected_divide:"__rtruediv__",nb$inplace_divide:"__itruediv__",nb$bool:"__bool__",nb$and:"__and__",nb$reflected_and:"__rand__",nb$inplace_and:"__iand__",nb$or:"__or__",nb$reflected_or:"__ror__",nb$inplace_or:"__ior__",nb$xor:"__xor__",nb$reflected_xor:"__rxor__",nb$inplace_xor:"__ixor__",nb$lshift:"__lshift__",nb$reflected_lshift:"__rlshift__",nb$rshift:"__rshift__",nb$reflected_rshift:"__rrshift__",nb$inplace_lshift:"__ilshift__",nb$inplace_rshift:"__irshift__",nb$matrix_multiply:"__matmul__",nb$reflected_matrix_multiply:"__rmatmul__",nb$inplace_matrix_multiply:"__imatmul__"}),sequence_and_mapping_slots:Object.entries({sq$length:"__len__",sq$contains:"__contains__",mp$subscript:"__getitem__",mp$ass_subscript:["__setitem__","__delitem__"],nb$add:"__add__",nb$multiply:"__mul__",nb$reflected_multiply:"__rmul__",nb$inplace_add:"__iadd__",nb$inplace_multiply:"__imul__"})},Sk.reflectedNumberSlots={nb$add:{reflected:"nb$reflected_add"},nb$subtract:{reflected:"nb$reflected_subtract",slot:function(e){return e instanceof this.constructor?e.nb$subtract(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$multiply:{reflected:"nb$reflected_multiply"},nb$divide:{reflected:"nb$reflected_divide",slot:function(e){return e instanceof this.constructor?e.nb$divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$floor_divide:{reflected:"nb$reflected_floor_divide",slot:function(e){return e instanceof this.constructor?e.nb$floor_divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$remainder:{reflected:"nb$reflected_remainder",slot:function(e){return e instanceof this.constructor?e.nb$remainder(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$divmod:{reflected:"nb$reflected_divmod",slot:function(e){return e instanceof this.constructor?e.nb$divmod(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$power:{reflected:"nb$reflected_power",slot:function(e,t){return e instanceof this.constructor?e.nb$power(this,t):Sk.builtin.NotImplemented.NotImplemented$}},nb$and:{reflected:"nb$reflected_and"},nb$or:{reflected:"nb$reflected_or"},nb$xor:{reflected:"nb$reflected_xor"},nb$lshift:{reflected:"nb$reflected_lshift",slot:function(e){return e instanceof this.constructor?e.nb$lshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$rshift:{reflected:"nb$reflected_rshift",slot:function(e){return e instanceof this.constructor?e.nb$rshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$matrix_multiply:{reflected:"nb$reflexted_matrix_multiply",slot:function(e){return e instanceof this.constructor?e.nb$matrix_multiply(this):Sk.builtin.NotImplemented.NotImplemented$}}},Sk.sequenceAndMappingSlots={sq$concat:["nb$add"],sq$repeat:["nb$multiply","nb$reflected_multiply"],mp$length:["sq$length"],sq$inplace_repeat:["nb$inplace_multiply"],sq$inplace_concat:["nb$inplace_add"]},Sk.dunderToSkulpt={__repr__:"$r",__str__:"tp$str",__init__:"tp$init",__new__:"tp$new",__hash__:"tp$hash",__call__:"tp$call",__iter__:"tp$iter",__next__:"tp$iternext",__eq__:"ob$eq",__ne__:"ob$ne",__lt__:"ob$lt",__le__:"ob$le",__gt__:"ob$gt",__ge__:"ob$ge",__abs__:"nb$abs",__neg__:"nb$negative",__pos__:"nb$positive",__int__:"nb$int",__float__:"nb$float",__index__:"nb$index",__add__:"nb$add",__radd__:"nb$reflected_add",__iadd__:"nb$inplace_add",__sub__:"nb$subtract",__rsub__:"nb$reflected_subtract",__isub__:"nb$inplace_subtract",__mul__:"nb$multiply",__rmul__:"nb$reflected_multiply",__imul__:"nb$inplace_multiply",__truediv__:"nb$divide",__rtruediv__:"nb$reflected_divide",__itruediv__:"nb$inplace_divide",__floordiv__:"nb$floor_divide",__rfloordiv__:"nb$reflected_floor_divide",__ifloordiv__:"nb$inplace_floor_divide",__invert__:"nb$invert",__mod__:"nb$remainder",__rmod__:"nb$reflected_remainder",__imod__:"nb$inplace_remainder",__divmod__:"nb$divmod",__rdivmod__:"nb$reflected_divmod",__pow__:"nb$power",__rpow__:"nb$reflected_power",__ipow__:"nb$inplace_power",__bool__:"nb$bool",__long__:"nb$long",__lshift__:"nb$lshift",__rlshift__:"nb$reflected_lshift",__ilshift__:"nb$inplace_lshift",__rshift__:"nb$rshift",__rrshift__:"nb$reflected_rshift",__irshift__:"nb$inplace_rshift",__and__:"nb$and",__rand__:"nb$reflected_and",__iand__:"nb$inplace_and",__or__:"nb$or",__ror__:"nb$reflected_or",__ior__:"nb$inplace_or",__xor__:"nb$xor",__rxor__:"nb$reflected_xor",__ixor__:"nb$inplace_xor",__matmul__:"nb$matrix_multiply",__rmatmul__:"nb$reflected_matrix_multiply",__imatmul__:"nb$inplace_matrix_multiply",__get__:"tp$descr_get",__set__:"tp$descr_set",__delete__:"tp$descr_set",__getattribute__:"tp$getattr",__getattr__:"tp$getattr",__setattr__:"tp$setattr",__delattr__:"tp$setattr",__len__:"sq$length",__contains__:"sq$contains",__getitem__:"mp$subscript",__setitem__:"mp$ass_subscript",__delitem__:"mp$ass_subscript"},Sk.exportSymbol("Sk.setupDunderMethods",Sk.setupDunderMethods),Sk.setupDunderMethods=function(e){function t(e,t,n){for(let i=0;i"tp$iternext"===e[0])),l=s.findIndex((e=>"nb$bool"===e[0])),u=Sk.dunderToSkulpt;if(e){u.__bool__="nb$bool",u.__next__="tp$iternext",delete u.__nonzero__,delete u.__div__,delete u.__rdiv__,delete u.__idiv__,delete u.next;for(let e in b)n[e]=b[e];for(let e in g)delete n[e];for(e=0;e")}const o={__doc__:{$get(){return this.d$def.$doc?new Sk.builtin.str(this.d$def.$doc):Sk.builtin.none.none$}},__objclass__:{$get(){return this.d$type}},__name__:{$get(){return new Sk.builtin.str(this.d$name)}}};e={__text_signature__:{$get(){return this.d$def.$textsig?new Sk.builtin.str(this.d$def.$textsig):Sk.builtin.none.none$}}},Sk.builtin.getset_descriptor=n("getset_descriptor",void 0,{constructor:function(e,t){this.d$def=t,this.$get=t.$get,this.$set=t.$set,this.d$type=e,this.d$name=t.$name},slots:{tp$descr_get(e,t,n){if(t=this.d$check(e))return t;if(void 0!==this.$get)return e=this.$get.call(e),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e);throw new Sk.builtin.AttributeError("getset_descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is not readable")},tp$descr_set(e,t,n){if(this.d$set_check(e),void 0!==this.$set)return e=this.$set.call(e,t),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e);throw new Sk.builtin.AttributeError("attribute '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' objects is readonly")}}}),Sk.builtin.method_descriptor=n("method_descriptor","method",{constructor:function(e,t){this.d$def=t,this.$meth=t.$meth,this.d$type=e,this.d$name=t.$name||"",this.$flags=e=t.$flags||{},e.FastCall&&e.NoKwargs?this.tp$call=this.$methodFastCallNoKwargs:e.FastCall?this.tp$call=this.$methodFastCall:e.NoArgs?this.tp$call=this.$methodCallNoArgs:e.OneArg?this.tp$call=this.$methodCallOneArg:e.NamedArgs?this.tp$call=this.$methodCallNamedArgs:void 0!==e.MinArgs?this.tp$call=this.$methodCallMinArgs:(this.func_code=t.$meth,this.tp$call=this.$defaultCall,this.$memoiseFlags=Sk.builtin.func.prototype.$memoiseFlags,this.$resolveArgs=Sk.builtin.func.prototype.$resolveArgs)},slots:{tp$call(e,t){return this.tp$call(e,t)},tp$descr_get(e,t){let n;return(n=this.d$check(e))?n:new Sk.builtin.sk_method(this.d$def,e)}},getsets:e,proto:{$methodFastCall(e,t){const n=e.shift();return this.m$checkself(n),this.$meth.call(n,e,t)},$methodFastCallNoKwargs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoKwargs(this.d$name,t),this.$meth.call(n,e)},$methodCallNoArgs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoArgs(this.d$name,e,t),this.$meth.call(n)},$methodCallOneArg(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkOneArg(this.d$name,e,t),this.$meth.call(n,e[0])},$methodCallNamedArgs(e,t){const n=e.shift();return this.m$checkself(n),e=Sk.abstr.copyKeywordsToNamedArgs(this.d$name,this.$flags.NamedArgs,e,t,this.$flags.Defaults),this.$meth.call(n,...e)},$methodCallMinArgs(e,t){const n=e.shift();return this.m$checkself(n),Sk.abstr.checkNoKwargs(this.d$name,t),Sk.abstr.checkArgsLen(this.d$name,e,this.$flags.MinArgs,this.$flags.MaxArgs),this.$meth.call(n,...e)},$defaultCall(e,t){return this.m$checkself(e[0]),Sk.builtin.func.prototype.tp$call.call(this,e,t)},m$checkself(e){if(void 0===e)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");this.d$check(e)}}}),Sk.builtin.wrapper_descriptor=n("wrapper_descriptor","slot wrapper",{constructor:function(e,t,n){this.d$def=t,this.d$type=e,this.d$name=n.$name=t.$name,this.d$wrapped=n},slots:{tp$descr_get(e,t){let n;return(n=this.d$check(e))?n:new Sk.builtin.method_wrapper(this,e)},tp$call(e,t){if(1>e.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const n=e.shift();if(!n.ob$type.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(n)+"'");return this.raw$call(n,e,t)}},proto:{raw$call(e,t,n){return this.d$wrapped.$name=this.d$name,this.d$def.$wrapper.call(this.d$wrapped,e,t,n)}}}),Sk.builtin.method_wrapper=n("method_wrapper",void 0,{constructor:function(e,t){this.m$descr=e,this.m$self=t,this.d$def=e.d$def,this.d$name=e.d$name,this.d$type=e.d$type},slots:{tp$call(e,t){return this.m$descr.raw$call(this.m$self,e,t)},tp$richcompare(e,t){return("Eq"===t||"NotEq"===t)&&e instanceof Sk.builtin.method_wrapper?(e=this.m$self===e.m$self&&this.m$descr===e.m$descr,"Eq"===t?e:!e):Sk.builtin.NotImplemented.NotImplemented$},$r(){return new Sk.builtin.str("")}},getsets:{__self__:{$get(){return this.m$self}}}}),Sk.builtin.classmethod_descriptor=n("classmethod_descriptor","method",{constructor:function(e,t){this.d$def=t,this.$meth=t.$meth,this.d$type=e,this.d$name=t.$name||""},slots:{tp$call(e,t){if(1>e.length)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' of '"+this.d$type.prototype.tp$name+"' object needs an argument");const n=e.shift();return this.tp$descr_get(null,n).tp$call(e,t)},tp$descr_get(e,t,n){if(void 0===t){if(null===e)throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs an object or a type");t=t||e.ob$type}if(!t.ob$type.$isSubType(Sk.builtin.type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' for type '"+this.d$type.prototype.tp$name+"' needs a type not a '"+Sk.abstr.typeName(t)+"' as arg 2");if(!t.$isSubType(this.d$type))throw new Sk.builtin.TypeError("descriptor '"+this.d$name+"' requires a '"+this.d$type.prototype.tp$name+"' object but received a '"+Sk.abstr.typeName(t)+"' object");return new Sk.builtin.sk_method(this.d$def,t)}},getsets:e}),[Sk.builtin.method_descriptor,Sk.builtin.getset_descriptor,Sk.builtin.wrapper_descriptor,Sk.builtin.method_wrapper,Sk.builtin.classmethod_descriptor].forEach((e=>{Sk.abstr.setUpSlots(e),Sk.abstr.setUpMethods(e),Sk.abstr.setUpGetSets(e)}))},function(e,t){Sk.builtin.sk_method=Sk.abstr.buildNativeClass("builtin_function_or_method",{constructor:function(e,t,n){this.$meth=e.$meth.bind(t),this.$doc=e.$doc,this.$self=t||null,this.$module=n?new Sk.builtin.str(n):null,this.$name=e.$name||e.$meth.name||"",this.m$def=e,this.$textsig=e.$textsig,this.$flags=e=e.$flags||{},e.FastCall&&e.NoKwargs?this.tp$call=this.$fastCallNoKwargs:e.FastCall?this.tp$call=this.$meth:e.NoArgs?this.tp$call=this.$callNoArgs:e.OneArg?this.tp$call=this.$callOneArg:e.NamedArgs?this.tp$call=this.$callNamedArgs:void 0!==e.MinArgs?this.tp$call=this.$callMinArgs:(this.func_code=this.$meth,this.tp$call=this.$defaultCallMethod)},proto:{$fastCallNoKwargs(e,t){return Sk.abstr.checkNoKwargs(this.$name,t),this.$meth(e)},$callNoArgs(e,t){return Sk.abstr.checkNoArgs(this.$name,e,t),this.$meth()},$callOneArg(e,t){return Sk.abstr.checkOneArg(this.$name,e,t),this.$meth(e[0])},$callNamedArgs(e,t){return e=Sk.abstr.copyKeywordsToNamedArgs(this.$name,this.$flags.NamedArgs,e,t,this.$flags.Defaults),this.$meth(...e)},$callMinArgs(e,t){return Sk.abstr.checkNoKwargs(this.$name,t),Sk.abstr.checkArgsLen(this.$name,e,this.$flags.MinArgs,this.$flags.MaxArgs),this.$meth(...e)},$defaultCallMethod(e,t){return null!==this.$self?Sk.builtin.func.prototype.tp$call.call(this,[this.$self,...e],t):Sk.builtin.func.prototype.tp$call.call(this,e,t)},$memoiseFlags(){return Sk.builtin.func.prototype.$memoiseFlags.call(this)},$resolveArgs(){return Sk.builtin.func.prototype.$resolveArgs.call(this)}},flags:{sk$unacceptableBase:!0},slots:{tp$getattr:Sk.generic.getAttr,$r(){return null===this.$self?new Sk.builtin.str(""):new Sk.builtin.str("")},tp$call(e,t){return this.tp$call(e,t)},tp$richcompare(e,t){return("Eq"===t||"NotEq"===t)&&e instanceof Sk.builtin.sk_method?(e=this.$self===e.$self&&this.m$def.$meth===e.m$def.$meth,"Eq"===t?e:!e):Sk.builtin.NotImplemented.NotImplemented$}},getsets:{__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(e){this.$module=e=e||Sk.builtin.none.none$}},__doc__:{$get(){return this.$doc?new Sk.builtin.str(this.$doc):Sk.builtin.none.none$}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__text_signature__:{$get(){return new Sk.builtin.str(this.$textsig)}},__self__:{$get(){return this.$self||Sk.sysModules.mp$lookup(this.$module)||Sk.builtin.none.none$}}}})},function(e,t){Sk.builtin.none=Sk.abstr.buildNativeClass("NoneType",{constructor:function(){return Sk.builtin.none.none$},slots:{tp$new:(e,t)=>(Sk.abstr.checkNoArgs("NoneType",e,t),Sk.builtin.none.none$),$r:()=>new Sk.builtin.str("None"),tp$as_number:!0,nb$bool:()=>!1},proto:{valueOf:()=>null},flags:{sk$unacceptableBase:!0}}),Sk.builtin.none.none$=Object.create(Sk.builtin.none.prototype,{v:{value:null,enumerable:!0}}),Sk.builtin.NotImplemented=Sk.abstr.buildNativeClass("NotImplementedType",{constructor:function(){return Sk.builtin.NotImplemented.NotImplemented$},slots:{$r:()=>new Sk.builtin.str("NotImplemented"),tp$new:(e,t)=>(Sk.abstr.checkNoArgs("NotImplementedType",e,t),Sk.builtin.NotImplemented.NotImplemented$)},flags:{sk$unacceptableBase:!0}}),Sk.builtin.NotImplemented.NotImplemented$=Object.create(Sk.builtin.NotImplemented.prototype,{v:{value:null,enumerable:!0}}),e=Sk.abstr.buildNativeClass("ellipsis",{constructor:function(){return Sk.builtin.Ellipsis},slots:{tp$new:(e,t)=>(Sk.abstr.checkNoArgs("ellipsis",e,t),Sk.builtin.Ellipsis),$r:()=>new Sk.builtin.str("Ellipsis")},flags:{sk$unacceptableBase:!0}}),Sk.builtin.Ellipsis=Object.create(e.prototype,{v:{value:"..."}})},function(e,t){const n=/^(?:(.)?([<>=\^]))?([\+\-\s])?(#)?(0)?(\d+)?(,|_)?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/;Sk.formatting={};let i=function(e,t,n,i){if(Sk.asserts.assert("string"==typeof t),e[6]){var r=parseInt(e[6],10);i=e[2]||(e[5]?"=":i?">":"<");let s=r-(t.length+(n?n.length:0));if(0>=s)return n+t;switch(r=(e[1]||(e[5]?"0":" ")).repeat(s),i){case"=":if("s"===e[9])throw new Sk.builtin.ValueError("'=' alignment not allowed in string format specifier");return n+r+t;case">":return r+n+t;case"<":return n+t+r;case"^":return e=Math.floor(s/2),r.substring(0,e)+n+t+r.substring(e)}}return n+t},r=function(e,t){return t?"-":"+"===e[3]?"+":" "===e[3]?" ":""};const s=/\B(?=(\d{3})+(?!\d))/g,o=/\B(?=([A-Za-z0-9]{4})+(?![A-Za-z0-9]))/g;let a=function(e,t,n){if(Sk.asserts.assert(t instanceof Sk.builtin.int_||t instanceof Sk.builtin.lng),e[8])throw new Sk.builtin.ValueError("Precision not allowed in integer format");var a=t.str$(n,!1);t=t.nb$isnegative(),t=r(e,t),e[4]&&(16===n?t+="0x":8===n?t+="0o":2===n&&(t+="0b"));const l=e[9];if("X"===l&&(a=a.toUpperCase()),"n"===e[9])a=(+a).toLocaleString();else if(e[7]){a=a.split(".");const t=e[7];if(","===t&&10!==n)throw new Sk.builtin.ValueError(`Cannot specify ',' with '${l}'`);a[0]=a[0].replace(10===n?s:o,t),a=a.join(".")}return i(e,a,t,!0)};Sk.formatting.mkNumber__format__=e=>function(t){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+Sk.abstr.typeName(t));return new Sk.builtin.str(function(e,t,s){if(!t)return e.str$(10,!0);if(!(t=t.match(n)))throw new Sk.builtin.ValueError("Invalid format specifier");var o=t[9];if(o||(o=s?"g":"d"),-1==(s?"fFeEgG%":"bcdoxXnfFeEgG%").indexOf(o))throw new Sk.builtin.ValueError("Unknown format code '"+t[9]+"' for object of type '"+Sk.abstr.typeName(e)+"'");switch(o){case"d":case"n":return a(t,e,10);case"x":case"X":return a(t,e,16);case"o":return a(t,e,8);case"b":return a(t,e,2);case"c":if(t[3])throw new Sk.builtin.ValueError("Sign not allowed with integer format specifier 'c'");if(t[4])throw new Sk.builtin.ValueError("Alternate form not allowed with integer format specifier 'c'");if(t[7])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");if(t[8])throw new Sk.builtin.ValueError("Cannot specify ',' with 'c'");return i(t,String.fromCodePoint(Sk.builtin.asnum$(e)),"",!0);case"f":case"F":case"e":case"E":case"g":case"G":{if(t[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed in float format specifier");if("string"==typeof(s=Sk.builtin.asnum$(e))&&(s=Number(s)),1/0===s)return i(t,"inf","",!0);if(-1/0===s)return i(t,"inf","-",!0);if(isNaN(s))return i(t,"nan","",!0);e=!1,0>s&&(s=-s,e=!0);var l=["toExponential","toFixed","toPrecision"]["efg".indexOf(o.toLowerCase())];let n=t[8]?parseInt(t[8],10):6;if(s=s[l](n),-1!=="EFG".indexOf(o)&&(s=s.toUpperCase()),"g"===o.toLowerCase()||!t[9]){if(l=s.match(/\.(\d*[1-9])?(0+)$/)){let[,e,t]=l;s=s.slice(0,e?-t.length:-(t.length+1))}-1!=s.indexOf(".")||t[9]||(s+=".0")}return"e"===o.toLowerCase()&&(s=s.replace(/^([-+]?[0-9]*\.?[0-9]+[eE][-+]?)([0-9])?$/,"$10$2")),t[7]&&((o=s.toString().split("."))[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),s=o.join(".")),i(t,s,r(t,e),!0)}case"%":if(t[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed with format specifier '%'");return"string"==typeof(e=Sk.builtin.asnum$(e))&&(e=Number(e)),1/0===e?i(t,"inf%","",!0):-1/0===e?i(t,"inf%","-",!0):isNaN(e)?i(t,"nan%","",!0):(o=!1,0>e&&(e=-e,o=!0),s=t[8]?parseInt(t[8],10):6,e=(100*e).toFixed(s)+"%",i(t,e,r(t,o),!0));default:throw new Sk.builtin.ValueError("Unknown format code '"+t[9]+"'")}}(this,t.$jsstr(),e))};const l=/^\d+$/,u=/{(((?:\d+)|(?:\w+))?((?:\.(\w+))|(?:\[((?:\d+)|(?:\w+))\])?))?(?:!(.))?(?::([^}]*))?}/g;Sk.formatting.format=function(e,t){t=t||[];const n={};for(let e=0;e{if(void 0===i)i=e;else if(i!==e)throw new Sk.builtin.ValueError(`cannot switch from ${i} to ${e}`)},s=t=>{let i;if("number"==typeof t)r("manual field specification"),i=e[t];else if(l.test(t))r("automatic field numbering"),i=e[t];else if(i=n[t],void 0===i)throw new Sk.builtin.KeyError(t);if(void 0===i)throw new Sk.builtin.IndexError(`Replacement index ${t} out of range for positional args tuple`);return i};let o=0;return t=this.v.replace(u,(function(e,t,n,i,r,a,u,c,d,f){let h;if(void 0!==a&&""!==a?(h=(r=s(n)).constructor===Array?r[a]:l.test(a)?Sk.abstr.objectGetItem(r,new Sk.builtin.int_(parseInt(a,10)),!1):Sk.abstr.objectGetItem(r,new Sk.builtin.str(a),!1),o++):void 0!==r&&""!==r?(a=s(n||o++),h=Sk.abstr.gattr(a,new Sk.builtin.str(r))):void 0!==n&&""!==n?h=s(n):void 0===t||""===t?(h=s(o),o++):l.test(t)&&(h=s(t),o++),"s"===u)h=new Sk.builtin.str(h);else if("r"===u)h=Sk.builtin.repr(h);else if("a"===u)h=Sk.builtin.ascii(h);else if(""!==u&&void 0!==u)throw new Sk.builtin.ValueError("Unknown conversion specifier "+u);return Sk.abstr.objectFormat(h,new Sk.builtin.str(c)).$jsstr()})),new Sk.builtin.str(t)},Sk.formatting.formatString=function(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("format() argument 2 must be str, not "+Sk.abstr.typeName(e));if((e=e.$jsstr().match(n))[9]&&"s"!==e[9])throw new Sk.builtin.ValueError("Unknown format code '"+e[9]+"' for object of type 'str'");if(e[3])throw new Sk.builtin.ValueError("Sign not allowed in string format specifier");if(e[4])throw new Sk.builtin.ValueError("Alternate form (#) not allowed with string format specifier");if(e[7])throw new Sk.builtin.ValueError("Cannot specify ',' with 's'");let t=this.v;return e[8]&&(t=t.substring(0,e[8])),new Sk.builtin.str(i(e,t,"",!1))}},function(e,t,n){function i(e){let t;const n=[];for(let i=0;in?1/0:n;null!=(o=r.exec(e))&&li)return new Sk.builtin.tuple([new Sk.builtin.str(""),new Sk.builtin.str(""),new Sk.builtin.str(n)])}else if(i=n.indexOf(t),0>i)return new Sk.builtin.tuple([new Sk.builtin.str(n),new Sk.builtin.str(""),new Sk.builtin.str("")]);return new Sk.builtin.tuple([new Sk.builtin.str(n.substring(0,i)),new Sk.builtin.str(t),new Sk.builtin.str(n.substring(i+t.length))])}}function a(e,t){return function(n,i){if(n=Sk.misceval.asIndexSized(n,Sk.builtin.OverflowError),void 0===i)i=" ";else{if(!(i instanceof Sk.builtin.str&&1===i.sq$length()))throw new Sk.builtin.TypeError("the fill character must be a str of length 1");i=i.v}var r=this.sq$length();return r>=n?new Sk.builtin.str(this.v):t?(r=n-r,n=Math.floor(r/2)+(r&n&1),i=i.repeat(n)+this.v+i.repeat(r-n),new Sk.builtin.str(i)):(i=i.repeat(n-r),new Sk.builtin.str(e?i+this.v:this.v+i))}}function l(e,t,n){if(({start:t,end:n}=Sk.builtin.slice.startEnd$wrt(e,t,n)),e.$hasAstralCodePoints()){const i=e.codepoints[t];t=void 0===i?t+e.v.length-e.codepoints.length:i,n=void 0===(n=e.codepoints[n])?e.v.length:n}return{start:t,end:n}}function u(e){return function(t,n,i){if(t=this.get$tgt(t),({start:n,end:i}=l(this,n,i)),i=n&&t<=i?t:-1,this.codepoints){i=this.sq$length(),n=-1;for(let e=0;er)return Sk.builtin.bool.false$;if(i=this.v.slice(i,r),n instanceof Sk.builtin.tuple){for(let r=Sk.abstr.iter(n),s=r.tp$iternext();void 0!==s;s=r.tp$iternext()){if(!(s instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("tuple for "+e+" must only contain str, not "+Sk.abstr.typeName(s));if(t(i,s.v))return Sk.builtin.bool.true$}return Sk.builtin.bool.false$}return new Sk.builtin.bool(t(i,n.v))}}function d(e){return void 0===y[e]?e:e+"_$rw$"}e=n(1).default;var f=/^[0-9!#_]/;t=e.Zs.replace(" ","").replace("\\u0020","");const h=new RegExp("["+e.C+e.Zl+e.Zp+t+"]","u"),p=new RegExp("^["+e.Nd+"]+$","u");var m=Array(256),_=new Map;Sk.builtin.str=Sk.abstr.buildNativeClass("str",{constructor:function(e,t){if(Sk.asserts.assert(this instanceof Sk.builtin.str,"bad call to str - use 'new'"),"string"!=typeof e)if(void 0===e)e="";else if(null===e)e="None";else{if(void 0!==e.tp$str)return e.tp$str();if("number"!=typeof e)throw new Sk.builtin.TypeError("could not convert object of type '"+Sk.abstr.typeName(e)+"' to str");e=Number.isFinite(e)?String(e):String(e).replace("Infinity","inf").replace("NaN","nan")}var n=e.length;if(void 0!==(n=0===n?$:1!==n?void 0:256>(n=e.charCodeAt(0))?m[n]:void 0))return n;if(t){if(void 0!==(n=_.get(e)))return n;_.set(e,this)}this.$mangled=d(e),this.$savedKeyHash=e.replace(f,"!$&"),this.v=e,this.$hash=-1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.",tp$new(e,t){if(t=t||[],this!==Sk.builtin.str.prototype)return this.$subtype_new(e,t);if(1>=e.length&&!t.length)return new Sk.builtin.str(e[0]);if(Sk.__future__.python3){const[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("str",["object","encoding","errors"],e,t);if(void 0===n||void 0===i&&void 0===r)return new Sk.builtin.str(n);if(Sk.builtin.bytes.check$encodeArgs("str",i,r),!Sk.builtin.checkBytes(n))throw new Sk.builtin.TypeError("decoding to str: need a bytes-like object, "+Sk.abstr.typeName(n)+" found");return Sk.builtin.bytes.$decode.call(n,i,r)}throw new Sk.builtin.TypeError("str takes at most one argument ("+(e.length+t.length)+" given)")},tp$hash(){if(-1!==this.$hash)return this.$hash;const e=this.v;if(0===e.length)return this.$hash=0;let t,n=e.length,i=0;for(t=0xe9b597bd163a6^e.charCodeAt(i)<<7;0<=--n;)t=1000003*t^e.charCodeAt(++i);return t^=e.length,t^=0x621cdb4baf09f,-1===t&&(t=-2),this.$hash=t},$r(){let e="'";-1!==this.v.indexOf("'")&&-1===this.v.indexOf('"')&&(e='"');const t=this.v.length;let n=e;for(let s=0;sr||57344<=r)&&!Sk.__future__.python3?n+="\\u"+("000"+r.toString(16)).slice(-4):55296<=r&&!Sk.__future__.python3?(i=this.v.codePointAt(s),s++,r="0000000"+(i=i.toString(16)).toString(16),n=4i||127<=r&&!Sk.__future__.python3?(2>(i=i.charCodeAt(0).toString(16)).length&&(i="0"+i),n+="\\x"+i):n+=i}return new Sk.builtin.str(n+e)},tp$str(){return this.constructor===Sk.builtin.str?this:new Sk.builtin.str(this.v)},tp$iter(){return new S(this)},tp$richcompare(e,t){if(!(e instanceof Sk.builtin.str))return Sk.builtin.NotImplemented.NotImplemented$;switch(t){case"Lt":return this.ve.v;case"GtE":return this.v>=e.v}},mp$subscript(e){let t;if(Sk.misceval.isIndex(e)){if(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError),t=this.sq$length(),0>e&&(e+=t),0>e||e>=t)throw new Sk.builtin.IndexError("string index out of range");return this.codepoints?new Sk.builtin.str(this.v.substring(this.codepoints[e],this.codepoints[e+1])):new Sk.builtin.str(this.v.charAt(e))}if(e instanceof Sk.builtin.slice){let n="";return t=this.sq$length(),this.codepoints?e.sssiter$(t,(e=>{n+=this.v.substring(this.codepoints[e],this.codepoints[e+1])})):e.sssiter$(t,(e=>{n+=this.v.charAt(e)})),new Sk.builtin.str(n)}throw new Sk.builtin.TypeError("string indices must be integers, not "+Sk.abstr.typeName(e))},sq$length(){return this.$hasAstralCodePoints()?this.codepoints.length:this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("cannot concatenate 'str' and '"+Sk.abstr.typeName(e)+"' objects");return new Sk.builtin.str(this.v+e.v)},sq$repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");if((e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;let t="";for(let n=0;n' requires string as left operand not "+Sk.abstr.typeName(e));return-1!==this.v.indexOf(e.v)},tp$as_number:!0,nb$remainder:function(e){const t=this.sk$builtinBase;e.constructor===Sk.builtin.tuple||e instanceof Sk.builtin.dict||e instanceof Sk.builtin.mappingproxy||(e=new Sk.builtin.tuple([e]));var n=0,i=this.$jsstr().replace(/%(\([a-zA-Z0-9]+\))?([#0 +\-]+)?(\*|[0-9]+)?(\.(\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrsb%])/g,(function(i,r,s,o,a,l,u){var c,d,f,h,p;o=Sk.builtin.asnum$(o),a=Sk.builtin.asnum$(a),void 0!==r&&""!==r||"%"==u||(c=n++),""===a&&(a=void 0);var m=d=f=h=p=!1;if(s&&(-1!==s.indexOf("-")?h=!0:-1!==s.indexOf("0")&&(p=!0),-1!==s.indexOf("+")?d=!0:-1!==s.indexOf(" ")&&(f=!0),m=-1!==s.indexOf("#")),a&&(a=parseInt(a.substr(1),10)),s=function(e,t){var n;t=Sk.builtin.asnum$(t);var i=!1;if("number"==typeof e){0>e&&(e=-e,i=!0);var r=e.toString(t)}else e instanceof Sk.builtin.float_?(2<(r=e.str$(t,!1)).length&&".0"===r.substr(-2)&&(r=r.substr(0,r.length-2)),i=e.nb$isnegative()):(e instanceof Sk.builtin.int_||e instanceof Sk.builtin.lng)&&(r=e.str$(t,!1),i=e.nb$isnegative());if(Sk.asserts.assert(void 0!==r,"unhandled number format"),e=!1,a)for(n=r.length;nt){for(this.codepoints=[],e=0;et&&e++;return!0}}return this.codepoints=null,!1},sk$asarray(){const e=[];if(this.$hasAstralCodePoints()){var t=this.codepoints;for(let n=0;nn)return new Sk.builtin.str(this.v.replace(e,t));let r=0;return e=this.v.replace(e,(e=>r++t?0:2*(e.length/2-t);for(t=[],0>=n?n=0:t.push(new Sk.builtin.str(this.v.slice(0,e[n-1])));n{if(!(e instanceof Sk.builtin.str))throw new Sk.builtin.TypeError("sequence item "+t.length+": expected str, "+Sk.abstr.typeName(e)+" found");t.push(e.v)})),(()=>new Sk.builtin.str(t.join(this.v))))},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Concatenate any number of strings.\n\nThe string whose method is called is inserted in between each given string.\nThe result is returned as a new string.\n\nExample: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'"},capitalize:{$meth:function(){return new Sk.builtin.str(this.v.charAt(0).toUpperCase()+this.v.slice(1).toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a capitalized version of the string.\n\nMore specifically, make the first character have upper case and the rest lower\ncase."},title:{$meth:function(){const e=this.v.replace(/[a-z][a-z]*/gi,(e=>e[0].toUpperCase()+e.substr(1).toLowerCase()));return new Sk.builtin.str(e)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a version of the string where each word is titlecased.\n\nMore specifically, words start with uppercased characters and all remaining\ncased characters have lower case."},center:{$meth:a(!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a centered string of length width.\n\nPadding is done using the specified fill character (default is a space)."},count:{$meth:function(e,t,n){return e=this.get$tgt(e),({start:t,end:n}=l(this,t,n)),n int\n\nReturn the number of non-overlapping occurrences of substring sub in\nstring S[start:end]. Optional arguments start and end are\ninterpreted as in slice notation."},expandtabs:{$meth:function(e){if(!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError("an integer is required, got type"+Sk.abstr.typeName(e));e=Sk.builtin.asnum$(e);const t=Array(e+1).join(" "),n=this.v.replace(/([^\r\n\t]*)\t/g,((n,i)=>i+t.slice(i.length%e)));return new Sk.builtin.str(n)},$flags:{NamedArgs:["tabsize"],Defaults:[8]},$textsig:"($self, /, tabsize=8)",$doc:"Return a copy where all tab characters are expanded using spaces.\n\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(e,t,n){return new Sk.builtin.int_(this.find$left(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},partition:{$meth:o(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original string\nand two empty strings."},index:{$meth:function(e,t,n){if(-1===(e=this.find$left(e,t,n)))throw new Sk.builtin.ValueError("substring not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in S where substring sub is found, \nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."},ljust:{$meth:a(!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a left-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."},lower:{$meth(){return new Sk.builtin.str(this.v.toLowerCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to lowercase."},lstrip:{$meth:s(/^\s+/g,(e=>"^["+e+"]+")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},removeprefix:{$meth:function(e){e=this.get$tgt(e);const t=this.v;return t.startsWith(e)?new Sk.builtin.str(t.slice(e.length)):this},$flags:{OneArg:!0},$textsig:"($self, prefix, /)",$doc:"Return a str with the given prefix string removed if present.\n\nIf the string starts with the prefix string, return string[len(prefix):].\nOtherwise, return a copy of the original string."},removesuffix:{$meth:function(e){e=this.get$tgt(e);const t=this.v;return t.endsWith(e)?new Sk.builtin.str(t.slice(0,t.length-e.length)):this},$flags:{OneArg:!0},$textsig:"($self, suffix, /)",$doc:"Return a str with the given suffix string removed if present.\n\nIf the string ends with the suffix string and that suffix is not empty,\nreturn string[:-len(suffix)]. Otherwise, return a copy of the original string."},rfind:{$meth(e,t,n){return new Sk.builtin.int_(this.find$right(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.rfind(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(e,t,n){if(-1===(e=this.find$right(e,t,n)))throw new Sk.builtin.ValueError("substring not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in S where substring sub is found,\nsuch that sub is contained within S[start:end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the substring is not found."},rjust:{$meth:a(!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, width, fillchar=' ', /)",$doc:"Return a right-justified string of length width.\n\nPadding is done using the specified fill character (default is a space)."},rstrip:{$meth:s(/\s+$/g,(e=>"["+e+"]+$")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with trailing whitespace removed.\n\nIf chars is given and not None, remove characters in chars instead."},rpartition:{$meth:o(!0),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the string into three parts using the given separator.\n\nThis will search for the separator in the string, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty strings\nand the original string."},splitlines:{$meth:function(e){e=Sk.misceval.isTrue(e);const t=this.v,n=[],i=t.length;var r=0;for(let o=0;o"^["+e+"]+|["+e+"]+$")),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, chars=None, /)",$doc:"Return a copy of the string with leading and trailing whitespace remove.\n\nIf chars is given and not None, remove characters in chars instead."},swapcase:{$meth(){const e=this.v.replace(/[a-z]/gi,(e=>{const t=e.toLowerCase();return t===e?e.toUpperCase():t}));return new Sk.builtin.str(e)},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Convert uppercase characters to lowercase and lowercase characters to uppercase."},upper:{$meth(){return new Sk.builtin.str(this.v.toUpperCase())},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return a copy of the string converted to uppercase."},startswith:{$meth:c("startswith",((e,t)=>0===e.indexOf(t))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if S starts with the specified prefix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nprefix can also be a tuple of strings to try."},endswith:{$meth:c("endswith",((e,t)=>-1!==e.indexOf(t,e.length-t.length))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"S.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if S ends with the specified suffix, False otherwise.\nWith optional start, test S beginning at that position.\nWith optional end, stop comparing S at that position.\nsuffix can also be a tuple of strings to try."},isascii:{$meth(){return new Sk.builtin.bool(/^[\x00-\x7F]*$/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if all characters in the string are ASCII, False otherwise.\n\nASCII characters have code points in the range U+0000-U+007F.\nEmpty string is ASCII too."},islower:{$meth:function(){return new Sk.builtin.bool(this.v.length&&/[a-z]/.test(this.v)&&!/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is a lowercase string, False otherwise.\n\nA string is lowercase if all cased characters in the string are lowercase and\nthere is at least one cased character in the string."},isupper:{$meth:function(){return new Sk.builtin.bool(this.v.length&&!/[a-z]/.test(this.v)&&/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the string is an uppercase string, False otherwise.\n\nA string is uppercase if all cased characters in the string are uppercase and\nthere is at least one cased character in the string."},istitle:{$meth:function(){const e=this.v;let t,n=!1,i=!1;for(let r=0;r str\n\nReturn a formatted version of S, using substitutions from args and kwargs.\nThe substitutions are identified by braces ('{' and '}')."},__format__:{$meth:Sk.formatting.formatString,$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:"Return a formatted version of the string as described by format_spec."},__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.str(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null}}}),Sk.exportSymbol("Sk.builtin.str",Sk.builtin.str);var b=/^[A-Za-z0-9]+$/,g=/([.*+?=|\\\/()\[\]\{\}^$])/g,k=/^[\s\xa0]+/;Sk.builtin.str.$py2decode=new Sk.builtin.method_descriptor(Sk.builtin.str,{$name:"decode",$meth(e,t){const n=new Sk.builtin.bytes(this.v);return Sk.builtin.bytes.$decode.call(n,e,t)},$flags:{NamedArgs:["encoding","errors"]}});var S=Sk.abstr.buildIteratorClass("str_iterator",{constructor:function(e){this.$index=0,e.$hasAstralCodePoints()?(this.$seq=e.codepoints,this.tp$iternext=()=>{const t=this.$seq[this.$index];if(void 0!==t)return new Sk.builtin.str(e.v.substring(t,this.$seq[++this.$index]))}):(this.$seq=e.v,this.tp$iternext=()=>{const e=this.$seq[this.$index++];if(void 0!==e)return new Sk.builtin.str(e)})},iternext(){return this.tp$iternext()},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),y={abstract:!0,as:!0,boolean:!0,break:!0,byte:!0,case:!0,catch:!0,char:!0,class:!0,continue:!0,const:!0,debugger:!0,default:!0,delete:!0,do:!0,double:!0,else:!0,enum:!0,export:!0,extends:!0,false:!0,final:!0,finally:!0,float:!0,for:!0,function:!0,goto:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,int:!0,interface:!0,is:!0,long:!0,namespace:!0,native:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,short:!0,static:!0,super:!0,switch:!0,synchronized:!0,this:!0,throw:!0,throws:!0,transient:!0,true:!0,try:!0,typeof:!0,use:!0,var:!0,void:!0,volatile:!0,while:!0,with:!0,constructor:!0,__defineGetter__:!0,__defineSetter__:!0,apply:!0,arguments:!0,call:!0,caller:!0,eval:!0,hasOwnProperty:!0,isPrototypeOf:!0,__lookupGetter__:!0,__lookupSetter__:!0,__noSuchMethod__:!0,propertyIsEnumerable:!0,prototype:!0,toSource:!0,toLocaleString:!0,toString:!0,unwatch:!0,valueOf:!0,watch:!0,length:!0,name:!0};Sk.builtin.str.reservedWords_=y,Sk.builtin.str.$fixReserved=d;var $=new Sk.builtin.str("");for(e=0;256>e;e++)m[e]=new Sk.builtin.str(String.fromCharCode(e))},function(e,t){Sk.builtin.func=Sk.abstr.buildNativeClass("function",{constructor:function(e,t,n,i){if(Sk.asserts.assert(this instanceof Sk.builtin.func,"builtin func should be called as a class with `new`"),this.func_code=e,this.func_globals=t||null,this.$name=e.co_name||new Sk.builtin.str(e.name||""),this.$d=Sk.builtin.dict?new Sk.builtin.dict:void 0,this.$doc=e.co_docstring||Sk.builtin.none.none$,this.$module=Sk.globals&&Sk.globals.__name__||Sk.builtin.none.none$,this.$qualname=e.co_qualname||this.$name,void 0!==i)for(let e in i)n[e]=i[e];this.func_closure=n,this.func_annotations=null,this.$memoiseFlags(),this.memoised=e.co_fastcall||null,this.tp$call=e.co_fastcall?e.bind(this):Sk.builtin.func.prototype.$funcCall.bind(this)},slots:{tp$getattr:Sk.generic.getAttr,tp$descr_get(e,t){return null===e?this:new Sk.builtin.method(this,e)},$r(){return new Sk.builtin.str("")},tp$call(e,t){return this.tp$call(e,t)}},getsets:{__name__:{$get(){return this.$name},$set(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__name__ must be set to a string object");this.$name=e}},__qualname__:{$get(){return new Sk.builtin.str(this.$qualname)},$set(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__qualname__ must be set to a string object");this.$qualname=e}},__dict__:Sk.generic.getSetDict,__annotations__:{$get(){return null===this.func_annotations?this.func_annotations=new Sk.builtin.dict([]):Array.isArray(this.func_annotations)&&(this.func_annotations=Sk.abstr.keywordArrayToPyDict(this.func_annotations)),this.func_annotations},$set(e){if(void 0===e||Sk.builtin.checkNone(e))this.func_annotations=new Sk.builtin.dict([]);else{if(!(e instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError("__annotations__ must be set to a dict object");this.func_annotations=e}}},__defaults__:{$get(){return null==this.$defaults?Sk.builtin.none.none$:new Sk.builtin.tuple(this.$defaults)},$set(e){if(void 0===e||Sk.builtin.checkNone(e))this.$defaults=null;else{if(!(e instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError("__defaults__ must be set to a tuple object");this.$defaults=e.valueOf()}}},__doc__:{$get(){return this.$doc},$set(e){this.$doc=e||Sk.builtin.none.none$}},__module__:{$get(){return this.$module},$set(e){this.$module=e||Sk.builtin.none.none$}}},proto:{$memoiseFlags(){this.co_varnames=this.func_code.co_varnames,this.co_argcount=this.func_code.co_argcount,void 0===this.co_argcount&&this.co_varnames&&(this.co_argcount=this.co_varnames.length),this.co_kwonlyargcount=this.func_code.co_kwonlyargcount||0,this.co_varargs=this.func_code.co_varargs,this.co_kwargs=this.func_code.co_kwargs,this.$defaults=this.func_code.$defaults,this.$kwdefs=this.func_code.$kwdefs||[]},$resolveArgs:function(e,t){var n=this.co_argcount;void 0===n&&(n=this.co_varnames?this.co_varnames.length:e.length);var i=this.co_varnames||[],r=this.co_kwonlyargcount||0;let s,o=n+r;if(!(0!==r||this.co_kwargs||t&&0!==t.length||this.co_varargs)){if(e.length==n)return e;if(0===e.length&&this.$defaults&&this.$defaults.length===n){for(i=0;i!=this.$defaults.length;i++)e[i]=this.$defaults[i];return e}}this.co_kwargs&&(s=[]);var a=e.length;let l=e.length<=n?e:e.slice(0,n);if(this.co_varargs)e=e.length>l.length?e.slice(l.length):[],l[o]=new Sk.builtin.tuple(e);else if(a>n)throw new Sk.builtin.TypeError(`${this.$name}() takes ${n} positional ${1==n?"argument":"arguments"} but ${a} ${1==a?"was":"were"} given`);if(t){if(this.func_code.no_kw)throw new Sk.builtin.TypeError(this.$name+"() takes no keyword arguments");for(e=0;e"'"+e+"'")).join(", ")));for(;ee.indexOf(".")&&0>e.indexOf("e")&&0>e.indexOf("E"))return e;var t=0;if(0<=e.indexOf("e")){var n=e.substr(0,e.indexOf("e"));t=e.substr(e.indexOf("e")+1)}else 0<=e.indexOf("E")?(n=e.substr(0,e.indexOf("e")),t=e.substr(e.indexOf("E")+1)):n=e;if(t=parseInt(t,10),0>(e=n.indexOf("."))){if(0<=t){for(;0-t?n.substr(0,n.length+t):0}for(n=0===e?n.substr(1):en.length;)n+="0";return 0>=e?0:n.substr(0,e)},Sk.exportSymbol("Sk.builtin.asnum$nofloat",Sk.builtin.asnum$nofloat),Sk.builtin.round=function(e,t){if(void 0===e)throw new Sk.builtin.TypeError("a float is required");if(!Sk.__future__.dunder_round){if(!Sk.builtin.checkNumber(e))throw new Sk.builtin.TypeError("a float is required");if(e.round$)return e.round$(t);throw new Sk.builtin.AttributeError(Sk.abstr.typeName(e)+" instance has no attribute '__float__'")}if(void 0!==t&&!Sk.builtin.checkNone(t)&&!Sk.misceval.isIndex(t))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(t)+"' object cannot be interpreted as an index");if(void 0!==(e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$round)))return void 0!==t?Sk.misceval.callsimArray(e,[t]):Sk.misceval.callsimArray(e,[]);throw new Sk.builtin.TypeError("a float is required")},Sk.builtin.len=function(e){if(!e.sq$length)throw new Sk.builtin.TypeError("object of type '"+Sk.abstr.typeName(e)+"' has no len()");return e=e.sq$length(!0),Sk.misceval.chain(e,(e=>new Sk.builtin.int_(e)))},Sk.builtin.min=function(e,t){let n;const i=e.length;if(!i)throw new Sk.builtin.TypeError("min expected 1 argument, got 0");const[r,s]=Sk.abstr.copyKeywordsToNamedArgs("min",["default","key"],[],t,[null,Sk.builtin.none.none$]);if(1{if(o=e,void 0!==o)return Sk.builtin.checkNone(s)?Sk.misceval.iterFor(n,(e=>{Sk.misceval.richCompareBool(e,o,"Lt")&&(o=e)})):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[o]),(e=>Sk.misceval.iterFor(n,(t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[t]),(n=>{Sk.misceval.richCompareBool(n,e,"Lt")&&(o=t,e=n)}))))))}),(()=>{if(void 0===o){if(null===r)throw new Sk.builtin.ValueError("min() arg is an empty sequence");o=r}return o}))},Sk.builtin.max=function(e,t){let n;const i=e.length;if(!i)throw new Sk.builtin.TypeError("max expected 1 argument, got 0");const[r,s]=Sk.abstr.copyKeywordsToNamedArgs("max",["default","key"],[],t,[null,Sk.builtin.none.none$]);if(1{if(o=e,void 0!==o)return Sk.builtin.checkNone(s)?Sk.misceval.iterFor(n,(e=>{Sk.misceval.richCompareBool(e,o,"Gt")&&(o=e)})):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[o]),(e=>Sk.misceval.iterFor(n,(t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(s,[t]),(n=>{Sk.misceval.richCompareBool(n,e,"Gt")&&(o=t,e=n)}))))))}),(()=>{if(void 0===o){if(null===r)throw new Sk.builtin.ValueError("max() arg is an empty sequence");o=r}return o}))},Sk.builtin.min.co_fastcall=Sk.builtin.max.co_fastcall=1,Sk.builtin.any=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){if(Sk.misceval.isTrue(e))return new Sk.misceval.Break(Sk.builtin.bool.true$)})),(e=>e||Sk.builtin.bool.false$))},Sk.builtin.all=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(function(e){if(!Sk.misceval.isTrue(e))return new Sk.misceval.Break(Sk.builtin.bool.false$)})),(e=>e||Sk.builtin.bool.true$))},Sk.builtin.sum=function(e,t){const n=Sk.abstr.iter(e);if(void 0===t)var i=new Sk.builtin.int_(0);else{if(Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("sum() can't sum strings [use ''.join(seq) instead]");i=t}return e=void 0===t||t.constructor===Sk.builtin.int_?Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.int_)return e.constructor===Sk.builtin.float_?(i=i.nb$float().nb$add(e),new Sk.misceval.Break("float")):(i=Sk.abstr.numberBinOp(i,e,"Add"),new Sk.misceval.Break("slow"));i=i.nb$add(e)})):t.constructor===Sk.builtin.float_?"float":"slow",Sk.misceval.chain(e,(e=>"float"===e?Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.float_&&e.constructor!==Sk.builtin.int_)return i=Sk.abstr.numberBinOp(i,e,"Add"),new Sk.misceval.Break("slow");i=i.nb$add(e)})):e),(e=>{if("slow"===e)return Sk.misceval.iterFor(n,(e=>{i=Sk.abstr.numberBinOp(i,e,"Add")}))}),(()=>i))},Sk.builtin.zip=function(){var e,t;if(0===arguments.length)return new Sk.builtin.list([]);var n=[];for(t=0;te||1114112<=e)throw new Sk.builtin.ValueError("chr() arg not in range(0x110000)")}else if(0>e||256<=e)throw new Sk.builtin.ValueError("chr() arg not in range(256)");return new Sk.builtin.str(String.fromCodePoint(e))},Sk.builtin.unichr=function(e){if(Sk.builtin.pyCheckArgsLen("unichr",arguments.length,1,1),!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError("an integer is required");e=Sk.builtin.asnum$(e);try{return new Sk.builtin.str(String.fromCodePoint(e))}catch(e){if(e instanceof RangeError)throw new Sk.builtin.ValueError(e.message);throw e}},Sk.builtin.int2str_=function(e,t,n){let i=Sk.misceval.asIndexOrThrow(e),r=i.toString(t);return r=0>i?"-"+n+r.slice(1):n+r,2!==t&&!Sk.__future__.python3&&(e instanceof Sk.builtin.lng||JSBI.__isBigInt(i))&&(r+="L"),new Sk.builtin.str(r)},Sk.builtin.hex=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("hex() argument can't be converted to hex");return Sk.builtin.int2str_(e,16,"0x")},Sk.builtin.oct=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("oct() argument can't be converted to hex");return Sk.__future__.octal_number_literal?Sk.builtin.int2str_(e,8,"0o"):Sk.builtin.int2str_(e,8,"0")},Sk.builtin.bin=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object can't be interpreted as an index");return Sk.builtin.int2str_(e,2,"0b")},Sk.builtin.dir=function(e){if(void 0!==e)return e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$dir),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(e,[]),(e=>Sk.builtin.sorted(e)));throw new Sk.builtin.NotImplementedError("skulpt does not yet support dir with no args")},Sk.builtin.repr=function(e){return e.$r()},Sk.builtin.ascii=function(e){return Sk.misceval.chain(e.$r(),(e=>{let t,n;for(n=0;n=r?(2>(i=r.toString(16)).length&&(i="0"+i),t+="\\x"+i):127r||57344<=r?t+="\\u"+("000"+r.toString(16)).slice(-4):55296<=r?(i=e.v.codePointAt(n),n++,r="0000000"+(i=i.toString(16)).toString(16),t=4e.tp$getattr(t,!0)),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return Sk.misceval.chain(i,(i=>{if(void 0===i){if(void 0!==n)return n;throw new Sk.builtin.AttributeError(e.sk$attrError()+" has no attribute "+Sk.misceval.objectRepr(t))}return i}))},Sk.builtin.setattr=function(e,t,n){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("attribute name must be string");return Sk.misceval.chain(e.tp$setattr(t,n,!0),(()=>Sk.builtin.none.none$))},Sk.builtin.raw_input=function(e){var t=e||"";return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(function(e){const n=0===e.$d.stdin.fileno;return Sk.inputfunTakesPrompt&&n?Sk.builtin.file.$readline(e.$d.stdin,null,t):Sk.misceval.chain(void 0,(()=>Sk.misceval.callsimOrSuspendArray(e.$d.stdout.write,[e.$d.stdout,new Sk.builtin.str(t)])),(()=>Sk.misceval.callsimOrSuspendArray(e.$d.stdin.readline,[e.$d.stdin])),(e=>new Sk.builtin.str(e.$jsstr().replace(/[\r\n]+$/,""))))}))},Sk.builtin.input=Sk.builtin.raw_input,Sk.builtin.jseval=function(e){return e=Sk.global.eval(Sk.ffi.remapToJs(e)),Sk.ffi.remapToPy(e)},Sk.builtin.jsmillis=function(){return console.warn("jsmillis is deprecated"),(new Date).valueOf()};const n=Sk.abstr.buildNativeClass("code",{constructor:function(e,t){this.compiled=t,this.code=t.code,this.filename=e},slots:{tp$new(e,t){throw new Sk.builtin.NotImplementedError("cannot construct a code object in skulpt")},$r(){return new Sk.builtin.str(", file "+this.filename+">")}}});Sk.builtin.compile=function(e,t,i,r,s,o){return Sk.builtin.pyCheckType("source","str",Sk.builtin.checkString(e)),Sk.builtin.pyCheckType("filename","str",Sk.builtin.checkString(t)),Sk.builtin.pyCheckType("mode","str",Sk.builtin.checkString(i)),e=e.$jsstr(),t=t.$jsstr(),i=i.$jsstr(),Sk.misceval.chain(Sk.compile(e,t,i,!0),(e=>new n(t,e)))},Sk.builtin.exec=function(e,t,i){let r=t&&t.__file__;if(r=void 0!==r&&Sk.builtin.checkString(r)?r.toString():"",Sk.builtin.checkString(e))e=Sk.compile(e.$jsstr(),r,"exec",!0);else if("string"==typeof e)e=Sk.compile(e,r,"exec",!0);else if(!(e instanceof n))throw new Sk.builtin.TypeError("exec() arg 1 must be a string, bytes or code object");Sk.asserts.assert(void 0===t||t.constructor===Object,"internal calls to exec should be called with a javascript object for globals"),Sk.asserts.assert(void 0===i||i.constructor===Object,"internal calls to exec should be called with a javascript object for locals");const s=Sk.globals;return t=t||s,Sk.misceval.chain(e,(e=>Sk.global.eval(e.code)(t,i)),(e=>(Sk.globals=s,e)))},Sk.builtin.eval=function(e,t,i){if(Sk.builtin.checkString(e))e=e.$jsstr();else if(Sk.builtin.checkBytes(e))throw new Sk.builtin.NotImplementedError("bytes for eval is not yet implemented in skulpt");if("string"==typeof e){e=e.trim();var r=Sk.parse("?",e);if(1<(r=Sk.astFromParse(r.cst,"?",r.flags)).body.length||!(r.body[0]instanceof Sk.astnodes.Expr))throw new Sk.builtin.SyntaxError("invalid syntax");e="__final_res__ = "+e}else if(!(e instanceof n))throw new Sk.builtin.TypeError("eval() arg 1 must be a string, bytes or code object");return Sk.misceval.chain(Sk.builtin.exec(e,t,i),(e=>{const t=e.__final_res__||Sk.builtin.none.none$;return delete e.__final_res__,t}))},Sk.builtin.map=function(e,t){var n,i,r=[];if(Sk.builtin.pyCheckArgsLen("map",arguments.length,2),2((e=new Sk.builtin.list(e)).list$sort(t,n,i),e)))},Sk.builtin.filter=function(e,t){var n;if(Sk.builtin.pyCheckArgsLen("filter",arguments.length,2,2),!Sk.builtin.checkIterable(t))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(t)+"' object is not iterable");var i=function(){return[]},r=function(e,t){return e.push(t),e},s=function(e){return new Sk.builtin.list(e)};t.ob$type===Sk.builtin.str?(i=function(){return new Sk.builtin.str("")},r=function(e,t){return e.sq$concat(t)},s=function(e){return e}):t.ob$type===Sk.builtin.tuple&&(s=function(e){return new Sk.builtin.tuple(e)});var o=i(),a=Sk.abstr.iter(t);for(n=a.tp$iternext();void 0!==n;n=a.tp$iternext())i=e===Sk.builtin.none.none$?new Sk.builtin.bool(n):Sk.misceval.callsimArray(e,[n]),Sk.misceval.isTrue(i)&&(o=r(o,n));return s(o)},Sk.builtin.hasattr=function(e,t){if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError("hasattr(): attribute name must be string");const n=Sk.misceval.tryCatch((()=>e.tp$getattr(t,!0)),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e}));return Sk.misceval.chain(n,(e=>void 0===e?Sk.builtin.bool.false$:Sk.builtin.bool.true$))},Sk.builtin.pow=function(e,t,n){if(void 0===n||Sk.builtin.checkNone(n))return Sk.abstr.numberBinOp(e,t,"Pow");if(!(Sk.builtin.checkInt(e)&&Sk.builtin.checkInt(t)&&Sk.builtin.checkInt(n))){if(Sk.builtin.checkFloat(e)||Sk.builtin.checkComplex(e))return e.nb$power(t,n);throw new Sk.builtin.TypeError("unsupported operand type(s) for ** or pow(): '"+Sk.abstr.typeName(e)+"', '"+Sk.abstr.typeName(t)+"', '"+Sk.abstr.typeName(n)+"'")}return e.nb$power(t,n)},Sk.builtin.quit=function(e){throw e=new Sk.builtin.str(e).v,new Sk.builtin.SystemExit(e)},Sk.builtin.issubclass=function(e,t){if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError("issubclass() arg 1 must be a class");var n=Sk.builtin.checkClass(t);if(!(n||t instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError("issubclass() arg 2 must be a class or tuple of classes");if(n)return e.$isSubType(t)?Sk.builtin.bool.true$:Sk.builtin.bool.false$;for(n=0;n{if(void 0===n){if(t)return t;if(void 0!==(n=e.gi$ret)&&n!==Sk.builtin.none.none$)throw new Sk.builtin.StopIteration(n);throw new Sk.builtin.StopIteration}return n}))},Sk.builtin.reload=function(){throw new Sk.builtin.NotImplementedError("reload is not yet implemented")},Sk.builtin.vars=function(){throw new Sk.builtin.NotImplementedError("vars is not yet implemented")},Sk.builtin.apply_=function(){throw new Sk.builtin.NotImplementedError("apply is not yet implemented")},Sk.builtin.buffer=function(){throw new Sk.builtin.NotImplementedError("buffer is not yet implemented")},Sk.builtin.coerce=function(){throw new Sk.builtin.NotImplementedError("coerce is not yet implemented")},Sk.builtin.intern=function(){throw new Sk.builtin.NotImplementedError("intern is not yet implemented")}},function(e,t){function n(e,t){return t=new this.constructor,this.ht$type&&a.call(t),t.args=new Sk.builtin.tuple(e.slice(0)),t}function i(e,t){Sk.abstr.checkNoKwargs(Sk.abstr.typeName(this),t),this.args=new Sk.builtin.tuple(e.slice(0))}function r(){return 1>=this.args.v.length?new Sk.builtin.str(this.args.v[0]):this.args.$r()}function s(e,t,n,r,s,o){s||(s=[]);const a=r?{}:{sk$solidBase:!1};return n={tp$init:r||i,tp$doc:n},o&&(n.tp$str=o),Sk.abstr.buildNativeClass(t,{base:e,constructor:function(...t){e.apply(this,t),s.forEach(((e,n)=>{this["$"+e]=Sk.ffi.remapToPy(t[n])}))},slots:n,getsets:Object.fromEntries(s.map((e=>[e,{$get(){return this["$"+e]||Sk.builtin.none.none$},$set(t){this["$"+e]=t||Sk.builtin.none.none$}}]))),flags:a})}function o(e,t,r){const s=e.prototype.tp$init;return r={tp$doc:r,tp$init:s},s===i&&(r.tp$new=n),Sk.abstr.buildNativeClass(t,{base:e,constructor:function(...t){e.apply(this,t)},slots:r,flags:{sk$solidBase:!1}})}const a=Sk.abstr.buildNativeClass("BaseException",{constructor:function e(t,...n){Sk.asserts.assert(this instanceof e,"bad call to exception constructor, use 'new'"),"string"==typeof t&&(t=new Sk.builtin.str(t)),this.args=new Sk.builtin.tuple(t?[t]:[]),this.traceback=2<=n.length?[{filename:n[0]||"",lineno:n[1]}]:[],this.context=this.cause=null,this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:"Common base class for all exceptions",tp$new:n,tp$init:i,$r(){let e=this.tp$name;return e+="("+this.args.v.map((e=>Sk.misceval.objectRepr(e))).join(", ")+")",new Sk.builtin.str(e)},tp$str:r},getsets:{args:{$get(){return this.args},$set(e){if(void 0===e)throw new Sk.builtin.TypeError("args may not be deleted");this.args=new Sk.builtin.tuple(e)}},__cause__:{$get(){return this.$cause||Sk.builtin.none.none$},$set(e){if(!(Sk.builtin.checkNone(e)||e instanceof Sk.builtin.BaseException))throw new R("exception cause must be None or derive from BaseException");this.$cause=e}},__dict__:Sk.generic.getSetDict},proto:{toString(){let e=this.tp$name;return e+=": "+this.tp$str().v,0!==this.traceback.length?e+" on line "+this.traceback[0].lineno:e+" at "}}});e=o(a,"SystemExit","Request to exit from the interpreter."),t=o(a,"KeyboardInterrupt","Program interrupted by user.");const l=o(a,"GeneratorExit","Request that a generator exit."),u=o(a,"Exception","Common base class for all non-exit exceptions."),c=s(u,"StopIteration","Signal the end from iterator.__next__().",(function(e,t){i.call(this,e,t),this.$value=e[0]||Sk.builtin.none.none$}),["value"]),d=o(u,"StopAsyncIteration","Signal the end from iterator.__anext__()."),f=o(u,"ArithmeticError","Base class for arithmetic errors."),h=o(f,"FloatingPointError","Floating point operation failed."),p=o(f,"OverflowError","Result too large to be represented."),m=o(f,"ZeroDivisionError","Second argument to a division or modulo operation was zero."),_=o(u,"AssertionError","Assertion failed."),b=o(u,"AttributeError","Attribute not found."),g=o(u,"BufferError","Buffer error."),k=o(u,"EOFError","Read beyond end of file."),S=s(u,"ImportError","Import can't find module, or can't find name in module.",(function(e,t){i.call(this,e);const[n,r]=Sk.abstr.copyKeywordsToNamedArgs("ImportError",["name","path"],[],t);this.$name=n,this.$path=r,1===e.length&&(this.$msg=e[0])}),["msg","name","path"],(function(){return Sk.builtin.checkString(this.$msg)?this.$msg:r.call(this)})),y=o(S,"ModuleNotFoundError","Module not found."),$=o(u,"LookupError","Base class for lookup errors."),v=o($,"IndexError","Sequence index out of range."),w=s($,"KeyError","Mapping key not found.",null,null,(function(){return 1===this.args.v.length?this.args.v[0].$r():r.call(this)})),x=o(u,"MemoryError","Out of memory."),A=o(u,"NameError","Name not found globally."),E=o(A,"UnboundLocalError","Local name referenced but not bound to a value."),C=s(u,"OSError","Base class for I/O related errors.",(function(e,t){i.call(this,e,t)})),T=o(C,"FileNotFoundError","File not found."),N=o(C,"TimeoutError","Timeout expired."),I=o(u,"ReferenceError","Weak ref proxy used after referent went away."),B=o(u,"RuntimeError","Unspecified run-time error."),F=o(B,"NotImplementedError","Method or function hasn't been implemented yet."),M=o(B,"RecursionError","Recursion limit exceeded."),D=s(u,"SyntaxError","Invalid syntax.",(function(e,t){i.call(this,e,t),1<=e.length&&(this.$msg=e[0]),2===e.length&&(e=new Sk.builtin.tuple(e[1]).v,this.$filename=e[0],this.$lineno=e[1],this.$offset=e[2],this.$text=e[3])}),["msg","filename","lineno","offset","text"],(function(){return r.call(this)})),j=o(D,"IndentationError","Improper indentation."),O=o(j,"TabError","Improper mixture of spaces and tabs."),L=o(u,"SystemError","Internal error in the Skulpt interpreter."),R=o(u,"TypeError","Inappropriate argument type."),z=o(u,"ValueError","Inappropriate argument value (of correct type)."),P=o(z,"UnicodeError","Unicode related error."),q=o(P,"UnicodeDecodeError","Unicode decoding error."),U=o(P,"UnicodeEncodeError","Unicode encoding error.");Object.assign(Sk.builtin,{BaseException:a,SystemExit:e,KeyboardInterrupt:t,GeneratorExit:l,Exception:u,StopIteration:c,StopAsyncIteration:d,ArithmeticError:f,FloatingPointError:h,OverflowError:p,ZeroDivisionError:m,AssertionError:_,AttributeError:b,BufferError:g,EOFError:k,ImportError:S,ModuleNotFoundError:y,LookupError:$,IndexError:v,KeyError:w,MemoryError:x,NameError:A,UnboundLocalError:E,OSError:C,IOError:C,FileNotFoundError:T,TimeoutError:N,ReferenceError:I,RuntimeError:B,NotImplementedError:F,RecursionError:M,SyntaxError:D,IndentationError:j,TabError:O,SystemError:L,TypeError:R,ValueError:z,UnicodeError:P,UnicodeDecodeError:q,UnicodeEncodeError:U}),Sk.builtin.SuspensionError=o(u,"SuspensionError","Unsupported Suspension in code."),Sk.builtin.ExternalError=Sk.abstr.buildNativeClass("ExternalError",{constructor:function(...e){if(this.nativeError=e[0],!Sk.builtin.checkString(this.nativeError)&&(e[0]=this.nativeError.toString(),e[0].startsWith("RangeError: Maximum call")))return e[0]="Maximum call stack size exceeded",new M(...e);u.apply(this,e)},base:u}),Sk.builtin.getExcInfo=function(e){return new Sk.builtin.tuple([e.ob$type||Sk.builtin.none.none$,e,Sk.builtin.none.none$])}},function(e,t){Sk.builtin.method=Sk.abstr.buildNativeClass("method",{constructor:function(e,t){Sk.asserts.assert(this instanceof Sk.builtin.method,"bad call to method constructor, use 'new'"),this.im_func=e,this.im_self=t,this.im_call=e.tp$call},slots:{$r(){let e=this.im_func.tp$getattr(Sk.builtin.str.$qualname)||this.im_func.tp$getattr(Sk.builtin.str.$name);return e=e&&e.v||"?",new Sk.builtin.str("")},tp$hash(){return Sk.abstr.objectHash(this.im_self)+Sk.abstr.objectHash(this.im_func)},tp$call(e,t){var n=this.im_call;if(void 0===n)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(this.im_func)+"' object is not callable");return e=[this.im_self,...e],n.call(this.im_func,e,t)},tp$new(e,t){if(Sk.abstr.checkNoKwargs("method",t),Sk.abstr.checkArgsLen("method",e,2,2),t=e[0],e=e[1],!Sk.builtin.checkCallable(t))throw new Sk.builtin.TypeError("first argument must be callable");if(Sk.builtin.checkNone(e))throw new Sk.builtin.TypeError("self must not be None");return new Sk.builtin.method(t,e)},tp$richcompare(e,t){if("Eq"!=t&&"NotEq"!=t||!(e instanceof Sk.builtin.method))return Sk.builtin.NotImplemented.NotImplemented$;let n;try{n=Sk.misceval.richCompareBool(this.im_self,e.im_self,"Eq",!1)&&this.im_func===e.im_func}catch(e){n=!1}return"Eq"==t?n:!n},tp$descr_get(e,t){return this},tp$getattr(e,t){const n=Sk.abstr.lookupSpecial(this,e);return void 0!==n?n:this.im_func.tp$getattr(e,t)}},getsets:{__func__:{$get(){return this.im_func}},__self__:{$get(){return this.im_self}},__doc__:{$get(){return this.im_func.tp$getattr(Sk.builtin.str.$doc)}}},flags:{sk$unacceptableBase:!0}})},function(e,t){function n(e){if(null!=e){if(!0===e.sk$int)return e.v;if(void 0!==e.nb$index)return e.nb$index();if("number"==typeof e&&Number.isInteger(e))return e}}function i(e,t){const i=n(e);if(void 0!==i)return i;throw t=(t||"'{tp$name}' object cannot be interpreted as an integer").replace("{tp$name}",Sk.abstr.typeName(e)),new Sk.builtin.TypeError(t)}Sk.misceval={},Sk.misceval.Suspension=function(e,t,n){this.$isSuspension=!0,void 0!==e&&void 0!==t&&(this.resume=function(){return e(t.resume())}),this.child=t,this.optional=void 0!==t&&t.optional,this.data=void 0===n&&void 0!==t?t.data:n},Sk.exportSymbol("Sk.misceval.Suspension",Sk.misceval.Suspension),Sk.misceval.retryOptionalSuspensionOrThrow=function(e,t){for(;e instanceof Sk.misceval.Suspension;){if(!e.optional){t=new Sk.builtin.SuspensionError(t||"Cannot call a function that blocks or suspends here");const n=[];for(;null!=e;)e.$lineno&&n.push({filename:e.$filename,lineno:e.$lineno,colno:e.$colno}),e=e.child;throw n.reverse(),t.traceback.push(...n),t}e=e.resume()}return e},Sk.exportSymbol("Sk.misceval.retryOptionalSuspensionOrThrow",Sk.misceval.retryOptionalSuspensionOrThrow),Sk.misceval.isIndex=function(e){return null!=e&&(void 0!==e.nb$index||"number"==typeof e&&Number.isInteger(e))},Sk.exportSymbol("Sk.misceval.isIndex",Sk.misceval.isIndex),Sk.misceval.asIndex=n,Sk.misceval.asIndexSized=function(e,t,n){if("number"==typeof(n=i(e,n)))return n;if(null==t)return JSBI.lessThan(n,JSBI.__ZERO)?-Number.MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER;throw new t("cannot fit '"+Sk.abstr.typeName(e)+"' into an index-sized integer")},Sk.misceval.asIndexOrThrow=i,Sk.misceval.applySlice=function(e,t,n,i){return Sk.abstr.objectGetItem(e,new Sk.builtin.slice(t,n,null),i)},Sk.exportSymbol("Sk.misceval.applySlice",Sk.misceval.applySlice),Sk.misceval.assignSlice=function(e,t,n,i,r){return t=new Sk.builtin.slice(t,n),null===i?Sk.abstr.objectDelItem(e,t):Sk.abstr.objectSetItem(e,t,i,r)},Sk.exportSymbol("Sk.misceval.assignSlice",Sk.misceval.assignSlice),Sk.misceval.arrayFromArguments=function(e){var t;if(1!=e.length)return e;var n=e[0];if(n instanceof Sk.builtin.set?n=n.tp$iter().$obj:n instanceof Sk.builtin.dict&&(n=Sk.builtin.dict.prototype.keys.func_code(n)),n instanceof Sk.builtin.list||n instanceof Sk.builtin.tuple)return n.v;if(Sk.builtin.checkIterable(n)){for(e=[],t=(n=Sk.abstr.iter(n)).tp$iternext();void 0!==t;t=n.tp$iternext())e.push(t);return e}throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(n)+"' object is not iterable")},Sk.exportSymbol("Sk.misceval.arrayFromArguments",Sk.misceval.arrayFromArguments),Sk.misceval.iterator=Sk.abstr.buildIteratorClass("iterator",{constructor:function(e,t){this.tp$iternext=t?e:function(t){let n=e();return t||void 0===n||!n.$isSuspension?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)}},iternext:function(e){return this.tp$iternext(e)},flags:{sk$unacceptableBase:!0}}),Sk.misceval.swappedOp_={Eq:"Eq",NotEq:"NotEq",Lt:"Gt",LtE:"GtE",Gt:"Lt",GtE:"LtE"},Sk.misceval.opSymbols={Eq:"==",NotEq:"!=",Lt:"<",LtE:"<=",Gt:">",GtE:">=",Is:"is",IsNot:"is not",In_:"in",NotIn:"not in"},Sk.misceval.richCompareBool=function(e,t,n,i){Sk.asserts.assert(e.sk$object&&t.sk$object,"JS object passed to richCompareBool");var r=e.ob$type,s=t.ob$type,o=s!==r&&void 0===s.sk$baseClass&&s.$isSubType(r);if(!Sk.__future__.python3&&r!==s&&("GtE"===n||"Gt"===n||"LtE"===n||"Lt"===n)){var a=[Sk.builtin.float_,Sk.builtin.int_,Sk.builtin.lng,Sk.builtin.bool];const i=[Sk.builtin.dict,Sk.builtin.enumerate,Sk.builtin.filter_,Sk.builtin.list,Sk.builtin.map_,Sk.builtin.str,Sk.builtin.tuple,Sk.builtin.zip_];var l=a.indexOf(r);if(r=i.indexOf(r),a=a.indexOf(s),s=i.indexOf(s),e===Sk.builtin.none.none$)switch(n){case"Lt":case"LtE":return!0;case"Gt":case"GtE":return!1}if(t===Sk.builtin.none.none$)switch(n){case"Lt":case"LtE":return!1;case"Gt":case"GtE":return!0}if(-1!==l&&-1!==s)switch(n){case"Lt":case"LtE":return!0;case"Gt":case"GtE":return!1}if(-1!==r&&-1!==a)switch(n){case"Lt":case"LtE":return!1;case"Gt":case"GtE":return!0}if(-1!==r&&-1!==s)switch(n){case"Lt":return rs;case"GtE":return r>=s}}if("Is"===n)return e===t;if("IsNot"===n)return e!==t;if("In"===n)return Sk.misceval.chain(Sk.abstr.sequenceContains(t,e,i),Sk.misceval.isTrue);if("NotIn"===n)return Sk.misceval.chain(Sk.abstr.sequenceContains(t,e,i),(function(e){return!Sk.misceval.isTrue(e)}));if(l=(s={Eq:"ob$eq",NotEq:"ob$ne",Gt:"ob$gt",GtE:"ob$ge",Lt:"ob$lt",LtE:"ob$le"})[n],o&&(i=t[i=s[Sk.misceval.swappedOp_[n]]](e))!==Sk.builtin.NotImplemented.NotImplemented$||(i=e[l](t))!==Sk.builtin.NotImplemented.NotImplemented$||!o&&(i=t[i=s[Sk.misceval.swappedOp_[n]]](e))!==Sk.builtin.NotImplemented.NotImplemented$)return Sk.misceval.isTrue(i);if(!Sk.__future__.python3){if(o=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$cmp))try{if(i=Sk.misceval.callsimArray(o,[t]),Sk.builtin.checkNumber(i)){if(i=Sk.builtin.asnum$(i),"Eq"===n)return 0===i;if("NotEq"===n)return 0!==i;if("Lt"===n)return 0>i;if("Gt"===n)return 0=i;if("GtE"===n)return 0<=i}if(i!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int")}catch(e){throw new Sk.builtin.TypeError("comparison did not return an int")}if(o=Sk.abstr.lookupSpecial(t,Sk.builtin.str.$cmp))try{if(i=Sk.misceval.callsimArray(o,[e]),Sk.builtin.checkNumber(i)){if(i=Sk.builtin.asnum$(i),"Eq"===n)return 0===i;if("NotEq"===n)return 0!==i;if("Lt"===n)return 0i;if("LtE"===n)return 0<=i;if("GtE"===n)return 0>=i}if(i!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError("comparison did not return an int")}catch(e){throw new Sk.builtin.TypeError("comparison did not return an int")}if(e===Sk.builtin.none.none$&&t===Sk.builtin.none.none$){if("Eq"===n)return e.v===t.v;if("NotEq"===n)return e.v!==t.v;if("Gt"===n)return e.v>t.v;if("GtE"===n)return e.v>=t.v;if("Lt"===n)return e.v";throw e}},Sk.exportSymbol("Sk.misceval.objectRepr",Sk.misceval.objectRepr),Sk.misceval.opAllowsEquality=function(e){switch(e){case"LtE":case"Eq":case"GtE":return!0}return!1},Sk.exportSymbol("Sk.misceval.opAllowsEquality",Sk.misceval.opAllowsEquality),Sk.misceval.isTrue=function(e){return!0===e||e===Sk.builtin.bool.true$||!1!==e&&e!==Sk.builtin.bool.false$&&null!=e&&(e.nb$bool?e.nb$bool():e.sq$length?0!==e.sq$length():!!e)},Sk.exportSymbol("Sk.misceval.isTrue",Sk.misceval.isTrue),Sk.misceval.softspace_=!1,Sk.misceval.print_=function(e){Sk.misceval.softspace_&&("\n"!==e&&Sk.output(" "),Sk.misceval.softspace_=!1);var t=new Sk.builtin.str(e);return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(function(e){return Sk.misceval.apply(e.$d.stdout.write,void 0,void 0,void 0,[e.$d.stdout,t])}),(function(){var e;(e=0===t.v.length)||(e=!("\n"===(e=t.v[t.v.length-1])||"\t"===e||"\r"===e)),(e||" "===t.v[t.v.length-1])&&(Sk.misceval.softspace_=!0)}))},Sk.exportSymbol("Sk.misceval.print_",Sk.misceval.print_),Sk.misceval.loadname=function(e,t){if(void 0!==(t=t[e]))return t;if(void 0!==(t=Sk.builtins[e]))return t;throw new Sk.builtin.NameError("name '"+Sk.unfixReserved(e)+"' is not defined")},Sk.exportSymbol("Sk.misceval.loadname",Sk.misceval.loadname),Sk.misceval.call=function(e,t,n,i,r){return r=Array.prototype.slice.call(arguments,4),Sk.misceval.apply(e,t,n,i,r)},Sk.exportSymbol("Sk.misceval.call",Sk.misceval.call),Sk.misceval.callAsync=function(e,t,n,i,r,s){return s=Array.prototype.slice.call(arguments,5),Sk.misceval.applyAsync(e,t,n,i,r,s)},Sk.exportSymbol("Sk.misceval.callAsync",Sk.misceval.callAsync),Sk.misceval.callOrSuspend=function(e,t,n,i,r){return r=Array.prototype.slice.call(arguments,4),Sk.misceval.applyOrSuspend(e,t,n,i,r)},Sk.exportSymbol("Sk.misceval.callOrSuspend",Sk.misceval.callOrSuspend),Sk.misceval.callsim=function(e,t){return t=Array.prototype.slice.call(arguments,1),Sk.misceval.apply(e,void 0,void 0,void 0,t)},Sk.exportSymbol("Sk.misceval.callsim",Sk.misceval.callsim),Sk.misceval.callsimArray=function(e,t,n){return t=t||[],Sk.misceval.retryOptionalSuspensionOrThrow(Sk.misceval.callsimOrSuspendArray(e,t,n))},Sk.exportSymbol("Sk.misceval.callsimArray",Sk.misceval.callsimArray),Sk.misceval.callsimAsync=function(e,t,n){return n=Array.prototype.slice.call(arguments,2),Sk.misceval.applyAsync(e,t,void 0,void 0,void 0,n)},Sk.exportSymbol("Sk.misceval.callsimAsync",Sk.misceval.callsimAsync),Sk.misceval.callsimOrSuspend=function(e,t){return t=Array.prototype.slice.call(arguments,1),Sk.misceval.applyOrSuspend(e,void 0,void 0,void 0,t)},Sk.exportSymbol("Sk.misceval.callsimOrSuspend",Sk.misceval.callsimOrSuspend),Sk.misceval.callsimOrSuspendArray=function(e,t,n){return t=t||[],void 0!==e&&e.tp$call?e.tp$call(t,n):Sk.misceval.applyOrSuspend(e,void 0,void 0,n,t)},Sk.exportSymbol("Sk.misceval.callsimOrSuspendArray",Sk.misceval.callsimOrSuspendArray),Sk.misceval.apply=function(e,t,n,i,r){return(e=Sk.misceval.applyOrSuspend(e,t,n,i,r))instanceof Sk.misceval.Suspension?Sk.misceval.retryOptionalSuspensionOrThrow(e):e},Sk.exportSymbol("Sk.misceval.apply",Sk.misceval.apply),Sk.misceval.defaultHandlers={},Sk.misceval.asyncToPromise=function(e,t){return new Promise((function(n,i){try{!function e(r){try{for(var s=function(){try{e(r.resume())}catch(e){i(e)}},o=function(e){try{r.data.result=e,s()}catch(e){i(e)}},a=function(e){try{r.data.error=e,s()}catch(e){i(e)}};r instanceof Sk.misceval.Suspension;){const n=r.data.type;let u=t&&(t[n]||t["*"]);if(u||(u=Sk.misceval.defaultHandlers[n]||Sk.misceval.defaultHandlers["*"]),u){var l=u(r);if(l)return void l.then(e,i)}if("Sk.promise"===n)return void r.data.promise.then(o,a);if("Sk.yield"===n)return void Sk.global.setImmediate(s);if("Sk.delay"===n)return void Sk.global.setImmediate(s);if(!r.optional)throw new Sk.builtin.SuspensionError("Unhandled non-optional suspension of type '"+r.data.type+"'");r=r.resume()}n(r)}catch(e){i(e)}}(e())}catch(e){i(e)}}))},Sk.exportSymbol("Sk.misceval.asyncToPromise",Sk.misceval.asyncToPromise),Sk.misceval.applyAsync=function(e,t,n,i,r,s){return Sk.misceval.asyncToPromise((function(){return Sk.misceval.applyOrSuspend(t,n,i,r,s)}),e)},Sk.exportSymbol("Sk.misceval.applyAsync",Sk.misceval.applyAsync),Sk.misceval.chain=function(e,t){for(var n,i,r=1,s=e;;){if(r==arguments.length)return s;if(s&&s.$isSuspension)break;s=arguments[r](s),r++}for(i=Array(arguments.length-r),n=0;ne[i++]},t,n)},Sk.misceval.arrayFromIterable=function(e,t){if(void 0===e)return[];if(void 0===e.ht$type&&void 0!==e.sk$asarray)return e.sk$asarray();const n=[];return e=Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{n.push(e)})),(()=>n)),t?e:Sk.misceval.retryOptionalSuspensionOrThrow(e)},Sk.misceval.Break=function(e){if(!(this instanceof Sk.misceval.Break))return new Sk.misceval.Break(e);this.brValue=e},Sk.exportSymbol("Sk.misceval.Break",Sk.misceval.Break),Sk.misceval.applyOrSuspend=function(e,t,n,i,r){var s;if(null==e||e===Sk.builtin.none.none$)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not callable");"function"==typeof e&&void 0===e.tp$call&&(e=new Sk.builtin.func(e));var o=e.tp$call;if(void 0!==o){if(n)for(s=(n=n.tp$iter()).tp$iternext();void 0!==s;s=n.tp$iternext())r.push(s);if(t)for(s=(n=Sk.abstr.iter(t)).tp$iternext();void 0!==s;s=n.tp$iternext()){if(!Sk.builtin.checkString(s))throw new Sk.builtin.TypeError("Function keywords must be strings");i.push(s.v),i.push(Sk.abstr.objectGetItem(t,s,!1))}return o.call(e,r,i,t)}if(void 0!==(o=e.__call__))return r.unshift(e),Sk.misceval.apply(o,t,n,i,r);throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not callable")},Sk.exportSymbol("Sk.misceval.applyOrSuspend",Sk.misceval.applyOrSuspend),Sk.misceval.promiseToSuspension=function(e){var t=new Sk.misceval.Suspension;return t.resume=function(){if(t.data.error)throw t.data.error;return t.data.result},t.data={type:"Sk.promise",promise:e},t},Sk.exportSymbol("Sk.misceval.promiseToSuspension",Sk.misceval.promiseToSuspension),Sk.misceval.buildClass=function(e,t,n,i,r,s){n=new Sk.builtin.str(n);const o=new Sk.builtin.tuple(i);let a;i=i||[];var l=!0;const u=(s=s||[]).indexOf("metaclass");-1{if(e=e.ob$type,!n.$isSubType(e)){if(!e.$isSubType(n))throw new Sk.builtin.TypeError("metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases");n=e}})),n}(a,i));let c=null;a!==Sk.builtin.type&&([c,f]=function(e,t,n,i,r){const s=e.tp$getattr(Sk.builtin.str.$prepare);let o,a=null;if(void 0===s)return[a,o];if(a=Sk.misceval.callsimArray(s,[t,n],i),!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError(r?e.prototype.tp$name:".__prepare__() must return a mapping not '"+Sk.abstr.typeName(a)+"'");return o={get(e,t){try{return Sk.abstr.objectGetItem(e,new Sk.builtin.str(Sk.unfixReserved(t)))}catch(e){if(!(e instanceof Sk.builtin.KeyError))throw e}},set:(e,t,n)=>(Sk.abstr.objectSetItem(e,new Sk.builtin.str(Sk.unfixReserved(t)),n),!0)},[a,o]}(a,n,o,s,l)),i=!1;let d={};if(null===c)c=new Sk.builtin.dict([]);else if(c.constructor===Sk.builtin.dict||function(){const e=(Sk.global.navigator||{}).userAgent||"";return-1{Sk.abstr.objectSetItem(c,new Sk.builtin.str(e),d[e])})),Sk.misceval.callsimOrSuspendArray(a,[n,o,c],s)},Sk.exportSymbol("Sk.misceval.buildClass",Sk.misceval.buildClass)},function(e,t){Sk.builtin.callable_iter_=Sk.abstr.buildIteratorClass("callable_iterator",{constructor:function(e,t){if(!Sk.builtin.checkCallable(e))throw new Sk.builtin.TypeError("iter(v, w): v must be callable");this.$callable=e,this.$sentinel=t,this.$flag=!1},iternext(e){if(!0!==this.$flag){if(e)return e=Sk.misceval.callsimOrSuspendArray(this.$callable,[]),Sk.misceval.chain(e,(e=>{if(!Sk.misceval.richCompareBool(e,this.$sentinel,"Eq",!0))return e;this.$flag=!0}));if(e=Sk.misceval.callsimArray(this.$callable,[]),!Sk.misceval.richCompareBool(e,this.$sentinel,"Eq",!1))return e;this.$flag=!0}},flags:{sk$unacceptableBase:!0}}),Sk.builtin.seq_iter_=Sk.abstr.buildIteratorClass("iterator",{constructor:function(e){this.$index=0,this.$seq=e},iternext(e){let t;return t=Sk.misceval.tryCatch((()=>this.$seq.mp$subscript(new Sk.builtin.int_(this.$index++),e)),(e=>{if(!(e instanceof Sk.builtin.IndexError||e instanceof Sk.builtin.StopIteration))throw e;this.gi$ret=e.$value||Sk.builtin.none.none$})),e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},methods:{__length_hint__:{$flags:{NoArgs:!0},$meth(){if(this.$seq.sq$length)return this.$seq.sq$length()-this.$index;throw new Sk.builtin.NotImplementedError("len is not implemented for "+Sk.abstr.typeName(this.$seq))}}},flags:{sk$unacceptableBase:!0}}),Sk.exportSymbol("Sk.builtin.callable_iter_",Sk.builtin.callable_iter_)},function(e,t){Sk.builtin.list=Sk.abstr.buildNativeClass("list",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.list,"bad call to list, use 'new' with an Array of python objects"),this.v=e,this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$doc:"Built-in mutable sequence.\n\nIf no argument is given, the constructor creates a new empty list.\nThe argument must be an iterable if specified.",tp$new:Sk.generic.new,tp$init(e,t){return Sk.abstr.checkNoKwargs("list",t),Sk.abstr.checkArgsLen("list",e,0,1),Sk.misceval.chain(Sk.misceval.arrayFromIterable(e[0],!0),(e=>{this.v=e}))},$r(){if(this.in$repr)return new Sk.builtin.str("[...]");this.in$repr=!0;const e=this.v.map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,new Sk.builtin.str("["+e.join(", ")+"]")},tp$richcompare:Sk.generic.seqCompare,tp$iter(){return new n(this)},sq$length(){return this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.list))throw new Sk.builtin.TypeError("can only concatenate list to list");return new Sk.builtin.list(this.v.concat(e.v))},sq$contains(e){for(let t=this.tp$iter(),n=t.tp$iternext();void 0!==n;n=t.tp$iternext())if(n===e||Sk.misceval.richCompareBool(n,e,"Eq"))return!0;return!1},sq$repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");if((e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;const t=[];for(let n=0;n{t.push(this.v[e])})),new Sk.builtin.list(t)}throw new Sk.builtin.TypeError("list indices must be integers or slices, not "+Sk.abstr.typeName(e))},mp$ass_subscript(e,t){void 0===t?this.del$subscript(e):this.ass$subscript(e,t)},sq$inplace_concat(e){return e===this?(this.v.push(...this.v),this):Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.v.push(e)})),(()=>this))},sq$inplace_repeat(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError("can't multiply sequence by non-int of type '"+Sk.abstr.typeName(e)+"'");e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError);const t=this.v.length;if(0>=e)this.v.length=0;else if(e*t>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;for(let n=1;n{this.v.push(e)})),(()=>Sk.builtin.none.none$))},$flags:{OneArg:!0},$textsig:"($self, iterable, /)",$doc:"Extend list by appending elements from the iterable."},pop:{$meth(e){e=void 0===e?this.v.length-1:Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError),e=this.list$inRange(e,"pop index out of range");const t=this.v[e];return this.v.splice(e,1),t},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, index=-1, /)",$doc:"Remove and return item at index (default last).\n\nRaises IndexError if list is empty or index is out of range."},remove:{$meth(e){if(-1===(e=this.list$indexOf(e)))throw new Sk.builtin.ValueError("list.remove(x): x not in list");return this.v.splice(e,1),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:"($self, value, /)",$doc:"Remove first occurrence of value.\n\nRaises ValueError if the value is not present."},sort:{$meth(e,t){if(e.length)throw new Sk.builtin.TypeError("sort() takes no positional arguments");const[n,i]=Sk.abstr.copyKeywordsToNamedArgs("sort",["key","reverse"],e,t,[Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(void 0,n,i)},$flags:{FastCall:!0},$textsig:"($self, /, *, key=None, reverse=False)",$doc:"Stable sort *IN PLACE*."},index:{$meth(e,t,n){if(void 0!==t&&!Sk.misceval.isIndex(t)||void 0!==n&&!Sk.misceval.isIndex(n))throw new Sk.builtin.TypeError("slice indices must be integers or have an __index__ method");if(-1===(t=this.list$indexOf(e,t,n)))throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(e)+" is not in list");return new Sk.builtin.int_(t)},$flags:{MinArgs:1,MaxArgs:3},$textsig:"($self, value, start=0, stop=sys.maxsize, /)",$doc:"Return first index of value.\n\nRaises ValueError if the value is not present."},count:{$meth(e){let t=0;const n=this.v.length;for(let i=0;ie&&(e+=this.v.length),0<=e&&e{n.push(e)})),!Sk.builtin.checkIterable(t))throw new Sk.builtin.TypeError("must assign iterable to extended slice");if(e=Sk.misceval.arrayFromIterable(t),n.length!==e.length)throw new Sk.builtin.ValueError("attempt to assign sequence of size "+e.length+" to extended slice of size "+n.length);for(t=0;t{this.v.splice(e-n,1),n+=t}))},valueOf(){return this.v}}}),Sk.exportSymbol("Sk.builtin.list",Sk.builtin.list),Sk.builtin.list.py2$methods={sort:{$name:"sort",$meth(e,t){const[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("sort",["cmp","key","reverse"],e,t,[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(n,i,r)},$flags:{FastCall:!0},$textsig:"($self, cmp=None, key=None, reverse=False)",$doc:"Stable sort *IN PLACE*."}};var n=Sk.abstr.buildIteratorClass("list_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext:Sk.generic.iterNextWithArray,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),i=Sk.abstr.buildIteratorClass("list_reverseiterator",{constructor:function(e){this.$index=e.v.length-1,this.$seq=e.v},iternext(){const e=this.$seq[this.$index--];if(void 0!==e)return e;this.tp$iternext=()=>{}},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$unacceptableBase:!0}})},function(e,t,n){function i(e){var t=e.replace(v,"").replace(w,"_").toLowerCase();return void 0===(t=$[t])?e:t}function r(e,t,n){if(void 0===t)t="utf-8";else{if(!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError(e+"() argument "+("bytesstr".includes(e)?2:1)+" must be str not "+Sk.abstr.typeName(t));t=t.$jsstr()}if(void 0===n)n="strict";else{if(!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError(e+"() argument "+("bytesstr".includes(e)?3:2)+" must be str not "+Sk.abstr.typeName(n));n=n.$jsstr()}return{encoding:t,errors:n}}function s(e){if("strict"!==e&&"ignore"!==e&&"replace"!==e)throw new Sk.builtin.LookupError("Unsupported or invalid error type '"+e+"'")}function o(e,t,n){if(e=e.$jsstr(),t=i(t),s(n),"ascii"===t){for(r in t=[],e){const i=e.charCodeAt(r);if(127=e?"\\x":"\\u";return 3===(e=e.toString(16)).length&&(e=e.slice(1,3)),1===e.length?t+"0"+e:t+e}function l(e,t,n,i){if(e=e.decode(t),"replace"===n)return e;if("strict"===n){if(-1===(n=e.indexOf("�")))return e;throw new Sk.builtin.UnicodeDecodeError(`'${i}' codec can't decode byte 0x ${t[n].toString(16)} in position ${n}: invalid start byte`)}return e.replace(/\ufffd/g,"")}function u(e,t){if(({encoding:e,errors:t}=r("decode",e,t)),e=i(e),s(t),"ascii"===e){e=this.v;var n="";for(let i=0;i=n&&tn)return new Sk.builtin.tuple([new Sk.builtin.bytes,new Sk.builtin.bytes,this])}else if(n=this.find$subleft(t,0,this.v.length),0>n)return new Sk.builtin.tuple([this,new Sk.builtin.bytes,new Sk.builtin.bytes]);return new Sk.builtin.tuple([new Sk.builtin.bytes(this.v.subarray(0,n)),new Sk.builtin.bytes(t),new Sk.builtin.bytes(this.v.subarray(n+t.length))])}}function h(e,t){return function(n){var i=void 0===n||n===Sk.builtin.none.none$?new Uint8Array([9,10,11,12,13,32,133]):this.get$raw(n);n=0;var r=this.v.length;if(e)for(;nn&&i.includes(this.v[r-1]);)r--;for(i=new Uint8Array(r-n),r=0;r=e||32===e}function _(e){return 97<=e&&122>=e}function b(e){return 65<=e&&90>=e}function g(e){return 48<=e&&57>=e}function k(e,t){return function(){return 0===this.v.length?t?Sk.builtin.bool.true$:Sk.builtin.bool.false$:this.v.every((t=>e(t)))?Sk.builtin.bool.true$:Sk.builtin.bool.false$}}function S(e,t){return function(){let n=!1;for(let i=0;i0<=e&&255>=e)),"bad internal call to bytes with array"),this.v=new Uint8Array(e);else if("string"==typeof e){let t;const n=new Uint8Array(e.length),i=e.length;for(let r=0;r bytes\nbytes(string, encoding[, errors]) -> bytes\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\nbytes() -> empty bytes object\n\nConstruct an immutable array of bytes from:\n - an iterable yielding integers in range(256)\n - a text string encoded using the specified encoding\n - any object implementing the buffer API.\n - an integer",tp$new(e,t){if(this!==Sk.builtin.bytes.prototype)return this.$subtype_new(e,t);let n;if(t=t||[],!(1>=e.length&&0==+t.length)){if([e,t,n]=Sk.abstr.copyKeywordsToNamedArgs("bytes",[null,"encoding","errors"],e,t),({encoding:t,errors:n}=r("bytes",t,n)),!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("encoding or errors without a string argument");return o(e,t,n)}if(void 0===(e=e[0]))return new Sk.builtin.bytes;if(void 0!==(t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$bytes)))return e=Sk.misceval.callsimOrSuspendArray(t,[]),Sk.misceval.chain(e,(e=>{if(!Sk.builtin.checkBytes(e))throw new Sk.builtin.TypeError("__bytes__ returned non-bytes (type "+Sk.abstr.typeName(e)+")");return e}));if(Sk.misceval.isIndex(e)){if(0>(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError)))throw new Sk.builtin.ValueError("negative count");return new Sk.builtin.bytes(e)}if(Sk.builtin.checkBytes(e))return new Sk.builtin.bytes(e.v);if(Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("string argument without an encoding");if(Sk.builtin.checkIterable(e)){let t=[];return e=Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(0>(e=Sk.misceval.asIndexSized(e))||255new Sk.builtin.bytes(t)))}throw new Sk.builtin.TypeError("cannot convert '"+Sk.abstr.typeName(e)+"' object into bytes")},$r(){let e,t="'";const n=-1!==this.v.indexOf(34);let i="";for(let r=0;re||10e||13e||126e.length||n[i]>e[i];case"GtE":return i===r&&n.length>=e.length||n[i]>=e[i]}},tp$hash(){return new Sk.builtin.str(this.$jsstr()).tp$hash()},tp$as_sequence_or_mapping:!0,mp$subscript(e){if(Sk.misceval.isIndex(e)){let t=Sk.misceval.asIndexSized(e,Sk.builtin.IndexError);if(void 0!==t){if(0>t&&(t=this.v.length+t),0>t||t>=this.v.length)throw new Sk.builtin.IndexError("index out of range");return new Sk.builtin.int_(this.v[t])}}else if(e instanceof Sk.builtin.slice){const t=[];return e.sssiter$(this.v.length,(e=>{t.push(this.v[e])})),new Sk.builtin.bytes(new Uint8Array(t))}throw new Sk.builtin.TypeError("byte indices must be integers or slices, not "+Sk.abstr.typeName(e))},sq$length(){return this.v.length},sq$concat(e){if(!(e instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("can't concat "+Sk.abstr.typeName(e)+" to bytes");const t=new Uint8Array(this.v.length+e.v.length);let n;for(n=0;nNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;if(0>=e)return new Sk.builtin.bytes;e=new Uint8Array(t);let n=0;for(;n(e=Sk.misceval.asIndexOrThrow(e,"argument should be integer or bytes-like object, not {tp$name}"))||255(t=Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError))?1/0:t,null!==(e=Sk.builtin.checkNone(e)?null:this.get$raw(e))&&!e.length)throw new Sk.builtin.ValueError("empty separator");return{sep:e,maxsplit:t}},find$left:d(!1),find$right:d(!0),find$subleft:function(e,t,n){n=n-e.length+1;let i=t;for(;ie===this.v[i+t])))return i;i++}return-1},find$subright(e,t,n){let i=n-e.length;for(;i>=t;){if(e.every(((e,t)=>e===this.v[i+t])))return i;i--}return-1},$subtype_new(e,t){const n=new this.constructor;return e=Sk.builtin.bytes.prototype.tp$new(e,t),n.v=e.v,n},sk$asarray(){const e=[];return this.v.forEach((t=>{e.push(new Sk.builtin.int_(t))})),e},valueOf(){return this.v}},flags:{str$encode:o,$decode:u,check$encodeArgs:r},methods:{__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.bytes(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null},capitalize:{$meth(){const e=this.v.length;if(0===e)return new Sk.builtin.bytes(this.v);const t=new Uint8Array(e);let n=this.v[0];t[0]=_(n)?n-32:n;for(let i=1;i copy of B\n\nReturn a copy of B with only its first character capitalized (ASCII)\nand the rest lower-cased."},center:{$meth:p("center",!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.center(width[, fillchar]) -> copy of B\n\nReturn B centered in a string of length width. Padding is\ndone using the specified fill character (default is a space)."},count:{$meth(e,t,n){e=this.get$tgt(e),({start:t,end:n}=Sk.builtin.slice.startEnd$wrt(this,t,n));let i=0;if("number"==typeof e)for(;te===this.v[r+t]))&&(i++,r+=e.length-1)}return new Sk.builtin.int_(i)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.count(sub[, start[, end]]) -> int\n\nReturn the number of non-overlapping occurrences of subsection sub in\nbytes B[start:end]. Optional arguments start and end are interpreted\nas in slice notation."},decode:{$meth:u,$flags:{NamedArgs:["encoding","errors"]},$textsig:"($self, /, encoding='utf-8', errors='strict')",$doc:"Decode the bytes using the codec registered for encoding.\n\n encoding\n The encoding with which to decode the bytes.\n errors\n The error handling scheme to use for the handling of decoding errors.\n The default is 'strict' meaning that decoding errors raise a\n UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n as well as any other name registered with codecs.register_error that\n can handle UnicodeDecodeErrors."},endswith:{$meth:c("endswith",((e,t)=>{const n=e.length-t.length;return 0<=n&&t.every(((t,i)=>t===e[n+i]))})),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.endswith(suffix[, start[, end]]) -> bool\n\nReturn True if B ends with the specified suffix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nsuffix can also be a tuple of bytes to try."},expandtabs:{$meth(e){e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError,"an integer is required (got type {tp$nam})");const t=[];let n=0;for(let r=0;r copy of B\n\nReturn a copy of B where all tab characters are expanded using spaces.\nIf tabsize is not given, a tab size of 8 characters is assumed."},find:{$meth:function(e,t,n){return new Sk.builtin.int_(this.find$left(e,t,n))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.find(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},hex:{$meth(){let e="";for(let t=0;t string\n\nCreate a string of hexadecimal numbers from a bytes object.\nExample: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."},index:{$meth:function(e,t,n){if(-1===(e=this.find$left(e,t,n)))throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.index(sub[, start[, end]]) -> int\n\nReturn the lowest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaises ValueError when the subsection is not found."},isalnum:{$meth:k((e=>g(e)||_(e)||b(e))),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalnum() -> bool\n\nReturn True if all characters in B are alphanumeric\nand there is at least one character in B, False otherwise."},isalpha:{$meth:k((e=>65<=e&&90>=e||97<=e&&122>=e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isalpha() -> bool\n\nReturn True if all characters in B are alphabetic\nand there is at least one character in B, False otherwise."},isascii:{$meth:k((e=>0<=e&&127>=e),!0),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isascii() -> bool\n\nReturn True if B is empty or all characters in B are ASCII,\nFalse otherwise."},isdigit:{$meth:k(g),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isdigit() -> bool\n\nReturn True if all characters in B are digits\nand there is at least one character in B, False otherwise."},islower:{$meth:S(_,b),$flags:{NoArgs:!0},$textsig:null,$doc:"B.islower() -> bool\n\nReturn True if all cased characters in B are lowercase and there is\nat least one cased character in B, False otherwise."},isspace:{$meth:k(m),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isspace() -> bool\n\nReturn True if all characters in B are whitespace\nand there is at least one character in B, False otherwise."},istitle:{$meth:function(){let e=!1,t=!1;for(let n=0;n bool\n\nReturn True if B is a titlecased string and there is at least one\ncharacter in B, i.e. uppercase characters may only follow uncased\ncharacters and lowercase characters only cased ones. Return False\notherwise."},isupper:{$meth:S(b,_),$flags:{NoArgs:!0},$textsig:null,$doc:"B.isupper() -> bool\n\nReturn True if all cased characters in B are uppercase and there is\nat least one cased character in B, False otherwise."},join:{$meth(e){const t=[];let n=0;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(!(e instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError("sequence item "+n+": expected a bytes-like object, "+Sk.abstr.typeName(e)+" found");n++,t.length&&t.push(...this.v),t.push(...e.v)})),(()=>new Sk.builtin.bytes(new Uint8Array(t))))},$flags:{OneArg:!0},$textsig:"($self, iterable_of_bytes, /)",$doc:"Concatenate any number of bytes objects.\n\nThe bytes whose method is called is inserted in between each pair.\n\nThe result is returned as a new bytes object.\n\nExample: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'."},ljust:{$meth:p("ljust",!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.ljust(width[, fillchar]) -> copy of B\n\nReturn B left justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)."},lower:{$meth:y((e=>b(e)?e+32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.lower() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to lowercase."},lstrip:{$meth:h(!0,!1),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading ASCII whitespace."},partition:{$meth:f(!1),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes. If the separator is found,\nreturns a 3-tuple containing the part before the separator, the separator\nitself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing the original bytes\nobject and two empty bytes objects."},replace:{$meth(e,t,n){e=this.get$raw(e),t=this.get$raw(t),n=0>(n=void 0===n?-1:Sk.misceval.asIndexSized(n,Sk.builtin.OverflowError))?1/0:n;const i=[];let r=0;for(var s=0;s int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nReturn -1 on failure."},rindex:{$meth:function(e,t,n){if(-1===(e=this.find$right(e,t,n)))throw new Sk.builtin.ValueError("subsection not found");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.rindex(sub[, start[, end]]) -> int\n\nReturn the highest index in B where subsection sub is found,\nsuch that sub is contained within B[start,end]. Optional\narguments start and end are interpreted as in slice notation.\n\nRaise ValueError when the subsection is not found."},rjust:{$meth:p("rjust",!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"B.rjust(width[, fillchar]) -> copy of B\n\nReturn B right justified in a string of length width. Padding is\ndone using the specified fill character (default is a space)"},rpartition:{$meth:f(!0),$flags:{OneArg:!0},$textsig:"($self, sep, /)",$doc:"Partition the bytes into three parts using the given separator.\n\nThis will search for the separator sep in the bytes, starting at the end. If\nthe separator is found, returns a 3-tuple containing the part before the\nseparator, the separator itself, and the part after it.\n\nIf the separator is not found, returns a 3-tuple containing two empty bytes\nobjects and the original bytes object."},rsplit:{$meth:function(e,t){({sep:e,maxsplit:t}=this.get$splitArgs(e,t));const n=[];let i=0,r=this.v.length;if(null!==e){for(;0<=r&&ir)break;for(e=r+1,r--;0<=r&&!m(this.v[r]);)r--;n.push(new Sk.builtin.bytes(this.v.subarray(r+1,e))),i++}if(0<=r){for(;m(this.v[r]);)r--;0<=r&&n.push(new Sk.builtin.bytes(this.v.subarray(0,r+1)))}}return new Sk.builtin.list(n.reverse())},$flags:{NamedArgs:["sep","maxsplit"],Defaults:[Sk.builtin.none.none$,-1]},$textsig:"($self, /, sep=None, maxsplit=-1)",$doc:"Return a list of the sections in the bytes, using sep as the delimiter.\n\n sep\n The delimiter according which to split the bytes.\n None (the default value) means split on ASCII whitespace characters\n (space, tab, return, newline, formfeed, vertical tab).\n maxsplit\n Maximum number of splits to do.\n -1 (the default value) means no limit.\n\nSplitting is done starting at the end of the bytes and working to the front."},rstrip:{$meth:h(!1,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip trailing ASCII whitespace."},split:{$meth:function(e,t){({sep:e,maxsplit:t}=this.get$splitArgs(e,t));const n=[],i=this.v.length;let r=0,s=0;if(null!==e){for(;st.length<=e.length&&t.every(((t,n)=>t===e[n])))),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"B.startswith(prefix[, start[, end]]) -> bool\n\nReturn True if B starts with the specified prefix, False otherwise.\nWith optional start, test B beginning at that position.\nWith optional end, stop comparing B at that position.\nprefix can also be a tuple of bytes to try."},strip:{$meth:h(!0,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, bytes=None, /)",$doc:"Strip leading and trailing bytes contained in the argument.\n\nIf the argument is omitted or None, strip leading and trailing ASCII whitespace."},swapcase:{$meth:y((e=>b(e)?e+32:_(e)?e-32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.swapcase() -> copy of B\n\nReturn a copy of B with uppercase ASCII characters converted\nto lowercase ASCII and vice versa."},title:{$meth(){const e=this.v.length,t=new Uint8Array(e);let n=!1;for(let i=0;i copy of B\n\nReturn a titlecased version of B, i.e. ASCII words start with uppercase\ncharacters, all remaining cased characters have lowercase."},upper:{$meth:y((e=>_(e)?e-32:e)),$flags:{NoArgs:!0},$textsig:null,$doc:"B.upper() -> copy of B\n\nReturn a copy of B with all ASCII characters converted to uppercase."},zfill:{$meth(e){const t=(e=Sk.misceval.asIndexSized(e,Sk.builtin.IndexError))-this.v.length;if(0>=t)return new Sk.builtin.bytes(this.v);const n=new Uint8Array(e);let i,r=0;for(43!==this.v[0]&&45!==this.v[0]||(n[0]=this.v[0],r++),n.fill(48,r,r+t),i=r,r+=t;r copy of B\n\nPad a numeric string B with zeros on the left, to fill a field\nof the specified width. B is never truncated."}},classmethods:{fromhex:{$meth:function(e){function t(t){for(let n=o;n b'\\\\xb9\\\\x01\\\\xef'."}}});var E=Sk.abstr.buildIteratorClass("bytes_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext(){const e=this.$seq[this.$index++];if(void 0!==e)return new Sk.builtin.int_(e)},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}});Sk.exportSymbol("Sk.builtin.bytes",Sk.builtin.bytes)},function(e,t,n){(function(e){!function(e){function t(){}function n(){}var i=String.fromCharCode,r={}.toString,s=r.call(e.SharedArrayBuffer),o=r(),a=e.Uint8Array,l=a||Array,u=a?ArrayBuffer:l,c=u.isView||function(e){return e&&"length"in e},d=r.call(u.prototype);u=n.prototype;var f=e.TextEncoder,h=new(a?Uint16Array:l)(32);t.prototype.decode=function(e){if(!c(e)){var t=r.call(e);if(t!==d&&t!==s&&t!==o)throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");e=a?new l(e):e||[]}for(var n,u,f,p=t="",m=0,_=0|e.length,b=_-32|0,g=0,k=0,S=0,y=-1;m<_;){for(n=m<=b?32:_-m|0;S>4){case 15:if(2!=(f=255&e[m=m+1|0])>>6||247>6?k+4|0:24,u=u+256&768;case 13:case 12:g<<=6,g|=(31&u)<<6|63&(f=255&e[m=m+1|0]),k=k+7|0,m<_&&2==f>>6&&g>>k&&1114112>g?(u=g,0<=(g=g-65536|0)&&(y=55296+(g>>10)|0,u=56320+(1023&g)|0,31>S?(h[S]=y,S=S+1|0,y=-1):(f=y,y=u,u=f))):(m=m-(u>>=8)-1|0,u=65533),g=k=0,n=m<=b?32:_-m|0;default:h[S]=u;continue;case 11:case 10:case 9:case 8:}h[S]=65533}if(p+=i(h[0],h[1],h[2],h[3],h[4],h[5],h[6],h[7],h[8],h[9],h[10],h[11],h[12],h[13],h[14],h[15],h[16],h[17],h[18],h[19],h[20],h[21],h[22],h[23],h[24],h[25],h[26],h[27],h[28],h[29],h[30],h[31]),32>S&&(p=p.slice(0,S-32|0)),m<_){if(h[0]=y,S=~y>>>31,y=-1,p.length=o)i[r]=o;else{if(2047>=o)i[r]=192|o>>6;else{e:{if(55296<=o)if(56319>=o){var u=0|e.charCodeAt(t=t+1|0);if(56320<=u&&57343>=u){if(65535<(o=(o<<10)+u-56613888|0)){i[r]=240|o>>18,i[r=r+1|0]=128|o>>12&63,i[r=r+1|0]=128|o>>6&63,i[r=r+1|0]=128|63&o;continue}break e}o=65533}else 57343>=o&&(o=65533);!s&&t<<1>12,i[r=r+1|0]=128|o>>6&63}i[r=r+1|0]=128|63&o}}return a?i.subarray(0,r):i.slice(0,r)},f||(e.TextDecoder=t,e.TextEncoder=n)}(void 0===e?"undefined"==typeof self?this:self:e)}).call(this,n(0))},function(e,t){Sk.builtin.tuple=Sk.abstr.buildNativeClass("tuple",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.tuple,"bad call to tuple, use 'new' with an Array of python objects"),this.v=e,this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"Built-in immutable sequence.\n\nIf no argument is given, the constructor returns an empty tuple.\nIf iterable is specified the tuple is initialized from iterable's items.\n\nIf the argument is a tuple, the return value is the same object.",$r(){if(this.in$repr)return new Sk.builtin.str("(...)");this.in$repr=!0;let e=this.v.map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,e=e.join(", "),1===this.v.length&&(e+=","),new Sk.builtin.str("("+e+")")},tp$new(e,t){return this!==Sk.builtin.tuple.prototype?this.$subtype_new(e,t):(Sk.abstr.checkNoKwargs("tuple",t),Sk.abstr.checkArgsLen("tuple",e,0,1),void 0===(e=e[0])?new Sk.builtin.tuple([]):e.constructor===Sk.builtin.tuple?e:Sk.misceval.chain(Sk.misceval.arrayFromIterable(e,!0),(e=>new Sk.builtin.tuple(e))))},tp$hash(){let e,t=3430008,n=1000003;const i=this.v.length;for(let r=0;r(e=Sk.misceval.asIndexSized(e,Sk.builtin.IndexError))&&(e=this.v.length+e),0>e||e>=this.v.length)throw new Sk.builtin.IndexError("tuple index out of range");return this.v[e]}if(e instanceof Sk.builtin.slice){const t=[];return e.sssiter$(this.v.length,(e=>{t.push(this.v[e])})),new Sk.builtin.tuple(t)}throw new Sk.builtin.TypeError("tuple indices must be integers or slices, not "+Sk.abstr.typeName(e))},sq$length(){return this.v.length},sq$repeat(e){if(1===(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError))&&this.constructor===Sk.builtin.tuple)return this;const t=[];for(let n=0;n(this.$seq=e.$items(),this.$version=e.$version,n&&(this.$seq=this.$seq.reverse()),this.tp$iternext=this.constructor.prototype.tp$iternext,this.tp$iternext())},iternext:t,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0},proto:{next$item:a}})}function a(){if(this.$version!==this.$orig.$version){if(this.$seq.length!==this.$orig.get$size())throw new Sk.builtin.RuntimeError("dict changed size during iteration");throw new Sk.builtin.RuntimeError("dictionary keys changed during iteration")}return this.$seq[this.$index++]}Sk.builtin.dict=Sk.abstr.buildNativeClass("dict",{constructor:function(e){void 0===e&&(e=[]),Sk.asserts.assert(Array.isArray(e)&&0==e.length%2&&this instanceof Sk.builtin.dict,"bad call to dict constructor"),this.size=0,this.entries=Object.create(null),this.buckets={};for(let t=0;t new empty dictionary\ndict(mapping) -> new dictionary initialized from a mapping object's\n (key, value) pairs\ndict(iterable) -> new dictionary initialized as if via:\n d = {}\n for k, v in iterable:\n d[k] = v\ndict(**kwargs) -> new dictionary initialized with the name=value pairs\n in the keyword argument list. For example: dict(one=1, two=2)",$r(){if(this.in$repr)return new Sk.builtin.str("{...}");this.in$repr=!0;const e=this.$items().map((e=>{var[t,n]=e;return Sk.misceval.objectRepr(t)+": "+Sk.misceval.objectRepr(n)}));return this.in$repr=!1,new Sk.builtin.str("{"+e.join(", ")+"}")},tp$new:Sk.generic.new,tp$init(e,t){return this.update$common(e,t,"dict")},tp$iter(){return new f(this)},tp$richcompare(e,t){let n;if(!(e instanceof Sk.builtin.dict)||"Eq"!==t&&"NotEq"!==t)return Sk.builtin.NotImplemented.NotImplemented$;if(e===this)n=!0;else if(this.size!==e.size)n=!1;else{let t;n=this.$items().every((n=>{var[i,r]=n;return t=e.mp$lookup(i),void 0!==t&&(t===r||Sk.misceval.richCompareBool(r,t,"Eq"))}))}return"Eq"===t?n:!n},nb$or(e){if(!(e instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;const t=this.dict$copy();return t.dict$merge(e),t},nb$reflected_or(e){return e instanceof Sk.builtin.dict?((e=e.dict$copy()).dict$merge(this),e):Sk.builtin.NotImplemented.NotImplemented$},nb$inplace_or(e){return Sk.misceval.chain(this.update$onearg(e),(()=>this))},sq$length(){return this.get$size()},sq$contains(e){return void 0!==this.mp$lookup(e)},mp$subscript(e,t){var n=this.mp$lookup(e);if(void 0!==n)return n;if(void 0!==(n=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$missing)))return e=Sk.misceval.callsimOrSuspendArray(n,[e]),t?e:Sk.misceval.retryOptionalSuspensionOrThrow(e);throw new Sk.builtin.KeyError(e)},mp$ass_subscript(e,t){if(void 0===t){if(e=this.dict$delItem(e))throw e}else this.dict$setItem(e,t)}},methods:{__reversed__:{$meth(){return new m(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a reverse iterator over the dict keys."},get:{$meth(e,t){return this.mp$lookup(e)||t||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Return the value for key if key is in the dictionary, else default."},setdefault:{$meth(e,t){if(this.ob$type!==Sk.builtin.dict){var i=this.mp$lookup(e);if(void 0!==i)return i;t||(t=Sk.builtin.none.none$),this.dict$setItem(e,t)}else{const r=n(e);if(void 0!==(i="string"==typeof r?this.entries[r]:this.get$bucket_item(e,r)))return i[1];t||(t=Sk.builtin.none.none$),"string"==typeof r?this.entries[r]=[e,t]:this.set$bucket_item(e,t,r),this.size++,this.$version++}return t},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($self, key, default=None, /)",$doc:"Insert key with a value of default if key is not in the dictionary.\n\nReturn the value for key if key is in the dictionary, else default."},pop:{$meth(e,t){const n=this.pop$item(e);if(void 0!==n)return n[1];if(void 0!==t)return t;throw new Sk.builtin.KeyError(e)},$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\nIf key is not found, d is returned if given, otherwise KeyError is raised"},popitem:{$meth(){const e=this.get$size();if(0===e)throw new Sk.builtin.KeyError("popitem(): dictionary is empty");const[t,n]=this.$items()[e-1];return this.pop$item(t),new Sk.builtin.tuple([t,n])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.popitem() -> (k, v), remove and return some (key, value) pair as a\n2-tuple; but raise KeyError if D is empty."},keys:{$meth(){return new u(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return new d(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return new c(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"},update:{$meth(e,t){return Sk.misceval.chain(this.update$common(e,t,"update"),(()=>Sk.builtin.none.none$))},$flags:{FastCall:!0},$textsig:null,$doc:"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\nIf E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\nIf E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\nIn either case, this is followed by: for k in F: D[k] = F[k]"},clear:{$meth(){return this.dict$clear(),Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"D.clear() -> None. Remove all items from D."},copy:{$meth(){return this.dict$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},classmethods:Object.assign({fromkeys:{$meth:function(e,t){t=t||Sk.builtin.none.none$;let n=this===Sk.builtin.dict?new this:this.tp$call([],[]);return Sk.misceval.chain(n,(i=>(n=i,Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>n.mp$ass_subscript(e,t,!0))))),(()=>n))},$flags:{MinArgs:1,MaxArgs:2},$textsig:"($type, iterable, value=None, /)",$doc:"Create a new dictionary with keys from iterable and values set to value."}},Sk.generic.classGetItem),proto:{quick$lookup:function(e){if(void 0!==(e=this.entries[e.$savedKeyHash]))return e[1]},mp$lookup:function(e){const t=n(e);if(void 0!==(e="string"==typeof t?this.entries[t]:this.get$bucket_item(e,t)))return e[1]},get$size(){return this.size},sk$asarray(){return this.$items().map((e=>e[0]))},update$common:function(e,t,n){let i;return Sk.abstr.checkArgsLen(n,e,0,1),void 0!==(e=e[0])&&(i=this.update$onearg(e)),Sk.misceval.chain(i,(()=>{if(t)for(let e=0;evoid 0===e))&&delete this.buckets[t],i},set$bucket_item:function(e,t,n){let i=this.buckets[n];e=[e,t],void 0===i?(this.buckets[n]=[e],n="#"+n+"_0"):-1!==(t=i.indexOf(void 0))?(n="#"+n+"_"+t,i[t]=e):(n="#"+n+"_"+i.length,i.push(e)),this.entries[n]=e},pop$item:function(e){const t=n(e);if("string"==typeof t?(e=this.entries[t],delete this.entries[t]):e=this.pop$bucket_item(e,t),void 0!==e)return this.size--,this.$version++,e},dict$merge:function(e){if(e.tp$iter!==Sk.builtin.dict.prototype.tp$iter){if(void 0===(t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$keys)))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not a mapping");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(t),(t=>Sk.misceval.iterFor(Sk.abstr.iter(t),(t=>Sk.misceval.chain(Sk.abstr.objectGetItem(e,t,!0),(e=>{this.dict$setItem(t,e)}))))))}var t=e.tp$iter();for(let n=t.tp$iternext();void 0!==n;n=t.tp$iternext()){const t=e.mp$subscript(n);this.dict$setItem(n,t)}},dict$merge_seq:function(e){let t=0;return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError("cannot convert dictionary update sequence element #"+t+" to a sequence");if(2!==(e=Sk.misceval.arrayFromIterable(e)).length)throw new Sk.builtin.ValueError("dictionary update sequence element #"+t+" has length "+e.length+"; 2 is required");this.dict$setItem(e[0],e[1]),t++}))}}});const l={tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,$r(){if(this.in$repr)return new Sk.builtin.str("...");this.in$repr=!0;let e=Sk.misceval.arrayFromIterable(this);return e=e.map((e=>Sk.misceval.objectRepr(e))),this.in$repr=!1,new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+e.join(", ")+"])")},tp$richcompare(e,t){if(!(Sk.builtin.checkAnySet(e)||e instanceof u||e instanceof d))return Sk.builtin.NotImplemented.NotImplemented$;const n=this.sq$length(),i=e.sq$length();switch(t){case"NotEq":case"Eq":let s;return this===e?s=!0:n===i&&(s=r(this,e)),"NotEq"===t?!s:s;case"Lt":return ni&&r(e,this);case"GtE":return n>=i&&r(e,this)}},nb$subtract(e){const t=i(this);return t.difference.$meth.call(t,e)},nb$and(e){const t=i(this);return t.intersection.$meth.call(t,e)},nb$or(e){const t=i(this);return t.union.$meth.call(t,e)},nb$xor(e){const t=i(this);return t.symmetric_difference.$meth.call(t,e)},sq$length(){return this.dict.get$size()}};var u=s("dict_keys",{sq$contains(e){return void 0!==this.dict.mp$lookup(e)},tp$iter(){return new f(this.dict)}},(function(){return new m(this.dict)})),c=s("dict_values",{tp$iter(){return new p(this.dict)}},(function(){return new b(this.dict)})),d=s("dict_items",{sq$contains(e){if(!(e instanceof Sk.builtin.tuple&&2===e.sq$length()))return!1;var t=e.mp$subscript(new Sk.builtin.int_(0));return e=e.mp$subscript(new Sk.builtin.int_(1)),void 0!==(t=this.dict.mp$lookup(t))&&(t===e||Sk.misceval.richCompareBool(t,e,"Eq"))},tp$iter(){return new h(this.dict)}},(function(){return new _(this.dict)})),f=o("dict_keyiterator",(function(){const e=this.next$item();return e&&e[0]})),h=o("dict_itemiterator",(function(){const e=this.next$item();return e&&new Sk.builtin.tuple([e[0],e[1]])})),p=o("dict_valueiterator",(function(){const e=this.next$item();return e&&e[1]})),m=o("dict_reversekeyiterator",f.prototype.tp$iternext,!0),_=o("dict_reverseitemiterator",h.prototype.tp$iternext,!0),b=o("dict_reversevalueiterator",p.prototype.tp$iternext,!0);Sk.builtin.dict.py2$methods={has_key:{$name:"has_key",$flags:{OneArg:!0},$meth(e){return new Sk.builtin.bool(this.sq$contains(e))},$doc:"D.has_key(k) -> True if D has a key k, else False"},keys:{$name:"keys",$meth(){return new Sk.builtin.list(this.sk$asarray())},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$name:"items",$meth(){return new Sk.builtin.list(this.$items().map((e=>{var[t,n]=e;return new Sk.builtin.tuple([t,n])})))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$name:"values",$meth(){return new Sk.builtin.list(this.$items().map((e=>([,e]=e,e))))},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> an object providing a view on D's values"}}},function(e,t){Sk.builtin.mappingproxy=Sk.abstr.buildNativeClass("mappingproxy",{constructor:function(e){if(Sk.asserts.assert(this instanceof Sk.builtin.mappingproxy,"bad call to mapping proxy, use 'new'"),void 0!==e){const t=e.constructor;t===Object||null===t||e.hasOwnProperty("sk$object")?(this.mapping=new Sk.builtin.dict([]),function(e,t){Object.defineProperties(e,{entries:{get:()=>{const e=Object.create(null);return Object.entries(t).forEach((t=>{var[n,i]=t;(n=Sk.unfixReserved(n)).includes("$")||(n=new Sk.builtin.str(n),e[n.$savedKeyHash]=[n,i])})),e},configurable:!0},size:{get:()=>Object.keys(t).map((e=>Sk.unfixReserved(e))).filter((e=>!e.includes("$"))).length,configurable:!0}})}(this.mapping,e)):Sk.builtin.checkMapping(e)?this.mapping=e:Sk.asserts.fail("unhandled case for mappingproxy")}},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$new(e,t){if(Sk.abstr.checkNoKwargs("mappingproxy",t),Sk.abstr.checkOneArg("mappingproxy",e,t),e=e[0],!Sk.builtin.checkMapping(e))throw new Sk.builtin.TypeError("mappingproxy() argument must be a mapping, not "+Sk.abstr.typeName(e));return(t=new Sk.builtin.mappingproxy).mapping=e,t},tp$richcompare(e,t){return Sk.misceval.richCompareBool(this.mapping,e,t)},tp$str(){return this.mapping.tp$str()},$r(){return new Sk.builtin.str("mappingproxy("+Sk.misceval.objectRepr(this.mapping)+")")},mp$subscript(e,t){return this.mapping.mp$subscript(e,t)},sq$contains(e){return this.mapping.sq$contains(e)},sq$length(){return this.mapping.sq$length()},tp$iter(){return this.mapping.tp$iter()},tp$as_number:!0,nb$or(e){return e instanceof Sk.builtin.mappingproxy&&(e=e.mapping),Sk.abstr.numberBinOp(this.mapping,e,"BitOr")},nb$reflected_or(e){return e instanceof Sk.builtin.mappingproxy&&(e=e.mapping),Sk.abstr.numberBinOp(e,this.mapping,"BitOr")},nb$inplace_or(e){throw new Sk.builtin.TypeError("'|=' is not supported by "+Sk.abstr.typeName(this)+"; use '|' instead")}},methods:{get:{$meth(e,t){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$get),e,t)},$flags:{FastCall:!0},$textsig:null,$doc:"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None."},keys:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$keys),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.keys() -> a set-like object providing a view on D's keys"},items:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$items),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.items() -> a set-like object providing a view on D's items"},values:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$values),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.values() -> a set-like object providing a view on D's values"},copy:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$copy),[])},$flags:{NoArgs:!0},$textsig:null,$doc:"D.copy() -> a shallow copy of D"}},classmethods:Sk.generic.classGetItem,proto:{str$get:new Sk.builtin.str("get"),str$copy:new Sk.builtin.str("copy"),str$keys:new Sk.builtin.str("keys"),str$items:new Sk.builtin.str("items"),str$values:new Sk.builtin.str("values"),mp$lookup(e){return this.mapping.mp$lookup(e)}},flags:{sk$unacceptableBase:!0}})},function(e,t){function n(e,t,n){try{const i=t.tp$getattr(n);e.tp$setattr(n,i)}catch(e){}}function i(e,t){n(e,t,Sk.builtin.str.$module),n(e,t,Sk.builtin.str.$name),n(e,t,Sk.builtin.str.$qualname),n(e,t,Sk.builtin.str.$doc),n(e,t,Sk.builtin.str.$ann)}Sk.builtin.property=Sk.abstr.buildNativeClass("property",{constructor:function(e,t,n,i){this.prop$get=e||Sk.builtin.none.none$,this.prop$set=t||Sk.builtin.none.none$,this.prop$del=n||Sk.builtin.none.none$,this.getter$doc=e&&!i,this.prop$doc=i||e&&e.$doc||Sk.builtin.none.none$},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){e=Sk.abstr.copyKeywordsToNamedArgs("property",["fget","fset","fdel","doc"],e,t,Array(4).fill(Sk.builtin.none.none$)),this.prop$get=e[0],this.prop$set=e[1],this.prop$del=e[2],Sk.builtin.checkNone(e[3])?(this.getter$doc=!0,Sk.builtin.checkNone(e[0])||(this.prop$doc=e[0].$doc||e[3])):this.prop$doc=e[3],this.ob$type!==Sk.builtin.property&&this.tp$setattr(Sk.builtin.str.$doc,this.prop$doc)},tp$doc:"Property attribute.\n\n fget\n function to be used for getting an attribute value\n fset\n function to be used for setting an attribute value\n fdel\n function to be used for del'ing an attribute\n doc\n docstring\n\nTypical use is to define a managed attribute x:\n\nclass C(object):\n def getx(self): return self._x\n def setx(self, value): self._x = value\n def delx(self): del self._x\n x = property(getx, setx, delx, 'I'm the 'x' property.')\n\nDecorators make defining new properties or modifying existing ones easy:\n\nclass C(object):\n @property\n def x(self):\n 'I am the 'x' property.'\n return self._x\n @x.setter\n def x(self, value):\n self._x = value\n @x.deleter\n def x(self):\n del self._x",tp$descr_get(e,t,n){if(null===e)return this;if(void 0===this.prop$get)throw new Sk.builtin.AttributeError("unreadable attribute");return e=Sk.misceval.callsimOrSuspendArray(this.prop$get,[e]),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e)},tp$descr_set(e,t,n){let i;if(i=null==t?this.prop$del:this.prop$set,Sk.builtin.checkNone(i))throw new Sk.builtin.AttributeError("can't "+(null==t?"delete":"set")+" attribute");if(!i.tp$call)throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(i)+"' is not callable");return e=null==t?i.tp$call([e]):i.tp$call([e,t]),n?e:Sk.misceval.retryOptionalSuspensionOrThrow(e)}},methods:{getter:{$meth(e){return this.$copy([e,this.prop$set,this.prop$del])},$flags:{OneArg:!0}},setter:{$meth(e){return this.$copy([this.prop$get,e,this.prop$del])},$flags:{OneArg:!0}},deleter:{$meth(e){return this.$copy([this.prop$get,this.prop$set,e])},$flags:{OneArg:!0}}},getsets:{fget:{$get(){return this.prop$get}},fset:{$get(){return this.prop$set}},fdel:{$get(){return this.prop$del}},__doc__:{$get(){return this.prop$doc},$set(e){this.prop$doc=e=e||Sk.builtin.none.none$}}},proto:{$copy(e){const t=this.ob$type;return this.getter$doc||e.push(this.prop$doc),t===Sk.builtin.property?new t(...e):t.tp$call(e)}}}),Sk.builtin.classmethod=Sk.abstr.buildNativeClass("classmethod",{constructor:function(e){this.cm$callable=e,this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){Sk.abstr.checkNoKwargs("classmethod",t),Sk.abstr.checkArgsLen("classmethod",e,1,1),this.cm$callable=e[0],i(this,e[0])},$r(){return new Sk.builtin.str(``)},tp$doc:"classmethod(function) -> method\n\nConvert a function to be a class method.\n\nA class method receives the class as implicit first argument,\njust like an instance method receives the instance.\nTo declare a class method, use this idiom:\n\n class C:\n @classmethod\n def f(cls, arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\nIf a class method is called for a derived class, the derived class\nobject is passed as the implied first argument.\n\nClass methods are different than C++ or Java static methods.\nIf you want those, see the staticmethod builtin.",tp$descr_get(e,t,n){const i=this.cm$callable;if(void 0===i)throw new Sk.builtin.RuntimeError("uninitialized classmethod object");return null==t&&(t=e.ob$type),(e=i.tp$descr_get)?e.call(i,t,null,n):new Sk.builtin.method(i,t)}},getsets:{__func__:{$get(){return this.cm$callable}},__wrapped__:{$get(){return this.cm$callable}},__dict__:Sk.generic.getSetDict}}),Sk.builtin.staticmethod=Sk.abstr.buildNativeClass("staticmethod",{constructor:function(e){this.sm$callable=e,this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(e,t){Sk.abstr.checkNoKwargs("staticmethod",t),Sk.abstr.checkArgsLen("staticmethod",e,1,1),this.sm$callable=e[0],i(this,e[0])},$r(){return new Sk.builtin.str(``)},tp$call(e,t){return Sk.misceval.callsimOrSuspendArray(this.sm$callable,e,t)},tp$doc:"staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n class C:\n @staticmethod\n def f(arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.",tp$descr_get(e,t){if(void 0===this.sm$callable)throw new Sk.builtin.RuntimeError("uninitialized staticmethod object");return this.sm$callable}},getsets:{__func__:{$get(){return this.sm$callable}},__wrapped__:{$get(){return this.sm$callable}},__dict__:Sk.generic.getSetDict}})},function(e,t){function n(e,t){return function(n){if(!(n instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let i=this.v;if(n=n.v,"number"==typeof i&&"number"==typeof n){const t=e(i,n);if(d(t))return new Sk.builtin.int_(t)}return i=h(i),n=h(n),new Sk.builtin.int_(t(i,n))}}function i(e,t){return function(n){if(!(n instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let i=this.v;return n=n.v,"number"==typeof i&&"number"==typeof n?e(i,n):(i=h(i),n=h(n),t(i,n))}}function r(e,t){return function(){let n=this.v;if("number"==typeof n){const t=e(n);if(void 0!==t)return new Sk.builtin.int_(t);n=h(n)}return new Sk.builtin.int_(t(n))}}function s(){return new Sk.builtin.int_(this.v)}function o(e,t){return function(n){if(!(n instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let i=this.v;if(0===(n=n.v))throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return"number"==typeof i&&"number"==typeof n?new Sk.builtin.int_(e(i,n)):(i=h(i),n=h(n),new Sk.builtin.int_(JSBI.numberIfSafe(t(i,n))))}}function a(e,t){return function(n){if(!(n instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;if(n.nb$isnegative())throw new Sk.builtin.ValueError("negative shift count");let i=this.v;if(0===i)return new Sk.builtin.int_(0);if(n=n.v,"number"==typeof i&&"number"==typeof n&&53>n){const t=e(i,n);if(void 0!==t)return new Sk.builtin.int_(t)}return i=h(i),n=h(n),new Sk.builtin.int_(t(i,n))}}function l(e,t){return function(n){if(!(n instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let i=this.v;return n=n.v,"number"==typeof i&&"number"==typeof n&&Math.abs(i)=-Number.MAX_SAFE_INTEGER}function f(e){return e<=Number.MAX_SAFE_INTEGER&&e>=-Number.MAX_SAFE_INTEGER?+e:JSBI.BigInt(e)}function h(e){return"number"==typeof e?JSBI.BigInt(e):e}function p(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("'byteorder' must be str, not "+Sk.abstr.typeName(e));if("little"===(e=e.toString()))return 1;if("big"===e)return 0;throw new Sk.builtin.ValueError("byteorder must be either 'little' or 'big'")}Sk.builtin.int_=Sk.abstr.buildNativeClass("int",{constructor:function(e){let t;if(Sk.asserts.assert(this instanceof Sk.builtin.int_,"bad call to int use 'new'"),"number"==typeof e){if(-6e)return w[e];t=e}else if(JSBI.__isBigInt(e))t=e;else{if(void 0===e)return x;if("string"==typeof e)t=f(e);else{if(e.nb$int)return e.nb$int();Sk.asserts.fail("bad argument to int constructor")}}this.v=t},slots:{tp$as_number:!0,tp$doc:"int(x=0) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given. If x is a number, return x.__int__(). For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4",$r(){return new Sk.builtin.str(this.v.toString())},tp$hash(){var e=this.v;if("number"==typeof e){if(-1===e)return-2;if(536870911>e&&-536870911e==t),JSBI.equal),ob$ne:i(((e,t)=>e!=t),JSBI.notEqual),ob$gt:i(((e,t)=>e>t),JSBI.greaterThan),ob$ge:i(((e,t)=>e>=t),JSBI.greaterThanOrEqual),ob$lt:i(((e,t)=>ee<=t),JSBI.lessThanOrEqual),nb$int:s,nb$index(){return this.v},nb$float(){var e=this.v;if("number"==typeof e)return new Sk.builtin.float_(e);if(1/0===(e=parseFloat(JSBI.toNumber(e)))||-1/0===e)throw new Sk.builtin.OverflowError("int too large to convert to float");return new Sk.builtin.float_(e)},nb$isnegative(){const e=this.v;return"number"==typeof e?0>e:JSBI.lessThan(e,JSBI.__ZERO)},nb$ispositive(){const e=this.v;return"number"==typeof e?0<=e:JSBI.greaterThanOrEqual(e,JSBI.__ZERO)},nb$bool(){return 0!==this.v},nb$positive:s,nb$negative:r((e=>-e),JSBI.unaryMinus),nb$add:n(((e,t)=>e+t),((e,t)=>JSBI.numberIfSafe(JSBI.add(e,t)))),nb$subtract:n(((e,t)=>e-t),((e,t)=>JSBI.numberIfSafe(JSBI.subtract(e,t)))),nb$multiply:n(((e,t)=>e*t),((e,t)=>e===JSBI.__ZERO||t===JSBI.__ZERO?0:JSBI.multiply(e,t))),nb$divide:function(e){if(!Sk.__future__.python3)return this.nb$floor_divide(e);if(!(e instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;var t=this.v,n=e.v;if(0===n)throw new Sk.builtin.ZeroDivisionError("division by zero");if("number"==typeof t&&"number"==typeof n)return new Sk.builtin.float_(t/n);if(t=h(t),n=h(n),e=JSBI.lessThan(JSBI.bitwiseXor(t,n),JSBI.__ZERO),JSBI.equal(t,JSBI.__ZERO))return new Sk.builtin.float_(e?-0:0);if(t=u(t),n=u(n),JSBI.greaterThanOrEqual(t,JSBI.multiply(S,n)))throw new Sk.builtin.OverflowError("int/int too large to represent as a float");var i=t.toString(2).length-n.toString(2).length,r=JSBI.BigInt(0>i?-i:i);if((0<=i&&JSBI.greaterThanOrEqual(t,JSBI.multiply(JSBI.exponentiate(g,r),n))||0>i&&JSBI.greaterThanOrEqual(JSBI.multiply(t,JSBI.exponentiate(g,r)),n))&&(i+=1),i=Math.max(i,b)-_,t=JSBI.leftShift(t,JSBI.BigInt(Math.max(-i,0))),n=JSBI.leftShift(n,JSBI.BigInt(Math.max(i,0))),r=JSBI.divide(t,n),t=JSBI.remainder(t,n),t=JSBI.multiply(g,t),(JSBI.greaterThan(t,n)||JSBI.equal(t,n)&&JSBI.equal(JSBI.remainder(r,g),k))&&(r=JSBI.add(r,k)),1/0===(r=JSBI.toNumber(r))||-1/0===r)throw new Sk.builtin.OverflowError("int/int too large to represent as a float");return n=r*Math.pow(2,i),new Sk.builtin.float_(e?-n:n)},nb$floor_divide:o(((e,t)=>Math.floor(e/t)),c),nb$remainder:o(((e,t)=>e-Math.floor(e/t)*t),((e,t)=>JSBI.subtract(e,JSBI.multiply(t,c(e,t))))),nb$divmod(e){const t=this.nb$floor_divide(e);return e=this.nb$remainder(e),t===Sk.builtin.NotImplemented.NotImplemented$||e===Sk.builtin.NotImplemented.NotImplemented$?Sk.builtin.NotImplemented.NotImplemented$:new Sk.builtin.tuple([t,e])},nb$and:l(((e,t)=>e&t),JSBI.bitwiseAnd),nb$or:l(((e,t)=>e|t),JSBI.bitwiseOr),nb$xor:l(((e,t)=>e^t),JSBI.bitwiseXor),nb$abs:r(Math.abs,u),nb$lshift:a(((e,t)=>{if(d(e=2*e*$[t]))return e}),JSBI.leftShift),nb$rshift:a(((e,t)=>{Math.floor(e/$[t+1])}),((e,t)=>JSBI.numberIfSafe(JSBI.signedRightShift(e,t)))),nb$invert:r((e=>Math.abs(e)JSBI.numberIfSafe(JSBI.bitwiseNot(e)))),nb$power(e,t){let n;if(void 0!==t&&Sk.builtin.checkNone(t)&&(t=void 0),!(e instanceof Sk.builtin.int_&&(void 0===t||t instanceof Sk.builtin.int_)))return Sk.builtin.NotImplemented.NotImplemented$;const i=e.nb$isnegative();if(i&&void 0===t)return this.nb$float().nb$power(e.nb$float());let r=this.v;if(e=e.v,"number"==typeof r&&"number"==typeof e){const i=Math.pow(r,e);if(d(i)&&(n=new Sk.builtin.int_(i),void 0===t))return n}if(void 0!==t){if(i)throw new Sk.builtin.ValueError("pow() 2nd argument cannot be negative when 3rd argument specified");if(0===t.v)throw new Sk.builtin.ValueError("pow() 3rd argument cannot be 0");return void 0!==n?n.nb$remainder(t):new Sk.builtin.int_(JSBI.numberIfSafe(JSBI.powermod(h(r),h(e),h(t.v))))}return new Sk.builtin.int_(JSBI.exponentiate(h(r),h(e)))},nb$long(){return new Sk.builtin.lng(this.v)}},getsets:{real:{$get:s,$doc:"the real part of a complex number"},imag:{$get:()=>x,$doc:"the imaginary part of a complex number"},numerator:{$get:s},denominator:{$get:()=>A}},classmethods:{from_bytes:{$meth(e,t){Sk.abstr.checkArgsLen("from_bytes",e,0,2);let[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("from_bytes",["bytes","byteorder","signed"],e,t,[Sk.builtin.bool.false$]);if(e=p(i),n instanceof Sk.builtin.bytes||(n=Sk.misceval.callsimArray(Sk.builtin.bytes,[n])),Sk.misceval.isTrue(r))throw new Sk.builtin.NotImplementedError("from_bytes with signed=True is not yet implemented in Skulpt");const s=[];return n.valueOf().forEach((e=>{s.push(e.toString(16).padStart(2,"0"))})),e&&s.reverse(),e=new Sk.builtin.int_(JSBI.numberIfSafe(JSBI.BigInt("0x"+(s.join("")||"0")))),this===Sk.builtin.int_?e:Sk.misceval.callsimArray(this,[e])},$flags:{FastCall:!0}}},methods:{conjugate:{$meth:s,$flags:{NoArgs:!0},$textsig:null,$doc:"Returns self, the complex conjugate of any int."},bit_length:{$meth(){let e=this.v;return 0===e?new Sk.builtin.int_(0):(e="number"==typeof e?Math.abs(e):u(e),new Sk.builtin.int_(e.toString(2).length))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Number of bits necessary to represent self in binary.\n\n>>> bin(37)\n'0b100101'\n>>> (37).bit_length()\n6"},to_bytes:{$meth(e,t){Sk.abstr.checkArgsLen("to_bytes",e,0,2);let[n,i,r]=Sk.abstr.copyKeywordsToNamedArgs("to_bytes",["length","byteorder","signed"],e,t,[Sk.builtin.bool.false$]);if(e=p(i),n=Sk.misceval.asIndexSized(n,Sk.builtin.OverflowError),0>n)throw new Sk.builtin.ValueError("length argument must be non-negative");if(Sk.misceval.isTrue(r))throw new Sk.builtin.NotImplementedError("to_bytes with signed=True is not yet implemented in Skulpt");if(this.nb$isnegative())throw new Sk.builtin.OverflowError("can't convert negative int to unsigned");(t=JSBI.BigInt(this.v).toString(16)).length%2&&(t="0"+t);var s=t.length/2;if(s>n){if(0===n&&"00"===t)return new Sk.builtin.bytes;throw new Sk.builtin.OverflowError("int too big to convert")}const o=Array(n).fill(0);s=n-s;let a=0;for(;sMath.abs(t)?new Sk.builtin.int_(0):Sk.__future__.bankers_rounding?(t/=e,n=Math.round(t),new Sk.builtin.int_((.5==(0t||36= 2 and <= 36");if("string"==typeof t&&(t=Number(t)),"0x"===e.substring(0,2).toLowerCase()){if(16===t||0===t)e=e.substring(2),t=16;else if(34>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0b"===e.substring(0,2).toLowerCase()){if(2===t||0===t)e=e.substring(2),t=2;else if(12>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0o"===e.substring(0,2).toLowerCase()){if(8===t||0===t)e=e.substring(2),t=8;else if(25>t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}else if("0"===e.charAt(0)){if("0"===e)return 0;8!==t&&0!==t||(t=8)}if(0===t&&(t=10),-1!==e.indexOf("_")){if(-1!==e.indexOf("__"))throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'");e=10!==t?e.replace(y,""):e.charAt(0)+e.substring(1).replace(y,"")}if(0===e.length)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'");for(n=0;n=s?o=s-48:65<=s&&90>=s?o=s-65+10:97<=s&&122>=s&&(o=s-97+10),o>=t)throw new Sk.builtin.ValueError("invalid literal for int() with base "+t+": '"+i+"'")}if(r&&(e="-"+e),d(o=parseInt(e,t)))return o;for(i=!1,"-"===e[0]&&(i=!0,e=e.substring(1)),t=JSBI.BigInt(t),r=k,n=JSBI.__ZERO,s=e.length-1;0<=s;s--)48<=(o=e.charCodeAt(s))&&57>=o?o-=48:65<=o&&90>=o?o=o-65+10:97<=o&&122>=o&&(o=o-97+10),o=JSBI.multiply(JSBI.BigInt(o),r),n=JSBI.add(n,o),r=JSBI.multiply(r,t);return i&&(n=JSBI.multiply(n,JSBI.BigInt(-1))),n},Sk.builtin.int_.py2$methods={},Sk.longFromStr=function(e,t){return Sk.__future__.python3?new Sk.builtin.int_(f(e)):(e=Sk.str2number(e,t),new Sk.builtin.lng(e))},Sk.exportSymbol("Sk.longFromStr",Sk.longFromStr),Sk.builtin.int_.withinThreshold=d,Sk.builtin.int_.stringToNumberOrBig=f;const $=[.5,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,0x800000000000,281474976710656,562949953421312,0x4000000000000,0x8000000000000,4503599627370496,9007199254740992];Sk.builtin.lng=Sk.abstr.buildNativeClass("long",{base:Sk.builtin.int_,constructor:function(e){void 0!==(e=Sk.builtin.int_.call(this,e))&&(this.v=e.v)},slots:{$r(){return new Sk.builtin.str(this.v.toString()+"L")},tp$as_number:!0,nb$negative(){return new Sk.builtin.lng(v.nb$negative.call(this).v)},nb$positive(){return new Sk.builtin.lng(v.nb$positive.call(this).v)}}});const v=Sk.builtin.int_.prototype,w=[];for(e=-5;257>e;e++)w[e]=Object.create(Sk.builtin.int_.prototype,{v:{value:e}});const x=w[0],A=w[1]},function(e,t){const n=Sk.builtin.int_.prototype;Sk.builtin.bool=Sk.abstr.buildNativeClass("bool",{constructor:function(e){return Sk.misceval.isTrue(e)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},base:Sk.builtin.int_,slots:{tp$doc:"bool(x) -> bool\n\nReturns True when the argument x is true, False otherwise.\nThe builtins True and False are the only two instances of the class bool.\nThe class bool is a subclass of the class int, and cannot be subclassed.",tp$new:(e,t)=>(Sk.abstr.checkNoKwargs("bool",t),Sk.abstr.checkArgsLen("bool",e,0,1),new Sk.builtin.bool(e[0])),$r(){return this.v?this.str$True:this.str$False},tp$as_number:!0,nb$and(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v&e.v):n.nb$and.call(this,e)},nb$or(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v|e.v):n.nb$or.call(this,e)},nb$xor(e){return e.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v^e.v):n.nb$xor.call(this,e)}},flags:{sk$unacceptableBase:!0},methods:{__format__:{$meth(){return this.$r()},$flags:{OneArg:!0}}},proto:{str$False:new Sk.builtin.str("False"),str$True:new Sk.builtin.str("True"),valueOf(){return!!this.v}}}),Sk.exportSymbol("Sk.builtin.bool",Sk.builtin.bool),Sk.builtin.bool.true$=Object.create(Sk.builtin.bool.prototype,{v:{value:1,enumerable:!0}}),Sk.builtin.bool.false$=Object.create(Sk.builtin.bool.prototype,{v:{value:0,enumerable:!0}})},function(e,t){function n(e){const t=[e,0];if(0===e)return t;var n=Math.abs(e);let i=Math.max(-1023,Math.floor(Math.log2(n))+1);for(n*=Math.pow(2,-i);.5>n;)n*=2,i--;for(;1<=n;)n*=.5,i++;return 0>e&&(n=-n),t[0]=n,t[1]=i,t}function i(){return new Sk.builtin.float_(this.v)}function r(e){return function(t){const n=this.v;if("number"!=typeof(t=t.v)){if(!JSBI.__isBigInt(t))return Sk.builtin.NotImplemented.NotImplemented$;if(1/0==(t=parseFloat(JSBI.toNumber(t)))||-1/0==t)throw new Sk.builtin.OverflowError("int too large to convert to float")}return e(n,t)}}function s(e,t){return function(n){const i=this.v;if("number"!=typeof(n=n.v)){if(!JSBI.__isBigInt(n))return Sk.builtin.NotImplemented.NotImplemented$;if(void 0!==t)return t(i,n)}return e(i,n)}}function o(e){const t=r(e);return function(e,n){if(void 0!==n&&!Sk.builtin.checkNone(n))throw new Sk.builtin.TypeError("pow() 3rd argument not allowed unless all arguments are integers");return t.call(this,e)}}function a(e,t){if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return 1/0===e?1/0===t||-1/0===e?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(-1/0):new Sk.builtin.float_(1/0):-1/0===e?1/0===t||-1/0===e?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(1/0):new Sk.builtin.float_(-1/0):new Sk.builtin.float_(e/t)}function l(e,t){if(1/0===e||-1/0===e)return new Sk.builtin.float_(NaN);if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");return 1/0===t?0>e?new Sk.builtin.float_(-1):new Sk.builtin.float_(0):-1/0===t?0>e||0!==e?new Sk.builtin.float_(0):new Sk.builtin.float_(-1):new Sk.builtin.float_(Math.floor(e/t))}function u(e,t){if(0===t)throw new Sk.builtin.ZeroDivisionError("integer division or modulo by zero");if(0===e)return new Sk.builtin.float_(0);if(1/0===t)return 1/0===e||-1/0===e?new Sk.builtin.float_(NaN):0e?0n&&(n+=t):0>t&&0!==n&&(n+=t),0===n&&(0>t?n=-0:-1/0==1/0/n&&(n=0)),new Sk.builtin.float_(n)}function c(e,t){if(0>e&&0!=t%1)return new Sk.builtin.complex(e,0).nb$power(new Sk.builtin.complex(t,0));if(0===e&&0>t)throw new Sk.builtin.ZeroDivisionError("0.0 cannot be raised to a negative power");const n=Math.pow(e,t);if(1/0===Math.abs(n)&&1/0!==Math.abs(e)&&1/0!==Math.abs(t))throw new Sk.builtin.OverflowError("Numerical result out of range");return new Sk.builtin.float_(n)}Sk.builtin.float_=Sk.abstr.buildNativeClass("float",{constructor:function(e){if(Sk.asserts.assert(this instanceof Sk.builtin.float_,"bad call to float use 'new'"),"number"==typeof e)this.v=e;else if(void 0===e)this.v=0;else if("string"==typeof e)this.v=parseFloat(e);else{if(e.nb$float)return e.nb$float();Sk.asserts.fail("bad argument to float constructor")}},slots:{tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$doc:"Convert a string or number to a floating point number, if possible.",tp$hash(){var e=this.v;if(!Number.isFinite(e))return Number.isNaN(e)?0:0t&&(e=-1,t=-t);let r,s=0;for(;t;)s=s<<28&536870911|s>>1,t*=268435456,i-=28,r=Math.trunc(t),t-=r,s+=r,536870911<=s&&(s-=536870911);return i=0<=i?i%29:28-(-1-i)%29,s=(s<>29-i)*e,-1===s?-2:s},$r(){return new Sk.builtin.str(this.str$(10,!0))},tp$new(e,t){if(t&&t.length)throw new Sk.builtin.TypeError("float() takes no keyword arguments");if(e&&1e?Math.ceil(e):Math.floor(e),Sk.builtin.int_.withinThreshold(e)?new Sk.builtin.int_(e):new Sk.builtin.int_(JSBI.BigInt(e))},nb$float:i,nb$long(){return new Sk.builtin.lng(this.nb$int().v)},nb$add:r(((e,t)=>new Sk.builtin.float_(e+t))),nb$subtract:r(((e,t)=>new Sk.builtin.float_(e-t))),nb$reflected_subtract:r(((e,t)=>new Sk.builtin.float_(t-e))),nb$multiply:r(((e,t)=>new Sk.builtin.float_(e*t))),nb$divide:r(a),nb$reflected_divide:r(((e,t)=>a(t,e))),nb$floor_divide:r(l),nb$reflected_floor_divide:r(((e,t)=>l(t,e))),nb$remainder:r(u),nb$reflected_remainder:r(((e,t)=>u(t,e))),nb$divmod:r(((e,t)=>new Sk.builtin.tuple([l(e,t),u(e,t)]))),nb$reflected_divmod:r(((e,t)=>new Sk.builtin.tuple([l(t,e),u(t,e)]))),nb$power:o(c),nb$reflected_power:o(((e,t)=>c(t,e))),nb$abs(){return new Sk.builtin.float_(Math.abs(this.v))},nb$negative(){return new Sk.builtin.float_(-this.v)},nb$positive(){return new Sk.builtin.float_(this.v)},nb$bool(){return 0!==this.v},nb$isnegative(){return 0>this.v},nb$ispositive(){return 0<=this.v},ob$eq:s(((e,t)=>e==t),JSBI.EQ),ob$ne:s(((e,t)=>e!=t),JSBI.NE),ob$gt:s(((e,t)=>e>t),JSBI.GT),ob$ge:s(((e,t)=>e>=t),JSBI.GE),ob$lt:s(((e,t)=>ee<=t),JSBI.LE)},getsets:{real:{$get:i,$doc:"the real part of a complex number"},imag:{$get:()=>new Sk.builtin.float_(0),$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth:i,$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return self, the complex conjugate of any float."},__trunc__:{$meth(){return this.nb$int()},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return the Integral closest to x between 0 and x."},__round__:{$meth(e){return this.round$(e)},$flags:{MinArgs:0,MaxArgs:1},$textsig:"($self, ndigits=None, /)",$doc:"Return the Integral closest to x, rounding half toward even.\n\nWhen an argument is passed, work like built-in round(x, ndigits)."},as_integer_ratio:{$meth(){if(!Number.isFinite(this.v)){if(Number.isNaN(this.v))throw new Sk.builtin.ValueError("cannot convert NaN to integer ratio");throw new Sk.builtin.OverflowError("cannot convert Infinity to integer ratio")}let[e,t]=n(this.v);for(var i=0;300>i&&e!=Math.floor(e);i++)e*=2,t--;i=new Sk.builtin.int_(Math.abs(t));let r=new Sk.builtin.int_(e),s=new Sk.builtin.int_(1);return 0>> (10.0).as_integer_ratio()\n(10, 1)\n>>> (0.0).as_integer_ratio()\n(0, 1)\n>>> (-.25).as_integer_ratio()\n(-1, 4)"},is_integer:{$meth(){return new Sk.builtin.bool(Number.isInteger(this.v))},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:"Return True if the float is an integer."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([this])},$flags:{NoArgs:!0},$textsig:"($self, /)",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!0),$flags:{OneArg:!0},$textsig:"($self, format_spec, /)",$doc:Sk.builtin.none.none$}},proto:{valueOf(){return this.v}}});const d=/_[eE]|[eE]_|\._|_\.|[+-]_|__/,f=/_(?=[^_])/g;Sk.builtin.float_.PyFloat_Check=function(e){return void 0!==e&&!!(Sk.builtin.checkNumber(e)||Sk.builtin.checkFloat(e)||e.ob$type.$isSubType(Sk.builtin.float_))},Sk.builtin.float_.prototype.toFixed=function(e){return e=Sk.builtin.asnum$(e),this.v.toFixed(e)},Sk.builtin.float_.prototype.round$=function(e){var t=Sk.builtin.asnum$(this),n=void 0===e?0:Sk.misceval.asIndexSized(e);if(Sk.__future__.bankers_rounding){t*=Math.pow(10,n);var i=Math.round(t);return n=(.5==(0n.length?t.toExponential():t.toExponential(11)),0>n.indexOf("e")&&0<=n.indexOf(".")){for(;"0"==n.charAt(n.length-1);)n=n.substring(0,n.length-1);"."==n.charAt(n.length-1)&&(n+="0")}n=(n=(n=n.replace(/\.0+e/,"e","i")).replace(/(e[-+])([1-9])$/,"$10$2")).replace(/0+(e.*)/,"$1")}else n=t.toString(e);return 0===this.v&&-1/0==1/this.v&&(n="-"+n),0>n.indexOf(".")&&0>n.indexOf("E")&&0>n.indexOf("e")&&(n+=".0"),n},Sk.builtin.float_.py2$methods={}},function(e,t){function n(e){let t=e.v;if("number"==typeof t)return t;if(e.nb$float&&(t=e.nb$float()),void 0===t)throw new Sk.builtin.TypeError("a float is required");return t.v}function i(e,t,n){return n===Sk.builtin.complex.prototype?new Sk.builtin.complex(e,t):(n=new n.constructor,Sk.builtin.complex.call(n,e,t),n)}function r(e,t){return function(n){const i=this.real,r=this.imag;var s=n.real;const o=n.v;if("number"==typeof s)n=n.imag;else if("number"==typeof o)s=o,n=0;else{if(!JSBI.__isBigInt(o))return Sk.builtin.NotImplemented.NotImplemented$;if(void 0===t){if(1/0==(s=parseFloat(JSBI.toNumber(o)))||-1/0==s)throw new Sk.builtin.OverflowError("int too large to convert to float")}else s=o.toString();n=0}return e(i,r,s,n)}}function s(e,t,n,i){var r=Math.abs(n);const s=Math.abs(i);if(r>=s){if(0===r)throw new Sk.builtin.ZeroDivisionError("complex division by zero");i=(e+t*(r=i/n))/(n+=i*r),e=(t-e*r)/n}else s>=r?(n=n*(r=n/i)+i,Sk.asserts.assert(0!==i),i=(e*r+t)/n,e=(t*r-e)/n):e=i=NaN;return new Sk.builtin.complex(i,e)}function o(e,t,n,i){if(0===n&&0===i){i=1;var r=0}else if(0===e&&0===t){if(0!==i||0>n)throw new Sk.builtin.ZeroDivisionError("complex division by zero");r=i=0}else{const s=Math.hypot(e,t);r=Math.pow(s,n),n*=e=Math.atan2(t,e),0!==i&&(r/=Math.exp(e*i),n+=i*Math.log(s)),i=r*Math.cos(n),r*=Math.sin(n)}return new Sk.builtin.complex(i,r)}function a(e,t,n){let i=1;var r=new Sk.builtin.complex(1,0);for(e=new Sk.builtin.complex(e,t);0=i;)n&i&&(r=new Sk.builtin.complex(r.real*e.real-r.imag*e.imag,r.real*e.imag+e.real*r.imag)),i<<=1,e=new Sk.builtin.complex(e.real*e.real-e.imag*e.imag,2*e.real*e.imag);return r}function l(e,t,n,i,r){switch(r=!1,t){case"e":case"f":case"g":break;case"E":r=!0,t="e";break;case"F":r=!0,t="f";break;case"r":if(0!==n)throw Error("Bad internall call");n=17,t="g";break;default:throw Error("Bad internall call")}if(isNaN(e))e="nan";else if(1/0===e)e="inf";else if(-1/0===e)e="-inf";else{i&l.Py_DTSF_ADD_DOT_0&&(t="g");var s="%"+(i&l.Py_DTSF_ALT?"#":"");null!=n&&(s=s+"."+n),e=(e=(s=new Sk.builtin.str(s+t)).nb$remainder(new Sk.builtin.float_(e))).v}return i&l.Py_DTSF_SIGN&&"-"!==e[0]&&(e="+"+e),r&&(e=e.toUpperCase()),e}Sk.builtin.complex=Sk.abstr.buildNativeClass("complex",{constructor:function(e,t){Sk.asserts.assert(this instanceof Sk.builtin.complex,"bad call to complex constructor, use 'new'"),this.real=e,this.imag=t},slots:{tp$as_number:!0,tp$doc:"Create a complex number from a real part and an optional imaginary part.\n\nThis is equivalent to (real + imag*1j) where imag defaults to 0.",tp$hash(){var e=new Sk.builtin.float_(this.real).tp$hash();return e=1003*new Sk.builtin.float_(this.imag).tp$hash()+e,Sk.builtin.int_.withinThreshold(e)?e:new Sk.builtin.int_(JSBI.BigInt(e)).tp$hash()},tp$getattr:Sk.generic.getAttr,tp$new(e,t){{var r,s=(e=Sk.abstr.copyKeywordsToNamedArgs("complex",["real","imag"],e,t,[null,null]))[1];let a=t=!1;var o=e[0];if(null!=o&&o.constructor===Sk.builtin.complex&&null==s)t=o;else if(Sk.builtin.checkString(o)){if(null!=s)throw new Sk.builtin.TypeError("complex() can't take second arg if first is a string");t=Sk.builtin.complex.complex_subtype_from_string(o,this)}else{if(null!=s&&Sk.builtin.checkString(s))throw new Sk.builtin.TypeError("complex() second arg can't be a string");if(null!=(e=null==o?null:void 0!==(e=Sk.abstr.lookupSpecial(o,Sk.builtin.str.$complex))?Sk.misceval.callsimArray(e,[]):null)&&e!==Sk.builtin.NotImplemented.NotImplemented$){if(!u(e))throw new Sk.builtin.TypeError("__complex__ should return a complex object");o=e}if(null!=o&&void 0===o.nb$float)throw new Sk.builtin.TypeError("complex() first argument must be a string or a number, not '"+Sk.abstr.typeName(o)+"'");if(null!=s&&void 0===s.nb$float)throw new Sk.builtin.TypeError("complex() second argument must be a number, not '"+Sk.abstr.typeName(o)+"'");null==o?o=e=0:u(o)?(e=o.real,o=o.imag,t=!0):(e=n(o),o=0),null==s?s=r=0:u(s)?(r=s.real,s=s.imag,a=!0):(r=n(s),s=0),!0===a&&(e-=s),!0===t&&(r+=o),t=i(e,r,this)}}return t},tp$richcompare(e,t){if("Eq"!==t&&"NotEq"!==t){if(Sk.builtin.checkNumber(e)||u(e))throw new Sk.builtin.TypeError("no ordering relation is defined for complex numbers");return Sk.builtin.NotImplemented.NotImplemented$}return r((function(e,n,i,r){return e=e==i&&n==r,"Eq"===t?e:!e}),!0).call(this,e)},$r(){{var e,t;let r=e="";var n=this.real,i=this.imag;(t=0===n)&&(t=1==(n?0>n?-1:1:0>1/n?-1:1)),t?(n="",t=l(i,"g",null,0,null)):(n=e=l(n,"g",null,0,null),t=l(i,"g",null,l.Py_DTSF_SIGN,null),0===i&&-1/0==1/i&&t&&"-"!==t[0]&&(t="-"+t),e="(",r=")"),i=new Sk.builtin.str(""+e+n+t+"j"+r)}return i},nb$int(){throw new Sk.builtin.TypeError("can't convert complex to int")},nb$long(){throw new Sk.builtin.TypeError("can't convert complex to long")},nb$float(){throw new Sk.builtin.TypeError("can't convert complex to float")},nb$positive(){return new Sk.builtin.complex(this.real,this.imag)},nb$negative(){return new Sk.builtin.complex(-this.real,-this.imag)},nb$bool(){return this.real||this.imag},nb$add:r(((e,t,n,i)=>new Sk.builtin.complex(e+n,t+i))),nb$subtract:r(((e,t,n,i)=>new Sk.builtin.complex(e-n,t-i))),nb$reflected_subtract:r(((e,t,n,i)=>new Sk.builtin.complex(n-e,i-t))),nb$multiply:r(((e,t,n,i)=>new Sk.builtin.complex(n*e-i*t,e*i+t*n))),nb$divide:r(s),nb$reflected_divide:r(((e,t,n,i)=>s(n,i,e,t))),nb$floor_divide(e){throw new Sk.builtin.TypeError("can't take floor of complex number.")},nb$reflected_floor_divide(e){throw new Sk.builtin.TypeError("can't take floor of complex number.")},nb$remainder(e){throw new Sk.builtin.TypeError("can't mod complex numbers.")},nb$reflected_remainder(e){throw new Sk.builtin.TypeError("can't mod complex numbers.")},nb$divmod(e){throw new Sk.builtin.TypeError("can't take floor or mod of complex number.")},nb$power(e,t){if(null!=t&&!Sk.builtin.checkNone(t))throw new Sk.builtin.ValueError("complex modulo");return h.call(this,e)},nb$reflected_power(e,t){if(null!=t&&!Sk.builtin.checkNone(t))throw new Sk.builtin.ValueError("complex modulo");return p.call(this,e)},nb$abs(){var e=this.real;const t=this.imag;if(!Number.isFinite(e)||!Number.isFinite(t))return 1/0===e||-1/0===e?new Sk.builtin.float_(Math.abs(e)):1/0===t||-1/0===t?new Sk.builtin.float_(Math.abs(t)):new Sk.builtin.float_(NaN);if(e=Math.hypot(e,t),!Number.isFinite(e))throw new Sk.builtin.OverflowError("absolute value too large");return new Sk.builtin.float_(e)}},getsets:{real:{$get(){return new Sk.builtin.float_(this.real)},$doc:"the real part of a complex number"},imag:{$get(){return new Sk.builtin.float_(this.imag)},$doc:"the imaginary part of a complex number"}},methods:{conjugate:{$meth(){return new Sk.builtin.complex(this.real,-this.imag)},$flags:{NoArgs:!0},$textsig:null,$doc:"complex.conjugate() -> complex\n\nReturn the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."},__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.float_(this.real),new Sk.builtin.float_(this.imag)])},$flags:{NoArgs:!0},$textsig:null,$doc:Sk.builtin.none.none$},__format__:{$meth(e){if(Sk.builtin.checkString(e))throw new Sk.builtin.NotImplementedError("__format__ is not implemented for complex type.");throw new Sk.builtin.TypeError("__format__ requires str")},$flags:{OneArg:!0},$textsig:null,$doc:"complex.__format__() -> str\n\nConvert to a string according to format_spec."}}}),Sk.exportSymbol("Sk.builtin.complex",Sk.builtin.complex);const u=Sk.builtin.checkComplex,c=/_[eE]|[eE]_|\._|_\.|[+-]_|_j|j_/,d=/_(?=[^_])/g;Sk.builtin.complex.complex_subtype_from_string=function(e,t){t=t||Sk.builtin.complex.prototype;var n=0,r=0,s=!1;if(Sk.builtin.checkString(e))e=Sk.ffi.remapToJs(e);else if("string"!=typeof e)throw new TypeError("provided unsupported string-alike argument");if(-1!==e.indexOf("\0")||0===e.length||""===e)throw new Sk.builtin.ValueError("complex() arg is a malformed string");var o=0;for(e=(e=e.replace(/inf|infinity/gi,"Infinity")).replace(/nan/gi,"NaN");" "===e[o];)o++;if("("===e[o])for(s=!0,o++;" "===e[o];)o++;if(-1!==e.indexOf("_")){if(c.test(e))throw new Sk.builtin.ValueError("could not convert string to complex: '"+e+"'");e=e.charAt(0)+e.substring(1).replace(d,"")}var a=/^(?:[+-]?(?:(?:(?:\d*\.\d+)|(?:\d+\.?))(?:[eE][+-]?\d+)?|NaN|Infinity))/,l=e.substr(o),u=l.match(a);if(null!==u)if("j"===e[o+=u[0].length]||"J"===e[o])r=parseFloat(u[0]),o++;else if("+"===e[o]||"-"===e[o]){if(n=parseFloat(u[0]),null!==(u=e.substr(o).match(a))?(r=parseFloat(u[0]),o+=u[0].length):(r="+"===e[o]?1:-1,o++),"j"!==e[o]&&"J"!==e[o])throw new Sk.builtin.ValueError("complex() arg is malformed string");o++}else n=parseFloat(u[0]);else null!==(u=u=l.match(/^([+-]?[jJ])/))&&(r=1===u[0].length||"+"===u[0][0]?1:-1,o+=u[0].length);for(;" "===e[o];)o++;if(s){if(")"!==e[o])throw new Sk.builtin.ValueError("complex() arg is malformed string");for(o++;" "===e[o];)o++}if(e.length!==o)throw new Sk.builtin.ValueError("complex() arg is malformed string");return i(n,r,t)};const f=(e,t,n,i)=>{const r=0|n;return 0===i&&n===r?e=100r?o(e,t,r,0):0f(n,i,e,t)));l.Py_DTSF_SIGN=1,l.Py_DTSF_ADD_DOT_0=2,l.Py_DTSF_ALT=4,l.Py_DTST_FINITE=0,l.Py_DTST_INFINITE=1,l.Py_DTST_NAN=2},function(e,t){Sk.builtin.slice=Sk.abstr.buildNativeClass("slice",{constructor:function(e,t,n){void 0===t&&void 0===n&&(t=e,e=Sk.builtin.none.none$),void 0===t&&(t=Sk.builtin.none.none$),void 0===n&&(n=Sk.builtin.none.none$),this.start=e,this.stop=t,this.step=n},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:"slice(stop)\nslice(start, stop[, step])\n\nCreate a slice object. This is used for extended slicing (e.g. a[0:10:2]).",tp$hash:Sk.builtin.none.none$,tp$new:(e,t)=>(Sk.abstr.checkNoKwargs("slice",t),Sk.abstr.checkArgsLen("slice",e,1,3),new Sk.builtin.slice(...e)),$r(){const e=Sk.misceval.objectRepr(this.start),t=Sk.misceval.objectRepr(this.stop),n=Sk.misceval.objectRepr(this.step);return new Sk.builtin.str("slice("+e+", "+t+", "+n+")")},tp$richcompare(e,t){if(e.ob$type!==Sk.builtin.slice)return Sk.builtin.NotImplemented.NotImplemented$;const n=new Sk.builtin.tuple([this.start,this.stop,this.step]);return e=new Sk.builtin.tuple([e.start,e.stop,e.step]),n.tp$richcompare(e,t)}},getsets:{start:{$get(){return this.start}},step:{$get(){return this.step}},stop:{$get(){return this.stop}}},methods:{indices:{$meth:function(e){if(0>(e=Sk.misceval.asIndexSized(e,Sk.builtin.OverflowError)))throw new Sk.builtin.TypeError("length should not be negative");const{start:t,stop:n,step:i}=this.slice$indices(e);return new Sk.builtin.tuple([new Sk.builtin.int_(t),new Sk.builtin.int_(n),new Sk.builtin.int_(i)])},$doc:"S.indices(len) -> (start, stop, stride)\n\nAssuming a sequence of length len, calculate the start and stop\nindices, and the stride length of the extended slice described by\nS. Out of bounds indices are clipped in a manner consistent with the\nhandling of normal slices.",$textsig:null,$flags:{OneArg:!0}}},proto:{slice$as_indices(e){let t;var n=e?e=>Sk.misceval.asIndexSized(e,null,"slice indices must be integers or None or have an __index__ method"):e=>Sk.misceval.asIndexOrThrow(e,"slice indices must be integers or None or have an __index__ method");if(Sk.builtin.checkNone(this.step))t=1;else if(t=n(this.step),0===t)throw new Sk.builtin.ValueError("slice step cannot be zero");return{start:e=Sk.builtin.checkNone(this.start)?null:n(this.start),stop:n=Sk.builtin.checkNone(this.stop)?null:n(this.stop),step:t}},$wrt:(e,t,n,i,r)=>(r=r?t=>JSBI.__isBigInt(t)?JSBI.add(t,JSBI.BigInt(e)):t+e:t=>t+e,0t&&0>(t=r(t)))&&(t=0),null===n||n>e?n=e:0>n&&(n=r(n))):(null===t||t>=e?t=e-1:0>t&&(t=r(t)),(null===n||0>n&&0>(n=r(n)))&&(n=-1)),{start:t,stop:n,step:i}),slice$indices(e,t){let{start:n,stop:i,step:r}=this.slice$as_indices(!0,t);return this.$wrt(e,n,i,r,t)},sssiter$(e,t){let{start:n,stop:i,step:r}=this.slice$indices(e,!0);if(0i;e+=r)t(e)}},flags:{sk$unacceptableBase:!0}}),Sk.builtin.slice.startEnd$wrt=function(e,t,n){return e=e.sq$length(),(void 0===t||Sk.builtin.checkNone(t)||0>(t=Sk.misceval.asIndexSized(t,null,"slice indices must be integers or have an __index__ method"))&&0>(t+=e))&&(t=0),void 0===n||Sk.builtin.checkNone(n)?n=e:0>(n=Sk.misceval.asIndexSized(n,null,"slice indices must be integers or have an __index__ method"))?0>(n+=e)&&(n=0):n>e&&(n=e),{start:t,end:n}}},function(e,t){function n(e){return function(t){return Sk.builtin.checkAnySet(t)?e.call(this,t):Sk.builtin.NotImplemented.NotImplemented$}}function i(e){return e instanceof Sk.builtin.set&&e.tp$hash===Sk.builtin.none.none$&&(e=new Sk.builtin.frozenset(Sk.misceval.arrayFromIterable(e))),e}e={},Sk.builtin.set=Sk.abstr.buildNativeClass("set",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.set,"Bad call to set - must be called with an Array and 'new'");const t=[];for(let n=0;n new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.",tp$init(e,t){return Sk.abstr.checkNoKwargs("set",t),Sk.abstr.checkArgsLen("set",e,0,1),this.set$clear(),(e=e[0])&&this.set$update(e)},tp$new:Sk.generic.new,$r(){if(this.in$repr)return new Sk.builtin.str(Sk.abstr.typeName(this)+"(...)");this.in$repr=!0;const e=this.sk$asarray().map((e=>Sk.misceval.objectRepr(e)));return this.in$repr=!1,Sk.__future__.python3?0===e.length?new Sk.builtin.str(Sk.abstr.typeName(this)+"()"):this.ob$type!==Sk.builtin.set?new Sk.builtin.str(Sk.abstr.typeName(this)+"({"+e.join(", ")+"})"):new Sk.builtin.str("{"+e.join(", ")+"}"):new Sk.builtin.str(Sk.abstr.typeName(this)+"(["+e.join(", ")+"])")},tp$iter(){return new r(this)},tp$richcompare(e,t){if(!Sk.builtin.checkAnySet(e))return Sk.builtin.NotImplemented.NotImplemented$;switch(t){case"NotEq":case"Eq":return e=this===e||this.get$size()===e.get$size()&&Sk.misceval.isTrue(this.set$issubset(e)),"Eq"===t?e:!e;case"LtE":return this===e||Sk.misceval.isTrue(this.set$issubset(e));case"GtE":return this===e||Sk.misceval.isTrue(e.set$issubset(this));case"Lt":return this.get$size()e.get$size()&&Sk.misceval.isTrue(e.set$issubset(this))}},nb$subtract:n((function(e){return this.difference.$meth.call(this,e)})),nb$and:n((function(e){return this.intersection.$meth.call(this,e)})),nb$or:n((function(e){return this.union.$meth.call(this,e)})),nb$xor:n((function(e){return this.symmetric_difference.$meth.call(this,e)})),nb$inplace_subtract:n((function(e){return e===this&&(e=e.set$copy()),Sk.misceval.chain(this.difference_update.$meth.call(this,e),(()=>this))})),nb$inplace_and:n((function(e){return Sk.misceval.chain(this.intersection_update.$meth.call(this,e),(()=>this))})),nb$inplace_or:n((function(e){return Sk.misceval.chain(this.update.$meth.call(this,e),(()=>this))})),nb$inplace_xor:n((function(e){return e===this&&(e=e.set$copy()),Sk.misceval.chain(this.symmetric_difference_update.$meth.call(this,e),(()=>this))})),sq$length(){return this.get$size()},sq$contains(e){return e=i(e),this.v.sq$contains(e)}},methods:{add:{$meth(e){return this.set$add(e),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Add an element to a set.\n\nThis has no effect if the element is already present."},clear:{$meth(){return this.set$clear(),Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove all elements from this set."},copy:{$meth(){return this.set$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a shallow copy of a set."},discard:{$meth(e){return e=i(e),this.set$discard(e),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:"Remove an element from a set if it is a member.\n\nIf the element is not a member, do nothing."},difference:{$meth(...e){const t=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>t.set$difference_update(e))),(()=>t))},$flags:{MinArgs:0},$textsig:null,$doc:"Return the difference of two or more sets as a new set.\n\n(i.e. all elements that are in this set but not the others.)"},difference_update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>this.set$difference_update(e))),(()=>Sk.builtin.none.none$))},$flags:{MinArgs:0},$textsig:null,$doc:"Remove all elements of another set from this set."},intersection:{$meth(...e){return this.set$intersection_multi(...e)},$flags:{MinArgs:0},$textsig:null,$doc:"Return the intersection of two sets as a new set.\n\n(i.e. all elements that are in both sets.)"},intersection_update:{$meth(...e){return Sk.misceval.chain(this.set$intersection_multi(...e),(e=>(this.swap$bodies(e),Sk.builtin.none.none$)))},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the intersection of itself and another."},isdisjoint:{$meth(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{if(this.sq$contains(e))return new Sk.misceval.Break(Sk.builtin.bool.false$)})),(e=>e||Sk.builtin.bool.true$))},$flags:{OneArg:!0},$textsig:null,$doc:"Return True if two sets have a null intersection."},issubset:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>this.set$issubset(e)))},$flags:{OneArg:!0},$textsig:null,$doc:"Report whether another set contains this set."},issuperset:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>e.set$issubset(this)))},$flags:{OneArg:!0},$textsig:null,$doc:"Report whether this set contains another set."},pop:{$meth(){if(0===this.get$size())throw new Sk.builtin.KeyError("pop from an empty set");return Sk.misceval.callsimArray(this.v.popitem,[this.v]).v[0]},$flags:{NoArgs:!0},$textsig:null,$doc:"Remove and return an arbitrary set element.\nRaises KeyError if the set is empty."},remove:{$meth(e){const t=i(e);if(this.v.mp$lookup(t))return this.v.mp$ass_subscript(t),Sk.builtin.none.none$;throw new Sk.builtin.KeyError(e)},$flags:{OneArg:!0},$textsig:null,$doc:"Remove an element from a set; it must be a member.\n\nIf the element is not a member, raise a KeyError."},symmetric_difference:{$meth(e){let t;return Sk.misceval.chain(this.set$make_basetype(e),(e=>(t=e,t.set$symmetric_diff_update(this))),(()=>t))},$flags:{OneArg:!0},$textsig:null,$doc:"Return the symmetric difference of two sets as a new set.\n\n(i.e. all elements that are in exactly one of the sets.)"},symmetric_difference_update:{$meth(e){return Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e)),Sk.misceval.chain(e,(e=>this.set$symmetric_diff_update(e)),(()=>Sk.builtin.none.none$))},$flags:{OneArg:!0},$textsig:null,$doc:"Update a set with the symmetric difference of itself and another."},union:{$meth(...e){const t=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>t.set$update(e))),(()=>t))},$flags:{MinArgs:0},$textsig:null,$doc:"Return the union of sets as a new set.\n\n(i.e. all elements that are in either set.)"},update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>this.set$update(e))),(()=>Sk.builtin.none.none$))},$flags:{MinArgs:0},$textsig:null,$doc:"Update a set with the union of itself and others."}},classmethods:Sk.generic.classGetItem,proto:Object.assign(e,{sk$asarray(){return this.v.sk$asarray()},get$size(){return this.v.sq$length()},set$add(e){this.v.mp$ass_subscript(e,!0)},set$make_basetype(e){return Sk.misceval.chain(Sk.misceval.arrayFromIterable(e,!0),(e=>new this.sk$builtinBase(e)))},set$discard(e){return this.v.pop$item(e)},set$clear(){this.v.dict$clear()},set$copy(){const e=new this.sk$builtinBase;return e.v=this.v.dict$copy(),e},set$difference_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.set$discard(e)}))},set$intersection(e){const t=new this.sk$builtinBase;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.sq$contains(e)&&t.set$add(e)})),(()=>t))},set$intersection_multi(...e){if(!e.length)return this.set$copy();let t=this;return Sk.misceval.chain(Sk.misceval.iterArray(e,(e=>Sk.misceval.chain(t.set$intersection(e),(e=>{t=e})))),(()=>t))},set$issubset(e){if(this.get$size()>e.get$size())return Sk.builtin.bool.false$;for(let t=this.tp$iter(),n=t.tp$iternext();void 0!==n;n=t.tp$iternext())if(!e.sq$contains(n))return Sk.builtin.bool.false$;return Sk.builtin.bool.true$},set$symmetric_diff_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{void 0===this.set$discard(e)&&this.set$add(e)}))},set$update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),(e=>{this.set$add(e)}))},swap$bodies(e){this.v=e.v}})}),Sk.exportSymbol("Sk.builtin.set",Sk.builtin.set),t=Sk.builtin.set.prototype,Sk.builtin.frozenset=Sk.abstr.buildNativeClass("frozenset",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e)),Sk.asserts.assert(this instanceof Sk.builtin.frozenset,"bad call to frozen set - must be called with 'new'");const t=[];for(let n=0;n empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.",tp$hash(){let e=1927868237;const t=this.sk$asarray();e*=t.length+1;for(let n=0;ne.length?new Sk.builtin.frozenset(e):Sk.builtin.frozenset.$emptyset)))},$r:t.$r,tp$iter:t.tp$iter,tp$richcompare:t.tp$richcompare,nb$subtract:t.nb$subtract,nb$and:t.nb$and,nb$or:t.nb$or,nb$xor:t.nb$xor,sq$length:t.sq$length,sq$contains:t.sq$contains},methods:{copy:Object.assign({},t.copy.d$def,{$meth(){return this.constructor===this.sk$builtinBase?this:new Sk.builtin.frozenset(this.sk$asarray())}}),difference:t.difference.d$def,intersection:t.intersection.d$def,isdisjoint:t.isdisjoint.d$def,issubset:t.issubset.d$def,issuperset:t.issuperset.d$def,symmetric_difference:t.symmetric_difference.d$def,union:t.union.d$def},classmethods:Sk.generic.classGetItem,proto:Object.assign({$subtype_new(e,t){const n=new this.constructor;return Sk.misceval.chain(Sk.builtin.frozenset.prototype.tp$new(e),(e=>(n.v=e.v,n)))}},e)}),Sk.builtin.frozenset.$emptyset=new Sk.builtin.frozenset([]),Sk.exportSymbol("Sk.builtin.frozenset",Sk.builtin.frozenset);var r=Sk.abstr.buildIteratorClass("set_iterator",{constructor:function(e){this.$index=0,this.$seq=e.sk$asarray(),this.$orig=e},iternext:Sk.generic.iterNextWithArrayCheckSize,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}})},function(e,t){Sk.builtin.print=function(e,t){let n,[i,r,s]=Sk.abstr.copyKeywordsToNamedArgs("print",["sep","end","file","flush"],[],t);if(void 0===i||Sk.builtin.checkNone(i))i=" ";else{if(!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError("sep must be None or a string, not "+Sk.abstr.typeName(i));i=i.$jsstr()}if(void 0===r||Sk.builtin.checkNone(r))r="\n";else{if(!Sk.builtin.checkString(r))throw new Sk.builtin.TypeError("end must be None or a string, not "+Sk.abstr.typeName(r));r=r.$jsstr()}if(void 0!==s&&!Sk.builtin.checkNone(s)&&(n=Sk.abstr.lookupSpecial(s,Sk.builtin.str.$write),void 0===n))throw new Sk.builtin.AttributeError("'"+Sk.abstr.typeName(s)+"' object has no attribute 'write'");const o=new Sk.builtin.str(e.map((e=>new Sk.builtin.str(e).toString())).join(i)+r);if(void 0===n)return Sk.misceval.chain(Sk.importModule("sys",!1,!0),(e=>(n=Sk.abstr.lookupSpecial(e.$d.stdout,Sk.builtin.str.$write))&&Sk.misceval.callsimOrSuspendArray(n,[o])));Sk.misceval.callsimArray(n,[o])},Sk.builtin.print.co_fastcall=1},function(e,t){Sk.builtin.module=Sk.abstr.buildNativeClass("module",{constructor:function(){this.$d={}},slots:{tp$doc:"Create a module object.\n\nThe name must be a string; the optional doc argument can have any type.",tp$getattr(e,t){var n=this.$d[e.$mangled];if(void 0!==n)return n;if(void 0!==(n=this.ob$type.$typeLookup(e))){const e=n.tp$descr_get;return e?e.call(n,this,this.ob$type,t):n}const i=this.$d.__getattr__;return void 0!==i?(n=Sk.misceval.tryCatch((()=>Sk.misceval.callsimOrSuspendArray(i,[e])),(e=>{if(!(e instanceof Sk.builtin.AttributeError))throw e})),t?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)):void 0},tp$setattr:Sk.generic.setAttr,tp$new:Sk.generic.new,tp$init(e,t){const[n,i]=Sk.abstr.copyKeywordsToNamedArgs("module",["name","doc"],e,t,[Sk.builtin.none.none$]);Sk.builtin.pyCheckType("module","string",n),this.init$dict(n,i)},$r(){let e=this.get$name();if(void 0!==e){var t=this.get$mod_reprf();if(void 0!==t)return Sk.misceval.callsimOrSuspendArray(t,[this])}return e=void 0===e?"'?'":e,t=void 0===(t=this.from$file())?this.empty_or$loader():t,new Sk.builtin.str("")}},getsets:{__dict__:{$get(){return new Sk.builtin.mappingproxy(this.$d)}}},methods:{__dir__:{$meth(){const e=this.tp$getattr(Sk.builtin.str.$dict);if(!Sk.builtin.checkMapping(e))throw new Sk.builtin.TypeError("__dict__ is not a dictionary");const t=e.mp$lookup(Sk.builtin.str.$dir);return void 0!==t?Sk.misceval.callsimOrSuspendArray(t,[]):new Sk.builtin.list(Sk.misceval.arrayFromIterable(e))},$flags:{NoArgs:!0},$doc:"__dir__() -> list\nspecialized dir() implementation"}},proto:{sk$hasDict:!0,init$dict(e,t){this.$d.__name__=e,this.$d.__doc__=t,this.$d.__package__=Sk.builtin.none.none$,this.$d.__spec__=Sk.builtin.none.none$,this.$d.__loader__=Sk.builtin.none.none$},sk$attrError(){let e=this.get$name();return e=void 0===e?"module":"module "+e,this.$initializing&&(e="(most likely due to a circular import) partially initialized "+e),e},get$name(){const e=this.tp$getattr(Sk.builtin.str.$name);return e&&Sk.misceval.objectRepr(e)},from$file(){const e=this.tp$getattr(Sk.builtin.str.$file);return e&&" from "+Sk.misceval.objectRepr(e)},empty_or$loader(){if(this.$js&&this.$js.includes("$builtinmodule"))return" (built-in)";const e=this.tp$getattr(Sk.builtin.str.$loader);return void 0===e||Sk.builtin.checkNone(e)?"":" ("+Sk.misceval.objectRepr(e)+")"},get$mod_reprf(){const e=this.tp$getattr(Sk.builtin.str.$loader);return e&&e.tp$getattr(this.str$mod_repr)},str$mod_repr:new Sk.builtin.str("module_repr")}}),Sk.exportSymbol("Sk.builtin.module",Sk.builtin.module)},function(e,t){Sk.builtin.structseq_types={},Sk.builtin.make_structseq=function(e,t,n,i,r){i=void 0===i?{}:i,r=void 0===r?null:r;const s=e+"."+t,o=[],a={};Object.keys(n).forEach(((e,t)=>{o.push(e),a[e]={$get(){return this.v[t]},$doc:n[e]}}));const l=o.length;let u=l;Object.keys(i).forEach(((e,t)=>{a[e]={$get(){return this.$hidden[t]||Sk.builtin.none.none$},$doc:i[e]},u++}));var c=Sk.abstr.buildNativeClass(s,{constructor:function(e,t){Sk.asserts.assert(this instanceof c),Sk.builtin.tuple.call(this,e),this.$hidden=t||[]},base:Sk.builtin.tuple,slots:{tp$new(e,t){if(Sk.abstr.checkOneArg(s,e,t),(e=Sk.misceval.arrayFromIterable(e[0])).lengthu)throw new Sk.builtin.TypeError(s+"() takes an at most "+u+"-sequence ("+e.length+"-sequence given)");return new c(e.slice(0,l),e.slice(l))},tp$doc:r||Sk.builtin.none.none$,$r(){var e;if(0===this.v.length)return new Sk.builtin.str(s+"()");var t=[];for(e=0;e")}},iternext(e,t){var n=this;if(this.gi$running)throw new Sk.builtin.ValueError("generator already executing");return this.gi$running=!0,void 0===t&&(t=Sk.builtin.none.none$),this.gi$sentvalue=t,t=[this],this.func_closure&&t.push(this.func_closure),function t(i){if(i instanceof Sk.misceval.Suspension){if(e)return new Sk.misceval.Suspension(t,i);i=Sk.misceval.retryOptionalSuspensionOrThrow(i)}if(n.gi$running=!1,Sk.asserts.assert(void 0!==i),Array.isArray(i))return n.gi$resumeat=i[0],i[1];n.gi$ret=i}(this.func_code.apply(this.func_globals,t))},methods:{send:{$meth(e){return Sk.misceval.chain(this.tp$iternext(!0,e),(e=>{if(void 0===e)throw void 0!==(e=this.gi$ret)&&e!==Sk.builtin.none.none$?new Sk.builtin.StopIteration(e):new Sk.builtin.StopIteration;return e}))},$flags:{OneArg:!0},$doc:"send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration."}}}),Sk.exportSymbol("Sk.builtin.generator",Sk.builtin.generator),Sk.builtin.makeGenerator=function(e,t){var n,i=new Sk.builtin.generator(null,null,null);for(n in i.tp$iternext=e,t)t.hasOwnProperty(n)&&(i[n]=t[n]);return i},Sk.exportSymbol("Sk.builtin.makeGenerator",Sk.builtin.makeGenerator)},function(e,t){Sk.builtin.file=function(e,t,n){var i;if(!(this instanceof Sk.builtin.file))return new Sk.builtin.file(e,t,n);if(this.mode=t,this.name=Sk.ffi.remapToJs(e),this.closed=!1,"/dev/stdout"===this.name)this.data$=Sk.builtin.none.none$,this.fileno=1;else if("/dev/stdin"===this.name)this.fileno=0;else if("/dev/stderr"===this.name)this.fileno=2;else{if("w"===Sk.ffi.remapToJs(this.mode))this.fileno=Sk.builtin.file.currentFileno++;else for(i in this.fileno=Sk.inBrowser?10:11,this.data$=Sk.read(e.v),this.lineList=this.data$.split("\n"),this.lineList=this.lineList.slice(0,-1),this.lineList)this.lineList[i]+="\n";this.currentLine=0}return this.pos$=0,Sk.fileopen&&10<=this.fileno&&Sk.fileopen(this),this},Sk.builtin.file.currentFileno=12,Sk.abstr.setUpInheritance("file",Sk.builtin.file,Sk.builtin.object),Sk.abstr.setUpBuiltinMro(Sk.builtin.file),Sk.builtin.file.prototype.$r=function(){return new Sk.builtin.str("<"+(this.closed?"closed":"open")+"file '"+this.name+"', mode '"+Sk.ffi.remapToJs(this.mode)+"'>")},Sk.builtin.file.prototype.tp$iter=function(){var e={tp$iter:function(){return e},$obj:this,$index:this.currentLine,$lines:this.lineList,tp$iternext:function(){if(!(e.$index>=e.$lines.length))return new Sk.builtin.str(e.$lines[e.$index++])}};return e},Sk.abstr.setUpSlots(Sk.builtin.file),Sk.builtin.file.prototype.__enter__=new Sk.builtin.func((function(e){return e})),Sk.builtin.file.prototype.__exit__=new Sk.builtin.func((function(e){return Sk.misceval.callsimArray(Sk.builtin.file.prototype.close,[e])})),Sk.builtin.file.prototype.close=new Sk.builtin.func((function(e){return e.closed=!0,Sk.builtin.none.none$})),Sk.builtin.file.prototype.flush=new Sk.builtin.func((function(e){})),Sk.builtin.file.prototype.fileno=new Sk.builtin.func((function(e){return this.fileno})),Sk.builtin.file.prototype.isatty=new Sk.builtin.func((function(e){return!1})),Sk.builtin.file.prototype.read=new Sk.builtin.func((function(e,t){var n=e.data$.length;if(e.closed)throw new Sk.builtin.ValueError("I/O operation on closed file");var i=void 0===t?n:Sk.ffi.remapToJs(t);return i=new Sk.builtin.str(e.data$.substr(e.pos$,i)),e.pos$=void 0===t?n:e.pos$+Sk.ffi.remapToJs(t),e.pos$>=n&&(e.pos$=n),i})),Sk.builtin.file.$readline=function(e,t,n){if(0===e.fileno){if(e=Sk.ffi.remapToJs(n),(e=Sk.inputfun(e||""))instanceof Promise||e&&"function"==typeof e.then){var i=new Sk.misceval.Suspension;return i.resume=function(){if(i.data.error)throw i.data.error;return new Sk.builtin.str(i.data.result)},i.data={type:"Sk.promise",promise:e},i}return new Sk.builtin.str(e)}return t="",e.currentLinen(e,t))));if("object"===i){if((i=e.constructor)===Object&&Object.getPrototypeOf(e)===g||void 0===i)return t.dictHook?t.dictHook(e):u(e,t);if(i===Uint8Array)return new Sk.builtin.bytes(e);if(i===Set)return t.setHook?t.setHook(e):l(e,t);if(i===Map){if(t.mapHook)return t.mapHook(e);const i=new Sk.builtin.dict;return e.forEach(((e,r)=>{i.mp$ass_subscript(n(r,t),n(e,t))})),i}return i===Sk.misceval.Suspension?e:t.proxyHook?t.proxyHook(e):c(e)}if(t.unhandledHook)return t.unhandledHook(e);Sk.asserts.fail("unhandled remap case of type "+i)}function i(e,t){if(null==e)return e;const n=e.valueOf();if(null===n)return n;const o=typeof n;return t=t||{},"string"===o?t.stringHook?t.stringHook(n):n:"symbol"===o||"boolean"===o?n:"number"===o?t.numberHook?t.numberHook(n,e):n:JSBI.__isBigInt(n)?t.bigintHook?t.bigintHook(n,e):n:Array.isArray(n)?t.arrayHook?t.arrayHook(n,e):n.map((e=>i(e,t))):n.sk$object?e instanceof Sk.builtin.dict?t.dictHook?t.dictHook(e):s(e,t):e instanceof Sk.builtin.set?t.setHook?t.setHook(e):new Set(r(e,t)):t.unhandledHook?t.unhandledHook(e):void 0:"object"===o?t.objectHook?t.objectHook(n,e):n:"function"===o?t.funcHook?t.funcHook(n,e):n:void Sk.asserts.fail("unhandled type "+o)}function r(e,t){return Array.from(e,(e=>i(e,t)))}function s(e,t){const n={};return e.$items().forEach((e=>{var[r,s]=e;n[r.valueOf()]=i(s,t)})),n}function o(e){return Number.isInteger(e)?Math.abs(e)n(e,t))))}function l(e,t){return new Sk.builtin.set(Array.from(e,(e=>n(e,t))))}function u(e,t){const i=new Sk.builtin.dict;return Object.entries(e).forEach((e=>{var[r,s]=e;i.mp$ass_subscript(new Sk.builtin.str(r),n(s,t))})),i}function c(e,t){if(null==e)return Sk.builtin.none.none$;var i=typeof e;if("object"!==i&&"function"!==i)return n(e);t=t||{};const r=v.get(e);if(r){if(t.bound===r.$bound)return r;t.name||(t.name=r.$name)}return t="function"===i?new I(e,t):Array.isArray(e)?new z(e):(i=Object.getPrototypeOf(e))===S?new B(e):i===y?new M(e):new I(e,t),v.set(e,t),t}function d(e,t){e=e.toString(),void 0===t?delete this.js$wrapped[e]:this.js$wrapped[e]=i(t,N)}function f(e){return Sk.generic.getAttr.call(this,e)||this.$lookup(e)}function h(){this.js$wrapped.clear()}function p(){return Sk.misceval.callsimOrSuspendArray(Sk.builtin.dict,[this])}function m(){return this.js$wrapped.size}function _(e){if(e=i(e,N),this.js$wrapped.has(e))return this.proxy$getItem(e)}function b(e){if(e=i(e,N),this.js$wrapped.has(e)){const t=this.proxy$getItem(e);return this.js$wrapped.delete(e),t}}Sk.ffi={remapToPy:n,remapToJs:i,remapToJsOrWrap:function(e){return i(e,N)},toPy:n,toJs:i,isTrue:function(e){return null!=e&&e.nb$bool?e.nb$bool():e.sq$length?0!==e.sq$length():!!e},toJsString:function(e){return String(e)},toJsNumber:function(e){return Number(e)},toJsArray:r,toJsHashMap:s,toPyDict:u,toPyFloat:function(e){return new Sk.builtin.float_(Number(e))},toPyInt:function(e){if("number"==typeof e)return e=Math.trunc(e),Math.abs(e)n(e,t))))},toPySet:l,numberToPy:o,proxy:c};const g=Object.prototype,k=Function.prototype,S=Map.prototype,y=Set.prototype,$=/^-?\d+$/,v=new WeakMap,w=new WeakMap,x=e=>c(e),A=e=>Object.isFrozen(e)?a(e,C):c(e),E=e=>String(e),C={arrayHook:A,dictHook:x,unhandledHook:E,setHook:x,mapHook:x},T=(e,t)=>({dictHook:x,funcHook:n=>c(n,{bound:e,name:t}),unhandledHook:E,arrayHook:A,setHook:x,mapHook:x}),N={unhandledHook:e=>{var t=v.get(e);if(t)return t;if(t={v:e,$isPyWrapped:!0,unwrap:()=>e},void 0===e.tp$call)return v.set(e,t),t;if(e.ob$type===Sk.builtin.method){var r=e.im_self,s=e.im_func;let t=w.get(r);if(void 0===t&&(t=new Map,w.set(r,t)),void 0===(r=t.get(s)))r=e,t.set(s,e);else if(e=r,s=v.get(e))return s}return s=(...t)=>{t=t.map((e=>n(e,C)));let r=Sk.misceval.tryCatch((()=>Sk.misceval.chain(e.tp$call(t),(e=>i(e,N)))),(e=>{if(!Sk.uncaughtException)throw e;Sk.uncaughtException(e)}));for(;r instanceof Sk.misceval.Suspension;){if(!r.optional||r.data&&"Sk.debug"===r.data.type&&"Sk.debug"in Sk.misceval.defaultHandlers)return Sk.misceval.asyncToPromise((()=>r));r=r.resume()}return r},v.set(e,Object.assign(s,t)),s},arrayHook:e=>e[L]||e.map((e=>i(e,N)))};e={__dir__:{$meth:function(){const e=[];for(var t=this.js$wrapped;null!=t&&t!==g&&t!==k;)e.push(...Object.getOwnPropertyNames(t)),t=Object.getPrototypeOf(t);return t=r(Sk.misceval.callsimArray(Sk.builtin.type.prototype.__dir__,[this.ob$type])),new a(new Set([...t,...e]))},$flags:{NoArgs:!0}}};const I=Sk.abstr.buildNativeClass("Proxy",{constructor:function(e,t){if(void 0===e)throw new Sk.builtin.TypeError("Proxy cannot be called from python");this.js$wrapped=e,this.$module=null,this.$methods=Object.create(null),this.in$repr=!1,t||(t={}),Object.defineProperties(this,this.memoized$slots),"function"==typeof e?(this.is$callable=!0,this.$bound=t.bound,this.$name=t.name||e.name||"(native JS)",2>=this.$name.length&&(this.$name+=" (native JS)")):(this.is$callable=!1,delete this.is$type,this.is$type=!1,this.$name=t.name)},slots:{tp$doc:"proxy for a javascript object",tp$hash(){return Sk.builtin.object.prototype.tp$hash.call(this.js$wrapped)},tp$getattr(e){return this.$lookup(e)||Sk.generic.getAttr.call(this,e)},tp$setattr:d,$r(){if(this.is$callable){if(this.is$type||!this.$bound)return new Sk.builtin.str("<"+this.tp$name+" '"+this.$name+"'>");var e=Sk.misceval.objectRepr(c(this.$bound));return new Sk.builtin.str("")}return this.js$proto===g?this.in$repr?new Sk.builtin.str("{...}"):(this.in$repr=!0,e=Object.entries(this.js$wrapped).map((e=>{var[t,i]=e;return i=n(i,T(this.js$wrapped,t)),"'"+t+"': "+Sk.misceval.objectRepr(i)})),e=new Sk.builtin.str("proxyobject({"+e.join(", ")+"})"),this.in$repr=!1,e):new Sk.builtin.str("<"+this.tp$name+" "+("proxyobject"===this.tp$name?"object":"proxyobject")+">")},tp$as_sequence_or_mapping:!0,mp$subscript(e){const t=this.$lookup(e);if(void 0===t)throw new Sk.builtin.LookupError(e);return t},mp$ass_subscript(e,t){return this.tp$setattr(e,t)},sq$contains(e){return i(e)in this.js$wrapped},ob$eq(e){return this.js$wrapped===e.js$wrapped},ob$ne(e){return this.js$wrapped!==e.js$wrapped},tp$as_number:!0,nb$bool(){return this.js$proto===g?0new Sk.builtin.str(e))))},$flags:{NoArgs:!0}},get:{$meth(e,t){return this.$lookup(e)||t||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2}}}),getsets:{__class__:{$get(){return n(this.js$wrapped.constructor,C)},$set(){throw new Sk.builtin.TypeError("not writable")}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(e){this.$module=e}}},proto:{valueOf(){return this.js$wrapped},$new(e,t){return Sk.abstr.checkNoKwargs("__new__",t),n(new this.js$wrapped(...e.map((e=>i(e,N)))),(e=>({dictHook:x,proxyHook:t=>c(t,{name:e}),arrayHook:A,setHook:x,mapHook:x}))(this.$name))},$call(e,t){return Sk.abstr.checkNoKwargs("__call__",t),Sk.misceval.chain(this.js$wrapped.apply(this.$bound,e.map((e=>i(e,N)))),(e=>e instanceof Promise?Sk.misceval.promiseToSuspension(e):e),(e=>n(e,C)))},$lookup(e){e=e.toString();const t=this.js$wrapped[e];return void 0!==t?null!==t&&"object"==typeof t&&t.window===t&&null===Object.getPrototypeOf(t)?c(t,{name:"CrossOriginWindow"}):n(t,T(this.js$wrapped,e)):e in this.js$wrapped?Sk.builtin.none.none$:void 0},memoized$slots:{js$proto:{configurable:!0,get(){return delete this.js$proto,this.js$proto=Object.getPrototypeOf(this.js$wrapped)}},tp$iter:{configurable:!0,get(){return delete this.tp$iter,void 0!==this.js$wrapped[Symbol.iterator]?this.tp$iter=()=>c(this.js$wrapped[Symbol.iterator]()):this.tp$iter=()=>{throw new Sk.builtin.TypeError(Sk.misceval.objectRepr(this)+" is not iterable")}}},tp$iternext:{configurable:!0,get(){if(delete this.tp$iternext,void 0!==this.js$wrapped.next)return this.tp$iternext=()=>{const e=this.js$wrapped.next().value;return e&&n(e,C)}}},sq$length:{configurable:!0,get(){if(delete this.sq$length,!this.is$callable&&void 0!==this.js$wrapped.length)return this.sq$length=()=>this.js$wrapped.length}},tp$call:{configurable:!0,get(){if(delete this.tp$call,this.is$callable)return this.tp$call=this.is$type?this.$new:this.$call}},tp$name:{configurable:!0,get(){if(delete this.tp$name,this.is$callable)return this.tp$name=this.is$type?"proxyclass":this.$bound?"proxymethod":"proxyfunction";{const e=this.js$wrapped;let t=e[Symbol.toStringTag]||this.$name||e.constructor&&e.constructor.name||"proxyobject";return"Object"===t?t="proxyobject":2>=t.length&&(t=c(e.constructor).$name),this.tp$name=t}}},is$type:{configurable:!0,get(){delete this.is$type;var e=this.js$wrapped;const t=e.prototype;if(void 0===t)return this.is$type=e===Sk.global.Proxy;{const t=q.call(e).match(P);e=null===t?null:"class"===t[0]||!U.has(e)}return!0===e?this.is$type=!0:!1===e?this.is$type=!1:1{var[t,i]=e;return[n(t,C),n(i,C)]}))},valueOf:I.prototype.valueOf},flags:{sk$unacceptableBase:!0}}),F=Sk.abstr.buildNativeClass("InternalProxySet",{base:Sk.builtin.dict,constructor:function(e){Sk.builtin.dict.call(this),this.js$wrapped=e},proto:{proxy$getItem:e=>!0,mp$lookup:_,dict$setItem(e,t){this.js$wrapped.add(i(e,N))},dict$clear:h,pop$item:b,dict$copy:p,get$size:m,$items(){return[...this.js$wrapped].map((e=>[n(e,C),!0]))}},flags:{sk$unacceptableBase:!0}}),M=Sk.abstr.buildNativeClass("ProxySet",{base:Sk.builtin.set,constructor:function(e){Sk.builtin.set.call(this),this.v=new F(e),this.js$wrapped=e},slots:{tp$getattr:f},methods:e,proto:{$lookup:I.prototype.$lookup,valueOf:I.prototype.valueOf},flags:{sk$unacceptableBase:!0}}),D={apply:(e,t,n)=>(n=r(n,N),e.apply(t,n))},j={},O=Array.prototype,L=Symbol("$proxy"),R={get(e,t){if(t===L)return e;const i=e[t];return t in O?"function"==typeof i?j[t]||(j[t]=new Proxy(i,D)):i:void 0!==i||t in e?n(i,C):i},set:(e,t,n)=>(e[t]=i(n,N),!0)},z=Sk.abstr.buildNativeClass("ProxyList",{base:Sk.builtin.list,constructor:function(e){Sk.builtin.list.call(this,e),this.js$wrapped=this.v,this.v=new Proxy(this.v,R)},slots:{tp$getattr:f,tp$setattr:d,$r(){return new Sk.builtin.str("proxylist("+Sk.builtin.list.prototype.$r.call(this)+")")}},methods:e,proto:{$lookup:I.prototype.$lookup}}),P=/^class|^function[a-zA-Z\d\(\)\{\s]+\[native code\]\s+\}$/,q=k.toString,U=new Set([Number,String,Symbol,Boolean]);void 0!==Sk.global.BigInt&&U.add(Sk.global.BigInt);const H=Sk.abstr.buildNativeClass("ProxySymbol",{constructor:function(e){this.v=e},slots:{$r(){return new Sk.builtin.str(this.toString())}},proto:{toString(){return this.v.toString()},valueOf(){return this.v}}})},function(e,t){function n(e,t,n){if(e=void 0===e?e:Sk.misceval.asIndexOrThrow(e),t=void 0===t?t:Sk.misceval.asIndexOrThrow(t),n=void 0===n?n:Sk.misceval.asIndexOrThrow(n),void 0===t&&void 0===n)t=e,e=0,n=1;else if(void 0===n)n=1;else if(0===n)throw new Sk.builtin.ValueError("range() step argument must not be zero");const r=[];if("number"==typeof e&&"number"==typeof t&&"number"==typeof n)if(0t;s+=n)r.push(new Sk.builtin.int_(s));else{if(e=s=JSBI.BigInt(e),n=JSBI.BigInt(n),t=JSBI.BigInt(t),JSBI.greaterThan(n,JSBI.__ZERO))for(;JSBI.lessThan(s,t);)r.push(new Sk.builtin.int_(i(s))),s=JSBI.add(s,n);else for(;JSBI.greaterThan(s,t);)r.push(new Sk.builtin.int_(i(s))),s=JSBI.add(s,n);e=i(e),n=i(n),t=i(t)}return new Sk.builtin.range_(e,t,n,r)}function i(e){return JSBI.lessThan(e,JSBI.__MAX_SAFE)&&JSBI.greaterThan(e,JSBI.__MIN_SAFE)?JSBI.toNumber(e):e}Sk.builtin.range_=Sk.abstr.buildNativeClass("range",{constructor:function(e,t,n,i){this.start=e,this.stop=t,this.step=n,this.v=i},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:"range(stop) -> range object\nrange(start, stop[, step]) -> range object\n\nReturn an object that produces a sequence of integers from start (inclusive)\nto stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\nstart defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\nThese are exactly the valid indices for a list of 4 elements.\nWhen step is given, it specifies the increment (or decrement).",tp$new:(e,t)=>(Sk.abstr.checkNoKwargs("range",t),Sk.abstr.checkArgsLen("range",e,1,3),n(e[0],e[1],e[2])),$r(){let e="range("+this.start+", "+this.stop;return 1!=this.step&&(e+=", "+this.step),new Sk.builtin.str(e+")")},tp$richcompare(e,t){return"Eq"!==t&&"NotEq"!==t||e.ob$type!==Sk.builtin.range_?Sk.builtin.NotImplemented.NotImplemented$:(e=new Sk.builtin.list(e.v),new Sk.builtin.list(this.v).tp$richcompare(e,t))},tp$iter(){return new r(this)},nb$bool(){return 0!==this.v.length},sq$contains(e){const t=this.v;for(let n=0;n(e=Sk.misceval.asIndexSized(e))&&(e=this.v.length+e),0>e||e>=this.v.length)throw new Sk.builtin.IndexError("range object index out of range");return this.v[e]}if(e.constructor===Sk.builtin.slice){const t=[],n=this.v;e.sssiter$(n.length,(e=>{t.push(n[e])}));let{start:i,stop:r,step:s}=e.slice$indices(n.length);return i=Sk.misceval.asIndex(n[i])||this.start,r=Sk.misceval.asIndex(n[r])||this.stop,s="number"==typeof this.step?s*this.step:JSBI.multiply(this.step,JSBI.BigInt(s)),new Sk.builtin.range_(i,r,s,t)}throw new Sk.builtin.TypeError("range indices must be integers or slices, not "+Sk.abstr.typeName(e))}},getsets:{start:{$get(){return new Sk.builtin.int_(this.start)}},step:{$get(){return new Sk.builtin.int_(this.step)}},stop:{$get(){return new Sk.builtin.int_(this.stop)}}},methods:{__reversed__:{$meth(){return new s(this)},$flags:{NoArgs:!0},$textsig:null,$doc:"Return a reverse iterator."},count:{$meth(e){let t=0;for(let n=0;n integer -- return number of occurrences of value"},index:{$meth(e){for(let t=0;t integer -- return index of value.\nRaise ValueError if the value is not present."}},proto:{sk$asarray(){return this.v.slice(0)}},flags:{sk$unacceptableBase:!0}});var r=Sk.abstr.buildIteratorClass("range_iterator",{constructor:function(e){this.$index=0,this.$seq=e.v},iternext(){return this.$seq[this.$index++]},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),s=Sk.abstr.buildIteratorClass("range_reverseiterator",{constructor:function(e){this.$seq=e.v,this.$index=this.$seq.length-1},iternext(){return this.$seq[this.$index--]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$unacceptableBase:!0}});Sk.builtin.range=Sk.builtin.xrange=function(e,t,i){return e=n(e,t,i),new Sk.builtin.list(e.v)}},function(e,t){Sk.builtin.enumerate=Sk.abstr.buildIteratorClass("enumerate",{constructor:function(e,t){if(!(this instanceof Sk.builtin.enumerate))throw TypeError("Failed to construct 'enumerate': Please use the 'new' operator");return this.$iterable=e,this.$index=t,this},iternext(e){const t=Sk.misceval.chain(this.$iterable.tp$iternext(e),(e=>{if(void 0!==e)return new Sk.builtin.tuple([new Sk.builtin.int_(this.$index++),e])}));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},slots:{tp$doc:"Return an enumerate object.\n\n iterable\n an object supporting iteration\n\nThe enumerate object yields pairs containing a count (from start, which\ndefaults to zero) and a value yielded by the iterable argument.\n\nenumerate is useful for obtaining an indexed list:\n (0, seq[0]), (1, seq[1]), (2, seq[2]), ...",tp$new(e,t){let[n,i]=Sk.abstr.copyKeywordsToNamedArgs("enumerate",["iterable","start"],e,t,[new Sk.builtin.int_(0)]);return n=Sk.abstr.iter(n),i=Sk.misceval.asIndexOrThrow(i),this===Sk.builtin.enumerate.prototype?new Sk.builtin.enumerate(n,i):(e=new this.constructor,Sk.builtin.enumerate.call(e,n,i),e)}},classmethods:Sk.generic.classGetItem}),Sk.exportSymbol("Sk.builtin.enumerate",Sk.builtin.enumerate)},function(e,t){Sk.builtin.filter_=Sk.abstr.buildIteratorClass("filter",{constructor:function(e,t){this.$func=e,this.$iterable=t},iternext(e){const t=Sk.misceval.iterFor(this.$iterable,(e=>Sk.misceval.chain(this.check$filter(e),(e=>e?new Sk.misceval.Break(e):void 0))));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)},slots:{tp$doc:"Return an iterator yielding those items of iterable for which function(item)\nis true. If function is None, return the items that are true.",tp$new(e,t){let[n,i]=Sk.abstr.copyKeywordsToNamedArgs("filter",["predicate","iterable"],e,t,[]);return n=Sk.builtin.checkNone(n)?null:n,i=Sk.abstr.iter(i),this===Sk.builtin.filter_.prototype?new Sk.builtin.filter_(n,i):(e=new this.constructor,Sk.builtin.filter_.call(e,n,i),e)}},proto:{check$filter(e){let t;return t=null===this.$func?e:Sk.misceval.callsimOrSuspendArray(this.$func,[e]),Sk.misceval.chain(t,(t=>Sk.misceval.isTrue(t)?e:void 0))}}}),Sk.exportSymbol("Sk.builtin.filter_",Sk.builtin.filter_)},function(e,t){Sk.builtin.map_=Sk.abstr.buildIteratorClass("map",{constructor:function(e,t){this.$func=e,this.$iters=t},iternext(e){const t=[],n=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,(n=>Sk.misceval.chain(n.tp$iternext(e),(e=>{if(void 0===e)return new Sk.misceval.Break(!0);t.push(e)})))),(e=>e?void 0:Sk.misceval.callsimOrSuspendArray(this.$func,t)));return e?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)},slots:{tp$doc:"map(func, *iterables) --\x3e map object\n\nMake an iterator that computes the function using arguments from\neach of the iterables. Stops when the shortest iterable is exhausted.",tp$new(e,t){this===Sk.builtin.map_.prototype&&Sk.abstr.checkNoKwargs("map",t),Sk.abstr.checkArgsLen("map",e,2),t=e[0];const n=[];for(let t=1;tthis.$idx)){var t=Sk.misceval.tryCatch((()=>Sk.abstr.objectGetItem(this.$seq,new Sk.builtin.int_(this.$idx--),e)),(e=>{if(!(e instanceof Sk.builtin.IndexError))throw e;this.$idx=-1}));return e?t:Sk.misceval.retryOptionalSuspensionOrThrow(t)}},slots:{tp$doc:"Return a reverse iterator over the values of the given sequence.",tp$new(e,t){if(this===Sk.builtin.reversed.prototype&&Sk.abstr.checkNoKwargs("reversed",t),Sk.abstr.checkArgsLen("reversed",e,1,1),e=e[0],void 0!==(t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$reversed)))return Sk.misceval.callsimArray(t,[]);if(!Sk.builtin.checkSequence(e)||void 0===Sk.abstr.lookupSpecial(e,Sk.builtin.str.$len))throw new Sk.builtin.TypeError("'"+Sk.abstr.typeName(e)+"' object is not a sequence");return this===Sk.builtin.reversed.prototype?new Sk.builtin.reversed(e):(t=new this.constructor,Sk.builtin.reversed.call(t,e),t)}},methods:{__length_hint__:{$meth:function(){return 0<=this.$idx?new Sk.builtin.int_(this.$idx):new Sk.builtin.int_(0)},$flags:{NoArgs:!0}}}})},function(e,t){Sk.builtin.zip_=Sk.abstr.buildIteratorClass("zip",{constructor:function(e){this.$iters=e,0===e.length&&(this.tp$iternext=()=>{})},iternext(e){const t=[],n=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,(n=>Sk.misceval.chain(n.tp$iternext(e),(e=>{if(void 0===e)return new Sk.misceval.Break(!0);t.push(e)})))),(e=>e?void 0:new Sk.builtin.tuple(t)));return e?n:Sk.misceval.retryOptionalSuspensionOrThrow(n)},slots:{tp$doc:"zip(iter1 [,iter2 [...]]) --\x3e zip object\n\nReturn a zip object whose .__next__() method returns a tuple where\nthe i-th element comes from the i-th iterable argument. The .__next__()\nmethod continues until the shortest iterable in the argument sequence\nis exhausted and then it raises StopIteration.",tp$new(e,t){this===Sk.builtin.zip_.prototype&&Sk.abstr.checkNoKwargs("zip",t),t=[];for(let n=0;n":n.T_RARROW,".":n.T_DOT,"...":n.T_ELLIPSIS,"/":n.T_SLASH,"//":n.T_DOUBLESLASH,"//=":n.T_DOUBLESLASHEQUAL,"/=":n.T_SLASHEQUAL,":":n.T_COLON,";":n.T_SEMI,"<":n.T_LESS,"<<":n.T_LEFTSHIFT,"<<=":n.T_LEFTSHIFTEQUAL,"<=":n.T_LESSEQUAL,"=":n.T_EQUAL,"==":n.T_EQEQUAL,">":n.T_GREATER,">=":n.T_GREATEREQUAL,">>":n.T_RIGHTSHIFT,">>=":n.T_RIGHTSHIFTEQUAL,"@":n.T_AT,"@=":n.T_ATEQUAL,"[":n.T_LSQB,"]":n.T_RSQB,"^":n.T_CIRCUMFLEX,"^=":n.T_CIRCUMFLEXEQUAL,"{":n.T_LBRACE,"|":n.T_VBAR,"|=":n.T_VBAREQUAL,"}":n.T_RBRACE,"~":n.T_TILDE};var i={};!function(){for(var e in n)i[n[e]]=e}(),["tok_name","ISTERMINAL","ISNONTERMINAL","ISEOF"].concat(Object.keys(i).map((function(e){return i[e]}))),Sk.token={},Sk.token.tokens=n,Sk.token.tok_name=i,Sk.token.EXACT_TOKEN_TYPES=e,Sk.token.ISTERMINAL=function(e){return e=n.T_NT_OFFSET},Sk.token.ISEOF=function(e){return e==n.T_ENDMARKER},Sk.exportSymbol("Sk.token",Sk.token),Sk.exportSymbol("Sk.token.tokens",Sk.token.tokens),Sk.exportSymbol("Sk.token.tok_name",Sk.token.tok_name),Sk.exportSymbol("Sk.token.EXACT_TOKEN_TYPES"),Sk.exportSymbol("Sk.token.ISTERMINAL",Sk.token.ISTERMINAL),Sk.exportSymbol("Sk.token.ISNONTERMINAL",Sk.token.ISNONTERMINAL),Sk.exportSymbol("Sk.token.ISEOF",Sk.token.ISEOF)},function(e,t,n){function i(e,t,n,i,r){this.type=e,this.string=t,this.start=n,this.end=i,this.line=r}function r(e){return"("+Array.prototype.slice.call(arguments).join("|")+")"}function s(e){return r.apply(null,arguments)+"?"}function o(e,t){for(var n=e.length;n--;)if(e[n]===t)return!0;return!1}function a(e){return e=e.normalize("NFKC"),A.test(e)}function l(){return" FR RF Br BR Fr r B R b bR f rb rB F Rf U rF u RB br fR fr rf Rb".split(" ")}function u(e){e?delete Sk.token.EXACT_TOKEN_TYPES["<>"]:Sk.token.EXACT_TOKEN_TYPES["<>"]=Sk.token.tokens.T_NOTEQUAL,E=Object.keys(Sk.token.EXACT_TOKEN_TYPES).sort(),C=r.apply(this,E.reverse().map((function(e){return e&&p.test(e)?e.replace(h,"\\$&"):e}))),T=r("\\r?\\n",C)}n.r(t),e=n(1);var c=Sk.token.tokens;const d=Sk.builtin.SyntaxError,f=Sk.builtin.SyntaxError;i.prototype.exact_type=function(){return this.type==c.T_OP&&this.string in Sk.token.EXACT_TOKEN_TYPES?Sk.token.EXACT_TOKEN_TYPES[this.string]:this.type};var h=/[\\^$.*+?()[\]{}|]/g,p=RegExp(h.source);const{Lu:m,Ll:_,Lt:b,Lm:g,Lo:k,Nl:S,Mn:y,Mc:$,Nd:v,Pc:w}=e.default,x="["+(e=m+_+b+g+k+S+"_\\u1885-\\u1886\\u2118\\u212E\\u309B-\\u309C")+"]+["+(e+y+$+v+w)+"\\u00B7\\u0387\\u1369-\\u1371\\u19DA]*",A=new RegExp("^"+x+"$");Sk.token.isIdentifier=a,function(e){r.apply(null,arguments)}("\\\\\\r?\\n[ \\f\\t]*"),s("#[^\\r\\n]*"),e=r("[0-9](?:_?[0-9])*\\.(?:[0-9](?:_?[0-9])*)?","\\.[0-9](?:_?[0-9])*")+s("[eE][-+]?[0-9](?:_?[0-9])*");var E,C,T,N=r(e,"[0-9](?:_?[0-9])*[eE][-+]?[0-9](?:_?[0-9])*"),I=r("[0-9](?:_?[0-9])*[jJ]",N+"[jJ]");e=r.apply(null,l()),t=r(e+"'''",e+'"""'),r(e+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*'",e+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*"'),u(!0),Sk.token.setupTokens=u;var B=r(e+"'[^\\n'\\\\]*(?:\\\\.[^\\n'\\\\]*)*"+r("'","\\\\\\r?\\n"),e+'"[^\\n"\\\\]*(?:\\\\.[^\\n"\\\\]*)*'+r('"',"\\\\\\r?\\n")),F=r("\\\\\\r?\\n|$","#[^\\r\\n]*",t),M={};e=l();for(let t of e)M[t+"'"]="^[^'\\\\]*(?:\\\\.[^'\\\\]*)*'",M[t+'"']='^[^"\\\\]*(?:\\\\.[^"\\\\]*)*"',M[t+"'''"]="^[^'\\\\]*(?:(?:\\\\.|'(?!''))[^'\\\\]*)*'''",M[t+'"""']='^[^"\\\\]*(?:(?:\\\\.|"(?!""))[^"\\\\]*)*"""';let D=[],j=[];for(let t of e)D.push(t+'"'),D.push(t+"'"),j.push(t+'"""'),j.push(t+"'''");var O=new Map;Sk._tokenize=function(e,t,n,s){var l=Sk.__future__.python3;if(O.has(l))l=O.get(l);else{var u=l?"":"(?:L?)";u=r("0[xX](?:_?[0-9a-fA-F])+"+u,"0[bB](?:_?[01])+"+u,Sk.__future__.silent_octal_literal?"0([oO]?)(?:_?[0-7])+"+u:"0([oO])(?:_?[0-7])+"+u,"(?:0(?:_?0)*|[1-9](?:_?[0-9])*)"+u),u=r(I,N,u),u="[ \\f\\t]*"+r(F,u,T,B,x),u=new RegExp(u),O.set(l,u),l=u}var h,p,m,_=u=0,b=0,g="",k=0,S=null,y=[0],$=void 0,v=void 0;void 0!==n&&("utf-8-sig"==n&&(n="utf-8"),s(new i(c.T_ENCODING,n,[0,0],[0,0],"")));for(var w=n="";;){try{n=w,w=t()}catch(e){w=""}u+=1;var A=0,E=w.length;if(g){if(!w)throw new d("EOF in multi-line string",e,v[0],v[1]);$.lastIndex=0;var C=$.exec(w);if(!C){k&&"\\\n"!==w.substring(w.length-2)&&"\\\r\n"!==w.substring(w.length-3)?(s(new i(c.T_ERRORTOKEN,g+w,v,[u,w.length],S)),g="",S=null):(g+=w,S+=w);continue}A=p=C[0].length,s(new i(c.T_STRING,g+w.substring(0,p),v,[u,p],S+w)),g="",k=0,S=null}else if(0!=_||b){if(!w)throw new d("EOF in multi-line statement",e,u,0);b=0}else{if(!w)break;for(h=0;Ay[y.length-1]&&(y.push(h),s(new i(c.T_INDENT,w.substring(A),[u,0],[u,A],w)));h":Sk.token.tokens.T_GREATER,"=":Sk.token.tokens.T_EQUAL,".":Sk.token.tokens.T_DOT,"%":Sk.token.tokens.T_PERCENT,"`":Sk.token.tokens.T_BACKQUOTE,"{":Sk.token.tokens.T_LBRACE,"}":Sk.token.tokens.T_RBRACE,"@":Sk.token.tokens.T_AT,"@=":Sk.token.tokens.T_ATEQUAL,"==":Sk.token.tokens.T_EQEQUAL,"!=":Sk.token.tokens.T_NOTEQUAL,"<>":Sk.token.tokens.T_NOTEQUAL,"<=":Sk.token.tokens.T_LESSEQUAL,">=":Sk.token.tokens.T_GREATEREQUAL,"~":Sk.token.tokens.T_TILDE,"^":Sk.token.tokens.T_CIRCUMFLEX,"<<":Sk.token.tokens.T_LEFTSHIFT,">>":Sk.token.tokens.T_RIGHTSHIFT,"**":Sk.token.tokens.T_DOUBLESTAR,"+=":Sk.token.tokens.T_PLUSEQUAL,"-=":Sk.token.tokens.T_MINEQUAL,"*=":Sk.token.tokens.T_STAREQUAL,"/=":Sk.token.tokens.T_SLASHEQUAL,"%=":Sk.token.tokens.T_PERCENTEQUAL,"&=":Sk.token.tokens.T_AMPEREQUAL,"|=":Sk.token.tokens.T_VBAREQUAL,"^=":Sk.token.tokens.T_CIRCUMFLEXEQUAL,"<<=":Sk.token.tokens.T_LEFTSHIFTEQUAL,">>=":Sk.token.tokens.T_RIGHTSHIFTEQUAL,"**=":Sk.token.tokens.T_DOUBLESTAREQUAL,"//":Sk.token.tokens.T_DOUBLESLASH,"//=":Sk.token.tokens.T_DOUBLESLASHEQUAL,"->":Sk.token.tokens.T_RARROW,"...":Sk.token.tokens.T_ELLIPSIS},Sk.ParseTables={sym:{and_expr:257,and_test:258,annassign:259,arglist:260,argument:261,arith_expr:262,assert_stmt:263,async_funcdef:264,async_stmt:265,atom:266,atom_expr:267,augassign:268,break_stmt:269,classdef:270,comp_for:271,comp_if:272,comp_iter:273,comp_op:274,comparison:275,compound_stmt:276,continue_stmt:277,debugger_stmt:278,decorated:279,decorator:280,decorators:281,del_stmt:282,dictorsetmaker:283,dotted_as_name:284,dotted_as_names:285,dotted_name:286,encoding_decl:287,eval_input:288,except_clause:289,expr:290,expr_stmt:291,exprlist:292,factor:293,file_input:294,flow_stmt:295,for_stmt:296,funcdef:297,global_stmt:298,if_stmt:299,import_as_name:300,import_as_names:301,import_from:302,import_name:303,import_stmt:304,lambdef:305,lambdef_nocond:306,nonlocal_stmt:307,not_test:308,or_test:309,parameters:310,pass_stmt:311,power:312,print_stmt:313,raise_stmt:314,return_stmt:315,shift_expr:316,simple_stmt:317,single_input:256,sliceop:318,small_stmt:319,star_expr:320,stmt:321,subscript:322,subscriptlist:323,suite:324,term:325,test:326,test_nocond:327,testlist:328,testlist_comp:329,testlist_star_expr:330,tfpdef:331,trailer:332,try_stmt:333,typedargslist:334,varargslist:335,vfpdef:336,while_stmt:337,with_item:338,with_stmt:339,xor_expr:340,yield_arg:341,yield_expr:342,yield_stmt:343},number2symbol:{256:"single_input",257:"and_expr",258:"and_test",259:"annassign",260:"arglist",261:"argument",262:"arith_expr",263:"assert_stmt",264:"async_funcdef",265:"async_stmt",266:"atom",267:"atom_expr",268:"augassign",269:"break_stmt",270:"classdef",271:"comp_for",272:"comp_if",273:"comp_iter",274:"comp_op",275:"comparison",276:"compound_stmt",277:"continue_stmt",278:"debugger_stmt",279:"decorated",280:"decorator",281:"decorators",282:"del_stmt",283:"dictorsetmaker",284:"dotted_as_name",285:"dotted_as_names",286:"dotted_name",287:"encoding_decl",288:"eval_input",289:"except_clause",290:"expr",291:"expr_stmt",292:"exprlist",293:"factor",294:"file_input",295:"flow_stmt",296:"for_stmt",297:"funcdef",298:"global_stmt",299:"if_stmt",300:"import_as_name",301:"import_as_names",302:"import_from",303:"import_name",304:"import_stmt",305:"lambdef",306:"lambdef_nocond",307:"nonlocal_stmt",308:"not_test",309:"or_test",310:"parameters",311:"pass_stmt",312:"power",313:"print_stmt",314:"raise_stmt",315:"return_stmt",316:"shift_expr",317:"simple_stmt",318:"sliceop",319:"small_stmt",320:"star_expr",321:"stmt",322:"subscript",323:"subscriptlist",324:"suite",325:"term",326:"test",327:"test_nocond",328:"testlist",329:"testlist_comp",330:"testlist_star_expr",331:"tfpdef",332:"trailer",333:"try_stmt",334:"typedargslist",335:"varargslist",336:"vfpdef",337:"while_stmt",338:"with_item",339:"with_stmt",340:"xor_expr",341:"yield_arg",342:"yield_expr",343:"yield_stmt"},dfas:{256:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],257:[[[[44,1]],[[45,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],258:[[[[46,1]],[[47,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],259:[[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],{48:1}],260:[[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],261:[[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],262:[[[[55,1]],[[30,0],[43,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],263:[[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],{24:1}],264:[[[[10,1]],[[56,2]],[[0,2]]],{10:1}],265:[[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],{10:1}],266:[[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,33:1,35:1,38:1}],267:[[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],268:[[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],{67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:1,75:1,76:1,77:1,78:1,79:1}],269:[[[[39,1]],[[0,1]]],{39:1}],270:[[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],{13:1}],271:[[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],{10:1,34:1}],272:[[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],{37:1}],273:[[[[87,1],[54,1]],[[0,1]]],{10:1,34:1,37:1}],274:[[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],{8:1,83:1,88:1,89:1,90:1,91:1,92:1,93:1,94:1}],275:[[[[95,1]],[[96,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],276:[[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],{4:1,10:1,13:1,20:1,21:1,34:1,37:1,41:1,42:1}],277:[[[[40,1]],[[0,1]]],{40:1}],278:[[[[17,1]],[[0,1]]],{17:1}],279:[[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],{41:1}],280:[[[[41,1]],[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],{41:1}],281:[[[[106,1]],[[106,1],[0,1]]],{41:1}],282:[[[[27,1]],[[82,2]],[[0,2]]],{27:1}],283:[[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],284:[[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],285:[[[[109,1]],[[52,0],[0,1]]],{25:1}],286:[[[[25,1]],[[110,0],[0,1]]],{25:1}],287:[[[[25,1]],[[0,1]]],{25:1}],288:[[[[111,1]],[[2,1],[112,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],289:[[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],{113:1}],290:[[[[114,1]],[[115,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],291:[[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],292:[[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],{6:1,7:1,9:1,11:1,12:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],293:[[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],294:[[[[2,0],[112,1],[121,0]],[[0,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1,112:1}],295:[[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],{5:1,23:1,31:1,39:1,40:1}],296:[[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],{34:1}],297:[[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],{4:1}],298:[[[[26,1]],[[25,2]],[[52,1],[0,2]]],{26:1}],299:[[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{37:1}],300:[[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],301:[[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],{25:1}],302:[[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],{36:1}],303:[[[[32,1]],[[133,2]],[[0,2]]],{32:1}],304:[[[[134,1],[135,1]],[[0,1]]],{32:1,36:1}],305:[[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],{14:1}],306:[[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],{14:1}],307:[[[[18,1]],[[25,2]],[[52,1],[0,2]]],{18:1}],308:[[[[8,1],[137,2]],[[46,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],309:[[[[138,1]],[[139,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],310:[[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],{35:1}],311:[[[[28,1]],[[0,1]]],{28:1}],312:[[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],313:[[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],{16:1}],314:[[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],{5:1}],315:[[[[23,1]],[[111,2],[0,1]],[[0,2]]],{23:1}],316:[[[[143,1]],[[144,0],[142,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],317:[[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],318:[[[[48,1]],[[49,2],[0,1]],[[0,2]]],{48:1}],319:[[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],320:[[[[15,1]],[[95,2]],[[0,2]]],{15:1}],321:[[[[1,1],[3,1]],[[0,1]]],{4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],322:[[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],323:[[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],324:[[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],{2:1,5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],325:[[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],326:[[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],327:[[[[165,1],[84,1]],[[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],328:[[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],329:[[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],330:[[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],331:[[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],{25:1}],332:[[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],{35:1,38:1,110:1}],333:[[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],{20:1}],334:[[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],335:[[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],336:[[[[25,1]],[[0,1]]],{25:1}],337:[[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{21:1}],338:[[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],339:[[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],{42:1}],340:[[[[172,1]],[[173,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],341:[[[[111,2],[36,1]],[[49,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,36:1,38:1,43:1}],342:[[[[31,1]],[[174,2],[0,1]],[[0,2]]],{31:1}],343:[[[[62,1]],[[0,1]]],{31:1}]},states:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],[[[44,1]],[[45,0],[0,1]]],[[[46,1]],[[47,0],[0,1]]],[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],[[[55,1]],[[30,0],[43,0],[0,1]]],[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],[[[10,1]],[[56,2]],[[0,2]]],[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],[[[39,1]],[[0,1]]],[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],[[[87,1],[54,1]],[[0,1]]],[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],[[[95,1]],[[96,0],[0,1]]],[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],[[[40,1]],[[0,1]]],[[[17,1]],[[0,1]]],[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],[[[41,1]],[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],[[[106,1]],[[106,1],[0,1]]],[[[27,1]],[[82,2]],[[0,2]]],[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[109,1]],[[52,0],[0,1]]],[[[25,1]],[[110,0],[0,1]]],[[[25,1]],[[0,1]]],[[[111,1]],[[2,1],[112,2]],[[0,2]]],[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],[[[114,1]],[[115,0],[0,1]]],[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],[[[2,0],[112,1],[121,0]],[[0,1]]],[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],[[[26,1]],[[25,2]],[[52,1],[0,2]]],[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],[[[32,1]],[[133,2]],[[0,2]]],[[[134,1],[135,1]],[[0,1]]],[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],[[[18,1]],[[25,2]],[[52,1],[0,2]]],[[[8,1],[137,2]],[[46,2]],[[0,2]]],[[[138,1]],[[139,0],[0,1]]],[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],[[[28,1]],[[0,1]]],[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],[[[23,1]],[[111,2],[0,1]],[[0,2]]],[[[143,1]],[[144,0],[142,0],[0,1]]],[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],[[[48,1]],[[49,2],[0,1]],[[0,2]]],[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],[[[15,1]],[[95,2]],[[0,2]]],[[[1,1],[3,1]],[[0,1]]],[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],[[[165,1],[84,1]],[[0,1]]],[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[25,1]],[[0,1]]],[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],[[[172,1]],[[173,0],[0,1]]],[[[111,2],[36,1]],[[49,2]],[[0,2]]],[[[31,1]],[[174,2],[0,1]],[[0,2]]],[[[62,1]],[[0,1]]]],labels:[[0,"EMPTY"],[317,null],[4,null],[276,null],[1,"def"],[1,"raise"],[1,"True"],[3,null],[1,"not"],[1,"None"],[55,null],[2,null],[25,null],[1,"class"],[1,"lambda"],[16,null],[1,"print"],[1,"debugger"],[1,"nonlocal"],[52,null],[1,"try"],[1,"while"],[31,null],[1,"return"],[1,"assert"],[1,null],[1,"global"],[1,"del"],[1,"pass"],[54,null],[15,null],[1,"yield"],[1,"import"],[1,"False"],[1,"for"],[7,null],[1,"from"],[1,"if"],[9,null],[1,"break"],[1,"continue"],[49,null],[1,"with"],[14,null],[316,null],[19,null],[308,null],[1,"and"],[11,null],[326,null],[22,null],[261,null],[12,null],[35,null],[271,null],[325,null],[297,null],[339,null],[296,null],[26,null],[283,null],[8,null],[342,null],[329,null],[10,null],[266,null],[332,null],[45,null],[38,null],[40,null],[50,null],[46,null],[41,null],[42,null],[36,null],[43,null],[48,null],[44,null],[37,null],[39,null],[324,null],[260,null],[292,null],[1,"in"],[309,null],[273,null],[327,null],[272,null],[28,null],[21,null],[27,null],[29,null],[1,"is"],[30,null],[20,null],[290,null],[274,null],[333,null],[299,null],[270,null],[337,null],[279,null],[265,null],[281,null],[264,null],[286,null],[280,null],[320,null],[1,"as"],[284,null],[23,null],[328,null],[0,null],[1,"except"],[340,null],[18,null],[330,null],[268,null],[259,null],[312,null],[293,null],[321,null],[269,null],[277,null],[314,null],[315,null],[343,null],[1,"else"],[310,null],[51,null],[1,"elif"],[300,null],[301,null],[285,null],[303,null],[302,null],[335,null],[275,null],[258,null],[1,"or"],[334,null],[267,null],[34,null],[262,null],[33,null],[319,null],[13,null],[295,null],[263,null],[291,null],[311,null],[307,null],[313,null],[282,null],[298,null],[304,null],[278,null],[318,null],[322,null],[5,null],[6,null],[47,null],[17,null],[24,null],[305,null],[306,null],[323,null],[289,null],[1,"finally"],[331,null],[336,null],[338,null],[257,null],[32,null],[341,null]],keywords:{False:33,None:9,True:6,and:47,as:108,assert:24,break:39,class:13,continue:40,debugger:17,def:4,del:27,elif:130,else:127,except:113,finally:168,for:34,from:36,global:26,if:37,import:32,in:83,is:92,lambda:14,nonlocal:18,not:8,or:139,pass:28,print:16,raise:5,return:23,try:20,while:21,with:42,yield:31},tokens:{0:112,1:25,2:11,3:7,4:2,5:159,6:160,7:35,8:61,9:38,10:64,11:48,12:52,13:146,14:43,15:30,16:15,17:162,18:115,19:45,20:94,21:89,22:50,23:110,24:163,25:12,26:59,27:90,28:88,29:91,30:93,31:22,32:173,33:144,34:142,35:53,36:74,37:78,38:68,39:79,40:69,41:72,42:73,43:75,44:77,45:67,46:71,47:161,48:76,49:41,50:70,51:129,52:19,54:29,55:10},start:256}},function(e,t){function n(e,t){return this.filename=e,this.grammar=t,this.p_flags=0,this}n.FUTURE_PRINT_FUNCTION="print_function",n.FUTURE_UNICODE_LITERALS="unicode_literals",n.FUTURE_DIVISION="division",n.FUTURE_ABSOLUTE_IMPORT="absolute_import",n.FUTURE_WITH_STATEMENT="with_statement",n.FUTURE_NESTED_SCOPES="nested_scopes",n.FUTURE_GENERATORS="generators",n.CO_FUTURE_PRINT_FUNCTION=65536,n.CO_FUTURE_UNICODE_LITERALS=131072,n.CO_FUTURE_DIVISON=8192,n.CO_FUTURE_ABSOLUTE_IMPORT=16384,n.CO_FUTURE_WITH_STATEMENT=32768,n.prototype.setup=function(e){e=e||this.grammar.start,this.stack=[{dfa:this.grammar.dfas[e],state:0,node:{type:e,value:null,context:null,children:[]}}],this.used_names={}},n.prototype.addtoken=function(e,t,n){var i,r=this.classify(e,t,n);e:for(;;){var s=this.stack[this.stack.length-1],o=s.dfa[0],a=o[s.state];for(i=0;ic),this.shift(e,t,u,n),n=u;1===o[n].length&&0===o[n][0][0]&&o[n][0][1]===n;){if(this.pop(),0===this.stack.length)return!0;n=(s=this.stack[this.stack.length-1]).state,o=s.dfa[0]}return!1}if(256<=c&&(l=(l=this.grammar.dfas[c])[1]).hasOwnProperty(r)){this.push(c,this.grammar.dfas[c],u,n);continue e}}t:{for(o=[0,s.state],s=a.length;s--;)if(a[s][0]===o[0]&&a[s][1]===o[1]){a=!0;break t}a=!1}if(!a)throw e=n[0][0],new Sk.builtin.SyntaxError("bad input",this.filename,e,n);if(this.pop(),0===this.stack.length)throw new Sk.builtin.SyntaxError("too much input",this.filename)}},n.prototype.classify=function(e,t,i){if(e===Sk.token.tokens.T_NAME){this.used_names[t]=!0;var r=this.grammar.keywords.hasOwnProperty(t)&&this.grammar.keywords[t];if("print"===t&&(this.p_flags&n.CO_FUTURE_PRINT_FUNCTION||!0===Sk.__future__.print_function)&&(r=!1),r)return r}if(!(r=this.grammar.tokens.hasOwnProperty(e)&&this.grammar.tokens[e])){t="#"+e;for(let n in Sk.token.tokens)if(Sk.token.tokens[n]==e){t=n;break}throw new Sk.builtin.SyntaxError("bad token "+t,this.filename,i[0][0],i)}return r},n.prototype.shift=function(e,t,n,i){var r=this.stack[this.stack.length-1].dfa,s=this.stack[this.stack.length-1].node;s.children.push({type:e,value:t,lineno:i[0][0],col_offset:i[0][1],children:null}),this.stack[this.stack.length-1]={dfa:r,state:n,node:s}},n.prototype.push=function(e,t,n,i){e={type:e,value:null,lineno:i[0][0],col_offset:i[0][1],children:[]},this.stack[this.stack.length-1]={dfa:this.stack[this.stack.length-1].dfa,state:n,node:this.stack[this.stack.length-1].node},this.stack.push({dfa:t,state:0,node:e})},n.prototype.pop=function(){var e=this.stack.pop().node;e&&(0!==this.stack.length?this.stack[this.stack.length-1].node.children.push(e):(this.rootnode=e,this.rootnode.used_names=this.used_names))},Sk.parse=function(e,t){var i,r=Sk.token.tokens.T_COMMENT,s=Sk.token.tokens.T_NL,o=Sk.token.tokens.T_OP,a=Sk.token.tokens.T_ENDMARKER,l=Sk.token.tokens.T_ENCODING,u=!1,c=function(e,t){return void 0===t&&(t="file_input"),e=new n(e,Sk.ParseTables),"file_input"===t?e.setup(Sk.ParseTables.sym.file_input):Sk.asserts.fail("todo;"),e}(e);if(Sk._tokenize(e,(i=t.split("\n").reverse().map((function(e){return e+"\n"})),function(){if(0===i.length)throw new Sk.builtin.Exception("EOF");return i.pop()}),"utf-8",(function(e){var t=null;e.type!==r&&e.type!==s&&e.type!==l&&(e.type===o&&(t=Sk.OpMap[e.string]),c.addtoken(t||e.type,e.string,[e.start,e.end,e.line]),e.type===a&&(u=!0))})),!u)throw new Sk.builtin.SyntaxError("incomplete input",this.filename);return{cst:c.rootnode,flags:c.p_flags}},Sk.parseTreeDump=function(e,t){var n,i=""+(t=t||"");if(256<=e.type)for(i+=Sk.ParseTables.number2symbol[e.type]+"\n",n=0;n=i(t)||o+2==i(t)&&r(t,o+1).type==R.T_COMMA)throw new Sk.builtin.SyntaxError("named arguments must follow bare *",e.c_filename,t.lineno);(h=r(t,o+1)).type==R.T_COMMA?o=w(e,t,o+=2,u,c):(d=v(e,h),(o+=3)e.c_feature_version)return o(e,l,"Async functions are only supported in Python 3.5 and greater"),null;s(l,L.funcdef);var p=f(r(l,d));if(u(e,0,r(l,d),0))return null;var m=x(e,r(l,d+1));if(!m)return null;if(r(l,d+2).type==R.T_RARROW){if(!(c=j(e,r(l,d+3))))return null;d+=2}if(r(l,d+3).type==R.T_TYPE_COMMENT){if(!(h=R.T_NEW_TYPE_COMMENT(r(l,d+3))))return null;d+=1}var b=_(e,r(l,d+3));if(!b)return null;if(1o(s,a,"f-string: expecting '}'");for(Sk.asserts.assert(t<=n);t=t),Sk.asserts.assert("{"==e.charAt(t-1)),Sk.asserts.assert("}"==e.charAt(n)||"!"==e.charAt(n)||":"==e.charAt(n)),e=e.substring(t,n),/^\s*$/.test(e)&&o(i,r,"f-string: empty expression not allowed");try{let t=Sk.parse("","("+e+")");var s=Sk.astFromParse(t.cst,"",t.flags)}catch(e){throw e.traceback&&e.traceback[0]&&((s=e.traceback[0]).lineno=(s.lineno||1)-1+r.lineno,s.filename=i.c_filename),e}return Sk.asserts.assert(1==s.body.length&&s.body[0].constructor===Sk.astnodes.Expr),s.body[0].value}(e,l,t,s,a),"!"==e.charAt(t)&&(++t>=n&&p(),c=e.charAt(t),t++,"s"!=c&&"r"!=c&&"a"!=c&&o(s,a,"f-string: invalid conversion character: expected 's', 'r', or 'a'")),t>=n&&p(),":"==e.charAt(t)&&(++t>=n&&p(),[u,t]=B(e,t,n,i,r+1,s,a)),(t>=n||"}"!=e.charAt(t))&&p(),t++,[new Sk.astnodes.FormattedValue(l,c,u,a.lineno,a.col_offset),t]}function B(e,t,n,i,r,s,o){let a=[],l=e=>{if(-1!==e.indexOf("}")){if(/(^|[^}])}(}})*($|[^}])/.test(e))throw new Sk.builtin.SyntaxError("f-string: single '}' is not allowed",s.c_filename,o.lineno,o.col_offset);e=e.replace(/}}/g,"}")}a.push(new Sk.astnodes.Str(new Sk.builtin.str(e),o.lineno,o.col_offset,s.end_lineno,o.end_col_offset))};for(;ti&&(u=-1,n=i))}if(-1===u){l(e.substring(t,n)),t=n;break}if(u+1=l.length){if("None"===l)return new Sk.astnodes.NameConstant(Sk.builtin.none.none$,t.lineno,t.col_offset);if("True"===l)return new Sk.astnodes.NameConstant(Sk.builtin.bool.true$,t.lineno,t.col_offset);if("False"===l)return new Sk.astnodes.NameConstant(Sk.builtin.bool.false$,t.lineno,t.col_offset)}return e=f(l),new Sk.astnodes.Name(e,Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);case R.T_STRING:n=[];for(var u=0;u=y&&o(d,h,"Truncated \\xNN escape"),$+=String.fromCharCode(parseInt(g.substr(_+1,2),16)),_+=2):S||"u"!==b?S||"U"!==b?$+="\\"+b:(_+8>=y&&o(d,h,"Truncated \\UXXXXXXXX escape"),$+=String.fromCodePoint(parseInt(g.substr(_+1,8),16)),_+=8):(_+4>=y&&o(d,h,"Truncated \\uXXXX escape"),$+=String.fromCharCode(parseInt(g.substr(_+1,4),16)),_+=4))):S&&127l.charCodeAt(1)&&(l="0o"+l.substring(1)),n=!0,"l"!==u&&"L"!==u||(l=l.slice(0,-1),n=!1),l=(u=Number(l))>Number.MAX_SAFE_INTEGER?n?new Sk.builtin.int_(JSBI.BigInt(l)):new Sk.builtin.lng(JSBI.BigInt(l)):n?new Sk.builtin.int_(u):new Sk.builtin.lng(u)),new e(l,t.lineno,t.col_offset);case R.T_ELLIPSIS:return new Sk.astnodes.Ellipsis(t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);case R.T_LPAR:return(n=r(t,1)).type==R.T_RPAR?new Sk.astnodes.Tuple([],Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):n.type==L.yield_expr?j(e,n):1==i(n)?N(e,n):r(n,1).type==L.comp_for?p(k(e,n),t):p(N(e,n),t);case R.T_LSQB:return(n=r(t,1)).type==R.T_RSQB?new Sk.astnodes.List([],Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):(s(n,L.testlist_comp),1==i(n)||r(n,1).type==R.T_COMMA?(e=m(e,n))?new Sk.astnodes.List(e,Sk.astnodes.Load,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset):null:(l=n,Sk.asserts.assert(l.type==L.testlist_comp),p(e=T(e,l,1),t)));case R.T_LBRACE:if((n=r(t,1)).type==R.T_RBRACE)return new Sk.astnodes.Dict(null,null,t.lineno,t.col_offset,t.end_lineno,t.end_col_offset);if(l=r(n,0).type==R.T_DOUBLESTAR,1==i(n)||13-l&&r(n,3-l).type==L.comp_for){if(l)return o(e,t,"dict unpacking cannot be used in dict comprehension"),null;l=n,Sk.asserts.assert(3":return Sk.astnodes.RShift;case"&":return Sk.astnodes.BitAnd;case"^":return Sk.astnodes.BitXor;case"|":return Sk.astnodes.BitOr;case"*":return"*"===t.value.charAt(1)?Sk.astnodes.Pow:Sk.astnodes.Mult;case"@":if(Sk.__future__.python3)return Sk.astnodes.MatMult;default:Sk.asserts.fail("invalid augassign")}}(0,r(t,1)),a,t.lineno,t.col_offset)}if(r(t,1).type===L.annassign){if(!Sk.__future__.python3)throw new Sk.builtin.SyntaxError("Annotated assignment is not supported in Python 2",e.c_filename,t.lineno);n=r(t,0);var l=r(t,1),d=1;for(o=n;1==i(o);)o=r(o,0);switch(0>11&7,this.__namespaces=n||[]}function i(e,t,n,i,r){this.symFlags={},this.name=t,this.varnames=[],this.children=[],this.blockType=n,this.returnsValue=this.varkeywords=this.varargs=this.generator=this.childHasFree=this.hasFree=this.isNested=!1,this.lineno=r,this.table=e,e.cur&&(e.cur.nested||"function"===e.cur.blockType)&&(this.isNested=!0),i.scopeId=a++,e.stss[i.scopeId]=this,this.symbols={}}function r(e){this.filename=e,this.top=this.cur=null,this.stack=[],this.curClass=this.global=null,this.tmpname=0,this.stss={}}function s(e,t){var n;for(n=0;n>11&7)||2==e}))),this._funcGlobals},i.prototype.get_frees=function(){return Sk.asserts.assert("function"==this.get_type(),"get_frees only valid for function scopes"),this._funcFrees||(this._funcFrees=this._identsMatching((function(e){return 4==(e>>11&7)}))),this._funcFrees},i.prototype.get_methods=function(){var e;if(Sk.asserts.assert("class"==this.get_type(),"get_methods only valid for class scopes"),!this._classMethods){var t=[];for(e=0;e>11&7},r.prototype.getStsForAst=function(e){return Sk.asserts.assert(void 0!==e.scopeId,"ast wasn't added to st?"),e=this.stss[e.scopeId],Sk.asserts.assert(void 0!==e,"unknown sym tab entry"),e},r.prototype.SEQStmt=function(e){var t,n;if(null!==e){Sk.asserts.assert(Sk.isArrayLike(e),"SEQ: nodes isn't array? got "+e.toString());var i=e.length;for(n=0;n","").replace(" ","_"))};var a=Sk.builtin.str.reservedWords_;const l=/_\$rw\$$/;n.prototype.makeConstant=function(e){var t,n="";for(t=0;t Sk.execLimit) {throw new Sk.builtin.TimeoutError(Sk.timeoutMsg())}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(e=e+"if (!$waking && ($dateNow - Sk.lastYield > Sk.yieldLimit)) {var $susp = $saveSuspension({data: {type: 'Sk.yield'}, resume: function() {}}, '"+this.filename+"',$currLineNo,$currColNo);",e+="$susp.$blk = $blk;$susp.optional = true;return $susp;}$waking = false;",this.u.doesSuspend=!0)),e},n.prototype._jumpfalse=function(e,t){e=this._gr("jfalse","(",e,"===false||!Sk.misceval.isTrue(",e,"))"),o("if(",e,"){/*test failed */$blk=",t,";continue;}")},n.prototype._jumpundef=function(e,t){o("if(",e,"===undefined){$blk=",t,";continue;}")},n.prototype._jumpnotundef=function(e,t){o("if(",e,"!==undefined){$blk=",t,";continue;}")},n.prototype._jumptrue=function(e,t){e=this._gr("jtrue","(",e,"===true||Sk.misceval.isTrue(",e,"))"),o("if(",e,"){/*test passed */$blk=",t,";continue;}")},n.prototype._jump=function(e){null===this.u.blocks[this.u.curblock]._next&&(o("$blk=",e,";"),this.u.blocks[this.u.curblock]._next=e)},n.prototype._checkSuspension=function(e){if(this.u.canSuspend){var t=this.newBlock("function return or resume suspension");this._jump(t),this.setBlock(t),e=e||{lineno:"$currLineNo",col_offset:"$currColNo"},o("if ($ret && $ret.$isSuspension) { return $saveSuspension($ret,'"+this.filename+"',"+e.lineno+","+e.col_offset+"); }"),this.u.doesSuspend=!0,this.u.tempsToSave=this.u.tempsToSave.concat(this.u.localtemps)}else o("if ($ret && $ret.$isSuspension) { $ret = Sk.misceval.retryOptionalSuspensionOrThrow($ret); }")},n.prototype.cunpackstarstoarray=function(e,t){if(!e||0==e.length)return"[]";let n=!1;for(let i of e){if(t&&n)throw new Sk.builtin.SyntaxError("Extended argument unpacking is not permitted in Python 2");i.constructor===Sk.astnodes.Starred&&(n=!0)}if(n){t=this._gr("unpack","[]");for(let n of e)n.constructor!==Sk.astnodes.Starred?o(t,".push(",this.vexpr(n),");"):(o("$ret = Sk.misceval.iterFor(Sk.abstr.iter(",this.vexpr(n.value),"), function(e) { ",t,".push(e); });"),this._checkSuspension());return t}return"["+e.map((e=>this.vexpr(e))).join(",")+"]"},n.prototype.cunpackkwstoarray=function(e,t){var n="undefined";if(e&&0=n.length&&(n=this.vexpr(r),"dict"===e?(e=this.vexpr(s),o(t,".mp$ass_subscript(",e,",",n,");")):"list"===e?o(t,".v.push(",n,");"):"set"===e&&o(t,".v.mp$ass_subscript(",n,", true);"),this._jump(c),this.setBlock(c)),this._jump(u),this.setBlock(d),t},n.prototype.cyield=function(e){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'yield' outside function",this.filename,e.lineno);var t="Sk.builtin.none.none$";return e.value&&(t=this.vexpr(e.value)),e=this.newBlock("after yield"),o("return [/*resume*/",e,",/*ret*/",t,"];"),this.setBlock(e),"$gen.gi$sentvalue"},n.prototype.cyieldfrom=function(e){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'yield' outside function",this.filename,e.lineno);var t=this.vexpr(e.value);t=this._gr("iter","Sk.abstr.iter(",t,")"),o("$gen."+t+"=",t,";");var n=this.newBlock("after iter"),i=this.newBlock("after yield from");this._jump(n),this.setBlock(n);var r=this.gensym("retval");o(t,"=$gen.",t,";"),o("var ",r,";"),o("if ($gen.gi$sentvalue === Sk.builtin.none.none$ || "+t+".constructor === Sk.builtin.generator) {"),o("$ret=",t,".tp$iternext(true, $gen.gi$sentvalue);"),o("} else {");var s=this.makeConstant("new Sk.builtin.str('send');");return o("$ret=Sk.misceval.tryCatch("),o("function(){"),o("return Sk.misceval.callsimOrSuspendArray(Sk.abstr.gattr(",t,",",s,"), [$gen.gi$sentvalue]);},"),o("function (e) { "),o("if (e instanceof Sk.builtin.StopIteration) { "),o(t,".gi$ret = e.$value;"),o("return undefined;"),o("} else { throw e; }"),o("}"),o(");"),o("}"),this._checkSuspension(e),o(r,"=$ret;"),o("if(",r,"===undefined) {"),o("$gen.gi$sentvalue=$gen."+t+".gi$ret;"),o("$blk=",i,";continue;"),o("}"),o("return [/*resume*/",n,",/*ret*/",r,"];"),this.setBlock(i),"$gen.gi$sentvalue"},n.prototype.ccompare=function(e){var t;Sk.asserts.assert(e.ops.length===e.comparators.length);var n=this.vexpr(e.left),i=e.ops.length,r=this.newBlock("done"),s=this._gr("compareres","null");for(t=0;tthis.u.lineno&&(this.u.lineno=e.lineno,this.u.linenoSet=!1),e.constructor){case Sk.astnodes.BoolOp:return this.cboolop(e);case Sk.astnodes.BinOp:return this._gr("binop","Sk.abstr.numberBinOp(",this.vexpr(e.left),",",this.vexpr(e.right),",'",e.op.prototype._astname,"')");case Sk.astnodes.UnaryOp:return this._gr("unaryop","Sk.abstr.numberUnaryOp(",this.vexpr(e.operand),",'",e.op.prototype._astname,"')");case Sk.astnodes.Lambda:return this.clambda(e);case Sk.astnodes.IfExp:return this.cifexp(e);case Sk.astnodes.Dict:return this.cdict(e);case Sk.astnodes.ListComp:return this.clistcomp(e);case Sk.astnodes.DictComp:return this.cdictcomp(e);case Sk.astnodes.SetComp:return this.csetcomp(e);case Sk.astnodes.GeneratorExp:return this.cgenexp(e);case Sk.astnodes.Yield:return this.cyield(e);case Sk.astnodes.YieldFrom:return this.cyieldfrom(e);case Sk.astnodes.Compare:return this.ccompare(e);case Sk.astnodes.Call:return t=this.ccall(e),this.annotateSource(e),t;case Sk.astnodes.Num:if("number"==typeof e.n)return e.n;if(e.n instanceof Sk.builtin.lng)return this.makeConstant("new Sk.builtin.lng('"+e.n.v.toString()+"')");if(e.n instanceof Sk.builtin.int_)return"number"==typeof e.n.v?this.makeConstant("new Sk.builtin.int_("+e.n.v+")"):this.makeConstant("new Sk.builtin.int_('"+e.n.v.toString()+"')");if(e.n instanceof Sk.builtin.float_)return e=0===e.n.v&&-1/0==1/e.n.v?"-0":e.n.v,this.makeConstant("new Sk.builtin.float_("+e+")");if(e.n instanceof Sk.builtin.complex)return this.makeConstant("new Sk.builtin.complex("+(0===e.n.real&&-1/0==1/e.n.real?"-0":e.n.real)+", "+(0===e.n.imag&&-1/0==1/e.n.imag?"-0":e.n.imag)+")");Sk.asserts.fail("unhandled Num type");case Sk.astnodes.Bytes:if(Sk.__future__.python3){for(t=[],e=e.s.$jsstr(),n=0;ni||127<=i&&256>i?n+"\\x"+("0"+i.toString(16)).substr(-2):256<=i?n+"\\u"+("000"+i.toString(16)).substr(-4):n+e.charAt(r);return e=n+'"',t.call(this,"new Sk.builtin.str(",e,",true)");case Sk.astnodes.Attribute:switch(e.ctx!==Sk.astnodes.AugLoad&&e.ctx!==Sk.astnodes.AugStore&&(r=this.vexpr(e.value)),i=(i=e.attr.$r().v).substring(1,i.length-1),i=s(this.u.private_,new Sk.builtin.str(i)).v,i=this.makeConstant("new Sk.builtin.str('"+i+"')"),e.ctx){case Sk.astnodes.AugLoad:return o("$ret = ",n,".tp$getattr(",i,", true);"),this._checkSuspension(e),o("\nif ($ret === undefined) {"),o("\nthrow new Sk.builtin.AttributeError(",n,'.sk$attrError() + " has no attribute \'" + ',i,'.$jsstr() + "\'");'),o("\n};"),this._gr("lattr","$ret");case Sk.astnodes.Load:return o("$ret = ",r,".tp$getattr(",i,", true);"),this._checkSuspension(e),o("\nif ($ret === undefined) {"),o("\nthrow new Sk.builtin.AttributeError(",r,'.sk$attrError() + " has no attribute \'" + ',i,'.$jsstr() + "\'");'),o("\n};"),this._gr("lattr","$ret");case Sk.astnodes.AugStore:o("$ret = undefined;"),o("if(",t,"!==undefined){"),o("$ret = ",n,".tp$setattr(",i,",",t,", true);"),o("}"),this._checkSuspension(e);break;case Sk.astnodes.Store:o("$ret = ",r,".tp$setattr(",i,",",t,", true);"),this._checkSuspension(e);break;case Sk.astnodes.Del:o("$ret = ",r,".tp$setattr(",i,", undefined, true);"),this._checkSuspension(e);break;default:Sk.asserts.fail("invalid attribute expression")}break;case Sk.astnodes.Subscript:switch(e.ctx){case Sk.astnodes.AugLoad:return o("$ret = Sk.abstr.objectGetItem(",n,",",i,", true);"),this._checkSuspension(e),this._gr("gitem","$ret");case Sk.astnodes.Load:case Sk.astnodes.Store:case Sk.astnodes.Del:return this.vslice(e.slice,e.ctx,this.vexpr(e.value),t);case Sk.astnodes.AugStore:o("$ret=undefined;"),o("if(",t,"!==undefined){"),o("$ret=Sk.abstr.objectSetItem(",n,",",i,",",t,", true)"),o("}"),this._checkSuspension(e);break;default:Sk.asserts.fail("invalid subscript expression")}break;case Sk.astnodes.Name:return this.nameop(e.id,e.ctx,t);case Sk.astnodes.NameConstant:if(e.ctx===Sk.astnodes.Store||e.ctx===Sk.astnodes.AugStore||e.ctx===Sk.astnodes.Del)throw new Sk.builtin.SyntaxError("can not assign to a constant name");switch(e.value){case Sk.builtin.none.none$:return"Sk.builtin.none.none$";case Sk.builtin.bool.true$:return"Sk.builtin.bool.true$";case Sk.builtin.bool.false$:return"Sk.builtin.bool.false$";default:Sk.asserts.fail("invalid named constant")}break;case Sk.astnodes.List:return this.ctuplelistorset(e,t,"list");case Sk.astnodes.Tuple:return this.ctuplelistorset(e,t,"tuple");case Sk.astnodes.Set:return this.ctuplelistorset(e,t,"set");case Sk.astnodes.Starred:if(e.ctx===Sk.astnodes.Store)throw new Sk.builtin.SyntaxError("starred assignment target must be in a list or tuple",this.filename,e.lineno);throw new Sk.builtin.SyntaxError("can't use starred expression here",this.filename,e.lineno);case Sk.astnodes.JoinedStr:return this.cjoinedstr(e);case Sk.astnodes.FormattedValue:return this.cformattedvalue(e);case Sk.astnodes.Ellipsis:return this.makeConstant("Sk.builtin.Ellipsis");default:Sk.asserts.fail("unhandled case "+e.constructor.name+" vexpr")}},n.prototype.vseqexpr=function(e,t){var n;Sk.asserts.assert(void 0===t||e.length===t.length);var i=[];for(n=0;n",this.u.blocks[t]._next=null,t},n.prototype.setBlock=function(e){Sk.asserts.assert(0<=e&&e0) { $err=err; $blk=$exc.pop(); } else { throw err; } }};",o+="var $saveSuspension = function($child, $filename, $lineno, $colno) {var susp = new Sk.misceval.Suspension(); susp.child=$child;susp.resume=function(){"+e.scopename+".$wakingSuspension=susp; return "+e.scopename+"("+(e.ste.generator?"$gen":"")+"); };susp.data=susp.child.data;susp.$blk=$blk;susp.$loc=$loc;susp.$gbl=$gbl;susp.$exc=$exc;susp.$err=$err;susp.$postfinally=$postfinally;susp.$filename=$filename;susp.$lineno=$lineno;susp.$colno=$colno;susp.optional=susp.child.optional;"+(s?"susp.$cell=$cell;":""),r={},t=0;te?this.vexpr(e):"undefined"))),i&&i.vararg&&(p=i.vararg),i&&i.kwarg&&(m=i.kwarg);var _=this.enterScope(t,e,e.lineno,this.canSuspend),b=this.u.ste.generator,g=this.u.ste.hasFree,k=this.u.ste.childHasFree,S=this.newBlock("codeobj entry");this.u.prefixCode="var "+_+"=(function "+this.niceName(t.v)+"$(";var y=[];if(b){if(m)throw new Sk.builtin.SyntaxError(t.v+"(): keyword arguments in generators not supported",this.filename,e.lineno);if(p)throw new Sk.builtin.SyntaxError(t.v+"(): variable number of arguments in generators not supported",this.filename,e.lineno);y.push("$gen")}else{for(m&&(y.push("$kwa"),this.u.tempsToSave.push("$kwa")),u=0;i&&u0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} }});",a.call(this,_),i){for(let e of i.args)c.push(e.arg.v);for(let e of i.kwonlyargs||[])c.push(e.arg.v);this.u.argnames=c}if(this.exitScope(),0"),null,e.args,(function(t){t=this.vexpr(e.body),o("return ",t,";")}))},n.prototype.cifexp=function(e){var t=this.newBlock("next of ifexp"),n=this.newBlock("end of ifexp"),i=this._gr("res","null"),r=this.vexpr(e.test);return this._jumpfalse(r,t),o(i,"=",this.vexpr(e.body),";"),this._jump(n),this.setBlock(t),o(i,"=",this.vexpr(e.orelse),";"),this._jump(n),this.setBlock(n),i},n.prototype.cgenexpgen=function(e,t,n){var i=this.newBlock("start for "+t),r=this.newBlock("skip for "+t);this.newBlock("if cleanup for "+t);var s=this.newBlock("end for "+t),a=e[t];if(0===t)var l="$loc.$iter0";else{var u=this.vexpr(a.iter);l="$loc."+this.gensym("iter"),o(l,"=","Sk.abstr.iter(",u,");")}this._jump(i),this.setBlock(i),this.annotateSource(n),o("$ret = Sk.abstr.iternext(",l,this.u.canSuspend?", true":", false",");"),this._checkSuspension(n),u=this._gr("next","$ret"),this._jumpundef(u,s),this.vexpr(a.target,u);var c=a.ifs?a.ifs.length:0;for(l=0;l=e.length&&(this.annotateSource(n),e=this.vexpr(n),o("return [",r,"/*resume*/,",e,"/*ret*/];"),this.setBlock(r)),this._jump(i),this.setBlock(s),1===t&&o("return Sk.builtin.none.none$;")},n.prototype.cgenexp=function(e){var t=this.buildcodeobj(e,new Sk.builtin.str(""),null,null,(function(t){this.cgenexpgen(e.generators,0,e.elt)}));return t=this._gr("gener","Sk.misceval.callsimArray(",t,");"),o(t,".gi$locals.$iter0=Sk.abstr.iter(",this.vexpr(e.generators[0].iter),");"),t},n.prototype.cclass=function(e){Sk.asserts.assert(e instanceof Sk.astnodes.ClassDef);var t=this.vseqexpr(e.decorator_list),n=this.vseqexpr(e.bases);let i=this.cunpackkwstoarray(e.keywords);var r=this.enterScope(e.name,e,e.lineno),s=this.newBlock("class entry");this.u.prefixCode="var "+r+"=(function $"+e.name.v+"$class_outer($globals,$locals,$cell){var $gbl=$globals,$loc=$locals,$free=$globals;",this.u.switchCode+="(function $"+e.name.v+"$_closure($cell){",this.u.switchCode+="var $blk="+s+",$exc=[],$ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;",null!==Sk.execLimit&&(this.u.switchCode+="if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.switchCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}"),this.u.switchCode+="while(true){try{",this.u.switchCode+=this.outputInterruptTest(),this.u.switchCode+="switch($blk){",this.u.suffixCode="}}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }}}",this.u.suffixCode+="}).call(null, $cell);});",this.u.private_=e.name,this.cbody(e.body,e.name),o("return;"),this.exitScope(),o("$ret = Sk.misceval.buildClass($gbl,",r,",",e.name.$r().v,",[",n,"], $cell, ",i,");"),this._checkSuspension();for(let e of t.reverse())o("$ret = Sk.misceval.callsimOrSuspendArray(",e,", [$ret]);"),this._checkSuspension();this.nameop(e.name,Sk.astnodes.Store,"$ret")},n.prototype.ccontinue=function(e){var t=this.peekFinallyBlock();if(0==this.u.continueBlocks.length)throw new Sk.builtin.SyntaxError("'continue' outside loop",this.filename,e.lineno);e=this.u.continueBlocks[this.u.continueBlocks.length-1],Sk.asserts.assert(this.u.breakBlocks.length===this.u.continueBlocks.length),t&&t.breakDepth==this.u.continueBlocks.length?o("$postfinally={isBreak:true,gotoBlock:",e,"};"):this._jump(e)},n.prototype.cbreak=function(e){var t=this.peekFinallyBlock();if(0===this.u.breakBlocks.length)throw new Sk.builtin.SyntaxError("'break' outside loop",this.filename,e.lineno);e=this.u.breakBlocks[this.u.breakBlocks.length-1],t&&t.breakDepth==this.u.breakBlocks.length?o("$postfinally={isBreak:true,gotoBlock:",e,"};"):this._jump(e)},n.prototype.vstmt=function(e,t){if(this.u.lineno=e.lineno,this.u.linenoSet=!1,this.u.localtemps=[],Sk.debugging&&this.u.canSuspend){var n=this.newBlock("debug breakpoint for line "+e.lineno);o("if (Sk.breakpoints('"+this.filename+"',"+e.lineno+","+e.col_offset+")) {","var $susp = $saveSuspension({data: {type: 'Sk.debug'}, resume: function() {}}, '"+this.filename+"',"+e.lineno+","+e.col_offset+");","$susp.$blk = "+n+";","$susp.optional = true;","return $susp;","}"),this._jump(n),this.setBlock(n),this.u.doesSuspend=!0}switch(this.annotateSource(e),e.constructor){case Sk.astnodes.FunctionDef:this.cfunction(e,t);break;case Sk.astnodes.ClassDef:this.cclass(e);break;case Sk.astnodes.Return:if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError("'return' outside function",this.filename,e.lineno);n=e.value?this.vexpr(e.value):"Sk.builtin.none.none$",0==this.u.finallyBlocks.length?o("return ",n,";"):(o("$postfinally={returning:",n,"};"),this._jump(this.peekFinallyBlock().blk));break;case Sk.astnodes.Delete:this.vseqexpr(e.targets);break;case Sk.astnodes.Assign:var i=e.targets.length;for(n=this.vexpr(e.value),t=0;t"!==e.name.v){var t=e.name.$r().v;t=t.substring(1,t.length-1),o(e.scopename,".co_name=new Sk.builtins['str']('",t,"');"),this.stack.length&&"class"==this.u.ste.blockType&&o(e.scopename,".co_qualname=new Sk.builtins['str']('"+this.u.name.v+"."+t+"');")}for(var n in e.consts)e.consts.hasOwnProperty(n)&&(e.suffixCode+=n+" = "+e.consts[n]+";")},n.prototype.cbody=function(e,t){var n=0;const i=this.maybeCDocstringOfBody(e);for(null!==i&&(o("$loc.__doc__ = ",i,";"),n=1);n"),e,0,this.canSuspend),n=this.newBlock("module entry");return this.u.prefixCode="var "+t+"=(function($forcegbl, $forceloc){",this.u.varDeclsCode="var $gbl = $forcegbl || {}, $blk="+n+",$exc=[],$loc=$forceloc || $gbl,$cell={},$err=undefined;var $ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;",null!==Sk.execLimit&&(this.u.varDeclsCode+="if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}"),null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.varDeclsCode+="if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}"),this.u.varDeclsCode+="var $waking=false; if ("+t+".$wakingSuspension!==undefined) { $wakeFromSuspension(); $waking=true; }if (Sk.retainGlobals) { if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; } else { Sk.globals = $gbl; }} else { Sk.globals = $gbl; }",this.u.switchCode="while(true){try{",this.u.switchCode+=this.outputInterruptTest(),this.u.switchCode+="switch($blk){",this.u.suffixCode="}",this.u.suffixCode+="}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '"+this.filename+"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} } });",e.constructor===Sk.astnodes.Module?(this.cbody(e.body),o("return $loc;")):Sk.asserts.fail("todo; unhandled case in compilerMod"),this.exitScope(),this.result.push(this.outputAllUnits()),t},Sk.compile=function(e,t,i,r){i=Sk.__future__,Sk.__future__=Object.create(Sk.__future__);var s=Sk.parse(t,e),o=Sk.astFromParse(s.cst,t,s.flags);return s=s.flags,r=(e=new n(t,Sk.symboltable(o,t),s,r,e)).cmod(o),Sk.__future__=i,{funcname:"$compiledmod",code:`var $compiledmod = function() {${e.result.join("")}\nreturn ${r};}();\n$compiledmod;`,filename:t}},Sk.exportSymbol("Sk.compile",Sk.compile),Sk.resetCompiler=function(){Sk.gensymcount=0},Sk.exportSymbol("Sk.resetCompiler",Sk.resetCompiler),Sk.fixReserved=r,Sk.exportSymbol("Sk.fixReserved",Sk.fixReserved),Sk.unfixReserved=function(e){return e.replace(l,"")},Sk.exportSymbol("Sk.unfixReserved",Sk.unfixReserved),Sk.mangleName=s,Sk.exportSymbol("Sk.mangleName",Sk.mangleName),Sk.reservedWords_=a,Sk.exportSymbol("Sk.reservedWords_",Sk.reservedWords_)},function(e,t){Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.importSearchPathForName=function(e,t,n){var i=e.replace(/\./g,"/"),r=function(e,t){return Sk.misceval.chain(Sk.misceval.tryCatch((function(){return Sk.read(e)}),(function(e){})),(function(n){if(void 0!==n)return new Sk.misceval.Break({filename:e,code:n,packagePath:t})}))};return void 0===n&&(n=Sk.realsyspath),Sk.misceval.iterFor(n.tp$iter(),(function(e){return Sk.misceval.chain(r(e.v+"/"+i+t,!1),(function(n){return n||r(e.v+"/"+i+"/__init__"+t,e.v+"/"+i)}))}))},Sk.importSetUpPath=function(e){if(!Sk.realsyspath){var t=[new Sk.builtin.str("src/builtin"),new Sk.builtin.str("src/lib"),new Sk.builtin.str(".")];for(e=0;ei;++i)e+=" ";n[t-1]="/* "+e+t+" */ "+n[t-1]}return n.join("\n")}(s),Sk.debugout(s)),"$compiledmod"!==i.funcname&&(s+="\n"+i.funcname+";");var o=new Sk.builtin.str(n),l=new Sk.builtin.str(e);Sk.sysmodules.mp$ass_subscript(o,c),r&&r.tp$setattr(l,c);var u=Sk.global.eval(s);c.init$dict(o,Sk.builtin.none.none$),c.$d.__package__=i.packagePath?o:_?new Sk.builtin.str(h+_):f||Sk.builtin.none.none$,i.packagePath&&(c.$d.__path__=new Sk.builtin.tuple([new Sk.builtin.str(i.packagePath)])),i.filename&&"$builtinmodule"!==i.funcname&&(c.$d.__file__=new Sk.builtin.str(i.filename));var d=r&&r.$initializing;return c.$initializing=!0,r&&!d&&(r.$initializing=!0),Sk.misceval.tryCatch((()=>Sk.misceval.chain(u(c.$d),(e=>(c.$initializing=!1,r&&!d&&(r.$initializing=!1),e)))),(e=>{try{Sk.abstr.objectDelItem(Sk.sysmodules,o)}catch(e){}if(r)try{r.tp$setattr(l,void 0)}catch(e){}throw c.$initializing=!1,r&&!d&&(r.$initializing=!1),e}))}}),(function(t){var n;if(void 0===t){if(s&&!d)return;throw new Sk.builtin.ModuleNotFoundError("No module named "+Sk.misceval.objectRepr(new Sk.builtin.str(e)))}if(t!==c.$d){for(n in c.$d)t[n]||(t[n]=c.$d[n]);c.$d=t}if(Sk.onAfterImport&&"function"==typeof Sk.onAfterImport)try{Sk.onAfterImport(e)}catch(e){}return d?(u.tp$setattr(new Sk.builtin.str(m[m.length-1]),c),d):c}))}));return o?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)},Sk.importModule=function(e,t,n){return Sk.importModuleInternal_(e,t,void 0,void 0,void 0,!1,n)},Sk.importMain=function(e,t,n){return Sk.dateSet=!1,Sk.filesLoaded=!1,Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.resetCompiler(),Sk.importModuleInternal_(e,t,"__main__",void 0,void 0,!1,n)},Sk.importMainWithBody=function(e,t,n,i){return Sk.dateSet=!1,Sk.filesLoaded=!1,Sk.sysmodules=new Sk.builtin.dict([]),Sk.realsyspath=void 0,Sk.resetCompiler(),Sk.importModuleInternal_(e,t,"__main__",n,void 0,!1,i)},Sk.importBuiltinWithBody=function(e,t,n,i){return Sk.importModuleInternal_(e,t,"__builtin__."+e,n,void 0,!1,i)},Sk.builtin.__import__=function(e,t,n,i,r){e=e.toString();var s,o=Sk.globals;if(null==r&&(r=Sk.__future__.absolute_import?0:-1),0!==r&&t.__package__&&t.__package__!==Sk.builtin.none.none$){if((s=t.__package__.v)&&0=t.length)throw new Sk.builtin.ImportError("Attempted relative import beyond toplevel package");t.length-=r-1,s=t.join(".")}var a=Sk.sysmodules.quick$lookup(new Sk.builtin.str(s))}if(0Sk.importModuleInternal_(r,void 0,void 0,void 0,n,!0,!0)))}return Sk.misceval.chain(...t,(function(){return Sk.asserts.assert(n),n}))}return t}),(function(e){return o!==Sk.globals&&(Sk.globals=o),e}))},Sk.importStar=function(e,t,n){if(n=e.tp$getattr(new Sk.builtin.str("__all__")))for(let i=Sk.abstr.iter(n),r=i.tp$iternext();void 0!==r;r=i.tp$iternext())t[r.v]=Sk.abstr.gattr(e,r);else{n=Object.getOwnPropertyNames(e.$d);for(let i in n)"_"!=n[i].charAt(0)&&(t[n[i]]=e.$d[n[i]])}},Sk.exportSymbol("Sk.importMain",Sk.importMain),Sk.exportSymbol("Sk.importMainWithBody",Sk.importMainWithBody),Sk.exportSymbol("Sk.importBuiltinWithBody",Sk.importBuiltinWithBody),Sk.exportSymbol("Sk.builtin.__import__",Sk.builtin.__import__),Sk.exportSymbol("Sk.importStar",Sk.importStar)},function(e,t){Sk.builtin.timSort=function(e,t){this.list=new Sk.builtin.list(e.v),this.MIN_GALLOP=7,this.listlength=t||e.sq$length()},Sk.builtin.timSort.prototype.lt=function(e,t){return Sk.misceval.richCompareBool(e,t,"Lt")},Sk.builtin.timSort.prototype.le=function(e,t){return!this.lt(t,e)},Sk.builtin.timSort.prototype.setitem=function(e,t){this.list.v[e]=t},Sk.builtin.timSort.prototype.binary_sort=function(e,t){var n;for(n=e.base+t;n>1);this.lt(t,e.getitem(s))?r=s:i=s+1}for(Sk.asserts.assert(i===r),s=n;s>i;s--)e.setitem(s,e.getitem(s-1));e.setitem(i,t)}},Sk.builtin.timSort.prototype.count_run=function(e){var t;if(1>=e.len)var n=e.len,i=!1;else if(n=2,this.lt(e.getitem(e.base+1),e.getitem(e.base)))for(i=!0,t=e.base+2;tt.len)){for(this.merge_init(),e=this.merge_compute_minrun(t.len);0r&&(l=r),a+=n,l+=n}else{for(r=n+1;lr&&(l=r),o=n-a,a=n-l,l=o}for(Sk.asserts.assert(-1<=a>1),i(t.getitem(t.base+n),e)?a=n+1:l=n;return Sk.asserts.assert(a==l),l},Sk.builtin.timSort.prototype.merge_init=function(){this.min_gallop=this.MIN_GALLOP,this.pending=[]},Sk.builtin.timSort.prototype.merge_lo=function(e,t){var n,i,r;Sk.asserts.assert(0=s)break}else{if(this.setitem(o,e.popleft()),o++,1==e.len)return;if(i=0,++n>=s)break}for(s+=1;;){for(this.min_gallop=s-=1=e.len)return;if(this.setitem(o,t.popleft()),o++,0===t.len)return;for(i=this.gallop(e.getitem(e.base),t,0,!1),r=t.base;r=s)break}else{if(o--,this.setitem(o,l),t.len--,1==t.len)return;if(n=0,++i>=s)break}}for(s+=1;;){this.min_gallop=s-=1e.base+u-1;r--)o--,this.setitem(o,e.getitem(r));if(e.len-=n,0===e.len)return;if(o--,this.setitem(o,t.popright()),1==t.len)return;for(a=e.getitem(e.base+e.len-1),u=this.gallop(a,t,t.len-1,!1),i=t.len-u,r=t.base+t.len-1;r>t.base+u-1;r--)o--,this.setitem(o,t.getitem(r));if(t.len-=i,1>=t.len)return;if(o--,this.setitem(o,e.popright()),0===e.len)return;if(ne.base-1;r--)o--,this.setitem(o,e.getitem(r));for(r=t.base+t.len-1;r>t.base-1;r--)o--,this.setitem(o,t.getitem(r))}},Sk.builtin.timSort.prototype.merge_at=function(e){0>e&&(e=this.pending.length+e);var t=this.pending[e],n=this.pending[e+1];Sk.asserts.assert(0>=1;return e+t},Sk.builtin.listSlice=function(e,t,n){this.list=e,this.base=t,this.len=n},Sk.builtin.listSlice.prototype.copyitems=function(){var e=this.base,t=this.base+this.len;return Sk.asserts.assert(0<=e<=t),new Sk.builtin.listSlice(new Sk.builtin.list(this.list.v.slice(e,t)),0,this.len)},Sk.builtin.listSlice.prototype.advance=function(e){this.base+=e,this.len-=e,Sk.asserts.assert(this.base<=this.list.sq$length())},Sk.builtin.listSlice.prototype.getitem=function(e){return this.list.v[e]},Sk.builtin.listSlice.prototype.setitem=function(e,t){this.list.v[e]=t},Sk.builtin.listSlice.prototype.popleft=function(){var e=this.list.v[this.base];return this.base++,this.len--,e},Sk.builtin.listSlice.prototype.popright=function(){return this.len--,this.list.v[this.base+this.len]},Sk.builtin.listSlice.prototype.reverse=function(){for(var e,t,n=this.list,i=this.base,r=i+this.len-1;i same as super(__class__, )\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n def meth(self, arg):\n super().meth(arg)\nThis works for class methods too:\nclass C(B):\n @classmethod\n def cmeth(cls, arg):\n super().cmeth(arg)\n",tp$new:Sk.generic.new,tp$init(e,t){if(Sk.abstr.checkNoKwargs("super",t),Sk.abstr.checkArgsLen("super",e,1,2),t=e[0],e=e[1],!Sk.builtin.checkClass(t))throw new Sk.builtin.TypeError("must be type, not "+Sk.abstr.typeName(t));this.obj=e,this.type=t,null!=this.obj&&(this.obj_type=this.$supercheck(t,this.obj))},$r(){return this.obj?new Sk.builtin.str(", <"+Sk.abstr.typeName(this.obj)+" object>>"):new Sk.builtin.str(", NULL>")},tp$getattr(e,t){let n=this.obj_type;if(null==n)return Sk.generic.getAttr.call(this,e,t);var i=n.prototype.tp$mro;const r=i.length;if("__class__"===e.v)return Sk.generic.getAttr.call(this,e,t);let s,o;for(s=0;s+1=r)return Sk.generic.getAttr.call(this,e,t);for(e=e.$mangled;s(Sk.abstr.checkNoKwargs("GenericAlias",t),Sk.abstr.checkArgsLen("GenericAlias",e,2,2),new Sk.builtin.GenericAlias(e[0],e[1])),tp$getattr(e,t){return Sk.builtin.checkString(e)&&!this.attr$exc.includes(e.v)?this.$origin.tp$getattr(e,t):Sk.generic.getAttr.call(this,e,t)},$r(){const e=this.ga$repr(this.$origin);let t="";return this.$args.v.forEach(((e,n)=>{t+=0{this.is$typevar(t)&&0>this.tuple$index(e,t)&&e.push(t)})),this.$params=new Sk.builtin.tuple(e)},tuple$index:(e,t)=>e.indexOf(t),is$typevar(e){if("TypeVar"!==e.tp$name)return!1;if(void 0===(e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$module)))throw Sk.builtin.RuntimeError("found object withought a __module__");return"typing"===e.toString()},ga$repr(e){if(e===Sk.builtin.Ellipsis)return"...";if(Sk.abstr.lookupSpecial(e,this.str$orig)&&Sk.abstr.lookupSpecial(e,this.str$args))return Sk.misceval.objectRepr(e);const t=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$qualname);if(void 0===t)return Sk.misceval.objectRepr(e);const n=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$module);return void 0===n||Sk.builtin.checkNone(n)?Sk.misceval.objectRepr(e):"builtins"===n.toString()?t.toString():n.toString()+"."+t.toString()},str$orig:new Sk.builtin.str("__origin__"),str$args:new Sk.builtin.str("__args__"),attr$exc:"__origin__ __args__ __parameters__ __mro_entries__ __reduce_ex__ __reduce__".split(" ")}})},function(e,t){function n(e,t){let n;if(void 0===e||Sk.builtin.checkNone(e))e=void 0;else{if(!(e instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError(t+" must be a dict or None, not "+Sk.abstr.typeName(e));n={},e.$items().forEach((e=>{var[t,i]=e;Sk.builtin.checkString(t)&&(n[t.$mangled]=i)}))}return n}function i(e,t){if(void 0!==e&&!Sk.builtin.checkNone(e))for(let n in t)e.mp$ass_subscript(new Sk.builtin.str(Sk.unfixReserved(n)),t[n])}Sk.builtins={round:null,len:null,min:null,max:null,sum:null,abs:null,fabs:null,ord:null,chr:null,hex:null,oct:null,bin:null,dir:null,repr:null,open:null,isinstance:null,hash:null,getattr:null,hasattr:null,id:null,sorted:null,any:null,all:null,enumerate:Sk.builtin.enumerate,filter:Sk.builtin.filter_,map:Sk.builtin.map_,range:Sk.builtin.range_,reversed:Sk.builtin.reversed,zip:Sk.builtin.zip_,BaseException:Sk.builtin.BaseException,AttributeError:Sk.builtin.AttributeError,ArithmeticError:Sk.builtin.ArithmeticError,ValueError:Sk.builtin.ValueError,Exception:Sk.builtin.Exception,ZeroDivisionError:Sk.builtin.ZeroDivisionError,AssertionError:Sk.builtin.AssertionError,ImportError:Sk.builtin.ImportError,ModuleNotFoundError:Sk.builtin.ModuleNotFoundError,IndentationError:Sk.builtin.IndentationError,IndexError:Sk.builtin.IndexError,LookupError:Sk.builtin.LookupError,KeyError:Sk.builtin.KeyError,TypeError:Sk.builtin.TypeError,UnicodeDecodeError:Sk.builtin.UnicodeDecodeError,UnicodeEncodeError:Sk.builtin.UnicodeEncodeError,NameError:Sk.builtin.NameError,UnboundLocalError:Sk.builtin.UnboundLocalError,IOError:Sk.builtin.IOError,NotImplementedError:Sk.builtin.NotImplementedError,SystemExit:Sk.builtin.SystemExit,OverflowError:Sk.builtin.OverflowError,OperationError:Sk.builtin.OperationError,NegativePowerError:Sk.builtin.NegativePowerError,RuntimeError:Sk.builtin.RuntimeError,RecursionError:Sk.builtin.RecursionError,StopIteration:Sk.builtin.StopIteration,SyntaxError:Sk.builtin.SyntaxError,SystemError:Sk.builtin.SystemError,KeyboardInterrupt:Sk.builtin.KeyboardInterrupt,float_$rw$:Sk.builtin.float_,int_$rw$:Sk.builtin.int_,bool:Sk.builtin.bool,complex:Sk.builtin.complex,dict:Sk.builtin.dict,file:Sk.builtin.file,frozenset:Sk.builtin.frozenset,function:Sk.builtin.func,generator:Sk.builtin.generator,list:Sk.builtin.list,long_$rw$:Sk.builtin.lng,method:Sk.builtin.method,object:Sk.builtin.object,slice:Sk.builtin.slice,str:Sk.builtin.str,set:Sk.builtin.set,tuple:Sk.builtin.tuple,type:Sk.builtin.type,input:null,raw_input:new Sk.builtin.func(Sk.builtin.raw_input),setattr:null,jseval:Sk.builtin.jseval,jsmillis:Sk.builtin.jsmillis,quit:new Sk.builtin.func(Sk.builtin.quit),exit:new Sk.builtin.func(Sk.builtin.quit),print:null,divmod:null,format:null,globals:null,issubclass:null,iter:null,execfile:Sk.builtin.execfile,help:Sk.builtin.help,memoryview:Sk.builtin.memoryview,reload:Sk.builtin.reload,super_$rw$:Sk.builtin.super_,unichr:new Sk.builtin.func(Sk.builtin.unichr),vars:Sk.builtin.vars,apply_$rw$:Sk.builtin.apply_,buffer:Sk.builtin.buffer,coerce:Sk.builtin.coerce,intern:Sk.builtin.intern,property:Sk.builtin.property,classmethod:Sk.builtin.classmethod,staticmethod:Sk.builtin.staticmethod,Ellipsis:Sk.builtin.Ellipsis},e=Sk.builtin.none.none$,t=new Sk.builtin.tuple;const r=new Sk.builtin.int_(0);Sk.abstr.setUpModuleMethods("builtins",Sk.builtins,{__import__:{$meth(e,t,i,r,s){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError("__import__() argument 1 must be str, not "+e.tp$name);if(""===e.v&&0===s.v)throw new Sk.builtin.ValueError("Empty module name");return t=n(t,"globals")||{},r=Sk.ffi.remapToJs(r),s=Sk.ffi.remapToJs(s),Sk.builtin.__import__(e,t,void 0,r,s)},$flags:{NamedArgs:["name","globals","locals","fromlist","level"],Defaults:[e,e,t,r]},$textsig:null,$doc:"__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module\n\nImport a module. Because this function is meant for use by the Python\ninterpreter and not for general use, it is better to use\nimportlib.import_module() to programmatically import a module.\n\nThe globals argument is only used to determine the context;\nthey are not modified. The locals argument is unused. The fromlist\nshould be a list of names to emulate ``from name import ...'', or an\nempty list to emulate ``import name''.\nWhen importing a module from a package, note that __import__('A.B', ...)\nreturns package A when fromlist is empty, but its submodule B when\nfromlist is not empty. The level argument is used to determine whether to\nperform absolute or relative imports: 0 is absolute, while a positive number\nis the number of parent directories to search relative to the current module."},abs:{$meth:Sk.builtin.abs,$flags:{OneArg:!0},$textsig:"($module, x, /)",$doc:"Return the absolute value of the argument."},all:{$meth:Sk.builtin.all,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for all values x in the iterable.\n\nIf the iterable is empty, return True."},any:{$meth:Sk.builtin.any,$flags:{OneArg:!0},$textsig:"($module, iterable, /)",$doc:"Return True if bool(x) is True for any x in the iterable.\n\nIf the iterable is empty, return False."},ascii:{$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."},bin:{$meth:Sk.builtin.bin,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the binary representation of an integer.\n\n >>> bin(2796202)\n '0b1010101010101010101010'"},callable:{$meth:Sk.builtin.callable,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return whether the object is callable (i.e., some kind of function).\n\nNote that classes are callable, as are instances of classes with a\n__call__() method."},chr:{$meth:Sk.builtin.chr,$flags:{OneArg:!0},$textsig:"($module, i, /)",$doc:"Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff."},compile:{$meth:Sk.builtin.compile,$flags:{MinArgs:3,MaxArgs:6},$textsig:"($module, /, source, filename, mode, flags=0,\n dont_inherit=False, optimize=-1)",$doc:"Compile source into a code object that can be executed by exec() or eval().\n\nThe source code may represent a Python module, statement or expression.\nThe filename will be used for run-time error messages.\nThe mode must be 'exec' to compile a module, 'single' to compile a\nsingle (interactive) statement, or 'eval' to compile an expression.\nThe flags argument, if present, controls which future statements influence\nthe compilation of the code.\nThe dont_inherit argument, if true, stops the compilation inheriting\nthe effects of any future statements in effect in the code calling\ncompile; if absent or false these statements do influence the compilation,\nin addition to any features explicitly specified."},delattr:{$meth:Sk.builtin.delattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)",$doc:"Deletes the named attribute from the given object.\n\ndelattr(x, 'y') is equivalent to ``del x.y''"},dir:{$meth:Sk.builtin.dir,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"dir([object]) -> list of strings\n\nIf called without an argument, return the names in the current scope.\nElse, return an alphabetized list of names comprising (some of) the attributes\nof the given object, and of attributes reachable from it.\nIf the object supplies a method named __dir__, it will be used; otherwise\nthe default dir() logic is used and returns:\n for a module object: the module's attributes.\n for a class object: its attributes, and recursively the attributes\n of its bases.\n for any other object: its attributes, its class's attributes, and\n recursively the attributes of its class's base classes."},divmod:{$meth:Sk.builtin.divmod,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, x, y, /)",$doc:"Return the tuple (x//y, x%y). Invariant: div*y + mod == x."},eval_$rw$:{$name:"eval",$meth:function(e,t,r){const s=n(t,"globals"),o=n(r,"locals");return Sk.misceval.chain(Sk.builtin.eval(e,s,o),(e=>(i(t,s),i(r,o),e)))},$flags:{MinArgs:1,MaxArgs:3},$textsig:"($module, source, globals=None, locals=None, /)",$doc:"Evaluate the given source in the context of globals and locals.\n\nThe source may be a string representing a Python expression\nor a code object as returned by compile().\nThe globals must be a dictionary and locals can be any mapping,\ndefaulting to the current globals and locals.\nIf only globals is given, locals defaults to it."},exec:{$meth:function(e,t,r){const s=n(t,"globals"),o=n(r,"locals");return Sk.misceval.chain(Sk.builtin.exec(e,s,o),(e=>(i(t,s),i(r,o),Sk.builtin.none.none$)))},$flags:{MinArgs:1,MaxArgs:3},$textsig:"($module, source, globals=None, locals=None, /)",$doc:"Execute the given source in the context of globals and locals.\n\nThe source may be a string representing one or more Python statements\nor a code object as returned by compile().\nThe globals must be a dictionary and locals can be any mapping,\ndefaulting to the current globals and locals.\nIf only globals is given, locals defaults to it."},format:{$meth:Sk.builtin.format,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, value, format_spec='', /)",$doc:"Return value.__format__(format_spec)\n\nformat_spec defaults to the empty string.\nSee the Format Specification Mini-Language section of help('FORMATTING') for\ndetails."},getattr:{$meth:Sk.builtin.getattr,$flags:{MinArgs:2,MaxArgs:3},$textsig:null,$doc:"getattr(object, name[, default]) -> value\n\nGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\nWhen a default argument is given, it is returned when the attribute doesn't\nexist; without it, an exception is raised in that case."},globals:{$meth:Sk.builtin.globals,$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return the dictionary containing the current scope's global variables.\n\nNOTE: Updates to this dictionary *will* affect name lookups in the current\nglobal scope and vice-versa."},hasattr:{$meth:Sk.builtin.hasattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, name, /)",$doc:"Return whether the object has an attribute with the given name.\n\nThis is done by calling getattr(obj, name) and catching AttributeError."},hash:{$meth:Sk.builtin.hash,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the hash value for the given object.\n\nTwo objects that compare equal must also have the same hash value, but the\nreverse is not necessarily true."},hex:{$meth:Sk.builtin.hex,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the hexadecimal representation of an integer.\n\n >>> hex(12648430)\n '0xc0ffee'"},id:{$meth:Sk.builtin.id,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the identity of an object.\n\nThis is guaranteed to be unique among simultaneously existing objects.\n(CPython uses the object's memory address.)"},input:{$meth:Sk.builtin.input,$flags:{MinArgs:0,MaxArgs:1},$textsig:"($module, prompt=None, /)",$doc:"Read a string from standard input. The trailing newline is stripped.\n\nThe prompt string, if given, is printed to standard output without a\ntrailing newline before reading input.\n\nIf the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.\nOn *nix systems, readline is used if available."},isinstance:{$meth:Sk.builtin.isinstance,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, obj, class_or_tuple, /)",$doc:"Return whether an object is an instance of a class or of a subclass thereof.\n\nA tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)\nor ...`` etc."},issubclass:{$meth:Sk.builtin.issubclass,$flags:{MinArgs:2,MaxArgs:2},$textsig:"($module, cls, class_or_tuple, /)",$doc:"Return whether 'cls' is a derived from another class or is the same class.\n\nA tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to\ncheck against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)\nor ...`` etc."},iter:{$meth:Sk.builtin.iter,$flags:{MinArgs:1,MaxArgs:2},$textsig:"($module, iterable /)",$doc:"iter(iterable) -> iterator\niter(callable, sentinel) -> iterator\n\nGet an iterator from an object. In the first form, the argument must\nsupply its own iterator, or be a sequence.\nIn the second form, the callable is called until it returns the sentinel."},len:{$meth:Sk.builtin.len,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the number of items in a container."},locals:{$meth:Sk.builtin.locals,$flags:{NoArgs:!0},$textsig:"($module, /)",$doc:"Return a dictionary containing the current scope's local variables.\n\nNOTE: Whether or not updates to this dictionary will affect name lookups in\nthe local scope and vice-versa is *implementation dependent* and not\ncovered by any backwards compatibility guarantees."},max:{$meth:Sk.builtin.max,$flags:{FastCall:!0},$textsig:null,$doc:"max(iterable, *[, default=obj, key=func]) -> value\nmax(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its biggest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the largest argument."},min:{$meth:Sk.builtin.min,$flags:{FastCall:!0},$textsig:null,$doc:"min(iterable, *[, default=obj, key=func]) -> value\nmin(arg1, arg2, *args, *[, key=func]) -> value\n\nWith a single iterable argument, return its smallest item. The\ndefault keyword-only argument specifies an object to return if\nthe provided iterable is empty.\nWith two or more arguments, return the smallest argument."},next:{$name:"next",$meth:Sk.builtin.next_,$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:"next(iterator[, default])\n\nReturn the next item from the iterator. If default is given and the iterator\nis exhausted, it is returned instead of raising StopIteration."},oct:{$meth:Sk.builtin.oct,$flags:{OneArg:!0},$textsig:"($module, number, /)",$doc:"Return the octal representation of an integer.\n\n >>> oct(342391)\n '0o1234567'"},open:{$meth:Sk.builtin.open,$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:"open(name[, mode[, buffering]]) -> file object\n\nOpen a file using the file() type, returns a file object. This is the\npreferred way to open a file. See file.__doc__ for further information."},ord:{$meth:Sk.builtin.ord,$flags:{OneArg:!0},$textsig:"($module, c, /)",$doc:"Return the Unicode code point for a one-character string."},pow:{$meth:Sk.builtin.pow,$flags:{MinArgs:2,MaxArgs:3},$textsig:"($module, x, y, z=None, /)",$doc:"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\n\nSome types, such as ints, are able to use a more efficient algorithm when\ninvoked using the three argument form."},print:{$meth:Sk.builtin.print,$flags:{FastCall:!0},$textsig:null,$doc:"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, or to sys.stdout by default.\nOptional keyword arguments:\nfile: a file-like object (stream); defaults to the current sys.stdout.\nsep: string inserted between values, default a space.\nend: string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream."},repr:{$meth:Sk.builtin.repr,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return the canonical string representation of the object.\n\nFor many object types, including most builtins, eval(repr(obj)) == obj."},round:{$meth:Sk.builtin.round,$flags:{NamedArgs:["number","ndigits"]},$textsig:"($module, /, number, ndigits=None)",$doc:"Round a number to a given precision in decimal digits.\n\nThe return value is an integer if ndigits is omitted or None. Otherwise\nthe return value has the same type as the number. ndigits may be negative."},setattr:{$meth:Sk.builtin.setattr,$flags:{MinArgs:3,MaxArgs:3},$textsig:"($module, obj, name, value, /)",$doc:"Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''"},sorted:{$meth:Sk.builtin.sorted,$flags:{NamedArgs:[null,"cmp","key","reverse"],Defaults:[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]},$textsig:"($module, iterable, /, *, key=None, reverse=False)",$doc:"Return a new list containing all items from the iterable in ascending order.\n\nA custom key function can be supplied to customize the sort order, and the\nreverse flag can be set to request the result in descending order."},sum:{$meth:Sk.builtin.sum,$flags:{NamedArgs:[null,"start"],Defaults:[new Sk.builtin.int_(0)]},$textsig:"($module, iterable, /, start=0)",$doc:"Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types."},vars:{$meth:Sk.builtin.vars,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:"vars([object]) -> dictionary\n\nWithout arguments, equivalent to locals().\nWith an argument, equivalent to object.__dict__."}}),Sk.setupObjects=function(e){e?(Sk.builtins.filter=Sk.builtin.filter_,Sk.builtins.map=Sk.builtin.map_,Sk.builtins.zip=Sk.builtin.zip_,Sk.builtins.range=Sk.builtin.range_,delete Sk.builtins.reduce,delete Sk.builtins.xrange,delete Sk.builtins.StandardError,delete Sk.builtins.unicode,delete Sk.builtins.basestring,delete Sk.builtins.long_$rw$,Sk.builtin.int_.prototype.$r=function(){return new Sk.builtin.str(this.v.toString())},delete Sk.builtin.int_.prototype.tp$str,delete Sk.builtin.bool.prototype.tp$str,delete Sk.builtins.raw_input,delete Sk.builtins.unichr,delete Sk.builtin.str.prototype.decode,Sk.builtins.bytes=Sk.builtin.bytes,Sk.builtins.ascii=new Sk.builtin.sk_method({$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:"($module, obj, /)",$doc:"Return an ASCII-only representation of an object.\n\nAs repr(), return a string containing a printable representation of an\nobject, but escape the non-ASCII characters in the string returned by\nrepr() using \\\\x, \\\\u or \\\\U escapes. This generates a string similar\nto that returned by repr() in Python 2."},null,"builtins")):(Sk.builtins.range=new Sk.builtin.sk_method({$meth:Sk.builtin.range,$name:"range",$flags:{MinArgs:1,MaxArgs:3}},void 0,"builtins"),Sk.builtins.xrange=new Sk.builtin.sk_method({$meth:Sk.builtin.xrange,$name:"xrange",$flags:{MinArgs:1,MaxArgs:3}},null,"builtins"),Sk.builtins.reduce=new Sk.builtin.sk_method({$meth:Sk.builtin.reduce,$name:"reduce",$flags:{MinArgs:2,MaxArgs:3}},null,"builtins"),Sk.builtins.filter=new Sk.builtin.func(Sk.builtin.filter),Sk.builtins.map=new Sk.builtin.func(Sk.builtin.map),Sk.builtins.zip=new Sk.builtin.func(Sk.builtin.zip),Sk.builtins.StandardError=Sk.builtin.Exception,Sk.builtins.unicode=Sk.builtin.str,Sk.builtins.basestring=Sk.builtin.str,Sk.builtins.long_$rw$=Sk.builtin.lng,Sk.builtin.int_.prototype.$r=function(){const e=this.v;return"number"==typeof e?new Sk.builtin.str(e.toString()):new Sk.builtin.str(e.toString()+"L")},Sk.builtin.int_.prototype.tp$str=function(){return new Sk.builtin.str(this.v.toString())},Sk.builtin.bool.prototype.tp$str=function(){return this.$r()},Sk.builtins.raw_input=new Sk.builtin.func(Sk.builtin.raw_input),Sk.builtins.unichr=new Sk.builtin.func(Sk.builtin.unichr),Sk.builtin.str.prototype.decode=Sk.builtin.str.$py2decode,delete Sk.builtins.bytes,delete Sk.builtins.ascii)},Sk.exportSymbol("Sk.setupObjects",Sk.setupObjects),Sk.exportSymbol("Sk.builtins",Sk.builtins)},function(e,t){Sk.builtin.str.$empty=new Sk.builtin.str(""),Sk.builtin.str.$emptystr=Sk.builtin.str.$empty,Sk.builtin.str.$utf8=new Sk.builtin.str("utf-8"),Sk.builtin.str.$ascii=new Sk.builtin.str("ascii"),Sk.builtin.str.$default_factory=new Sk.builtin.str("default_factory"),Sk.builtin.str.$imag=new Sk.builtin.str("imag"),Sk.builtin.str.$real=new Sk.builtin.str("real"),Sk.builtin.str.$abs=new Sk.builtin.str("__abs__"),Sk.builtin.str.$ann=new Sk.builtin.str("__annotations__"),Sk.builtin.str.$bases=new Sk.builtin.str("__bases__"),Sk.builtin.str.$bytes=new Sk.builtin.str("__bytes__"),Sk.builtin.str.$call=new Sk.builtin.str("__call__"),Sk.builtin.str.$class=new Sk.builtin.str("__class__"),Sk.builtin.str.$class_getitem=new Sk.builtin.str("__class_getitem__"),Sk.builtin.str.$cmp=new Sk.builtin.str("__cmp__"),Sk.builtin.str.$complex=new Sk.builtin.str("__complex__"),Sk.builtin.str.$contains=new Sk.builtin.str("__contains__"),Sk.builtin.str.$copy=new Sk.builtin.str("__copy__"),Sk.builtin.str.$dict=new Sk.builtin.str("__dict__"),Sk.builtin.str.$dir=new Sk.builtin.str("__dir__"),Sk.builtin.str.$doc=new Sk.builtin.str("__doc__"),Sk.builtin.str.$enter=new Sk.builtin.str("__enter__"),Sk.builtin.str.$eq=new Sk.builtin.str("__eq__"),Sk.builtin.str.$exit=new Sk.builtin.str("__exit__"),Sk.builtin.str.$index=new Sk.builtin.str("__index__"),Sk.builtin.str.$init=new Sk.builtin.str("__init__"),Sk.builtin.str.$initsubclass=new Sk.builtin.str("__init_subclass__"),Sk.builtin.str.$int_=new Sk.builtin.str("__int__"),Sk.builtin.str.$iter=new Sk.builtin.str("__iter__"),Sk.builtin.str.$file=new Sk.builtin.str("__file__"),Sk.builtin.str.$float_=new Sk.builtin.str("__float__"),Sk.builtin.str.$format=new Sk.builtin.str("__format__"),Sk.builtin.str.$ge=new Sk.builtin.str("__ge__"),Sk.builtin.str.$getattr=new Sk.builtin.str("__getattr__"),Sk.builtin.str.$getattribute=new Sk.builtin.str("__getattribute__"),Sk.builtin.str.$getitem=new Sk.builtin.str("__getitem__"),Sk.builtin.str.$gt=new Sk.builtin.str("__gt__"),Sk.builtin.str.$keys=new Sk.builtin.str("keys"),Sk.builtin.str.$le=new Sk.builtin.str("__le__"),Sk.builtin.str.$len=new Sk.builtin.str("__len__"),Sk.builtin.str.$length_hint=new Sk.builtin.str("__length_hint__"),Sk.builtin.str.$loader=new Sk.builtin.str("__loader__"),Sk.builtin.str.$lt=new Sk.builtin.str("__lt__"),Sk.builtin.str.$module=new Sk.builtin.str("__module__"),Sk.builtin.str.$missing=new Sk.builtin.str("__missing__"),Sk.builtin.str.$name=new Sk.builtin.str("__name__"),Sk.builtin.str.$ne=new Sk.builtin.str("__ne__"),Sk.builtin.str.$new=new Sk.builtin.str("__new__"),Sk.builtin.str.$next=new Sk.builtin.str("__next__"),Sk.builtin.str.$path=new Sk.builtin.str("__path__"),Sk.builtin.str.$prepare=new Sk.builtin.str("__prepare__"),Sk.builtin.str.$qualname=new Sk.builtin.str("__qualname__"),Sk.builtin.str.$repr=new Sk.builtin.str("__repr__"),Sk.builtin.str.$reversed=new Sk.builtin.str("__reversed__"),Sk.builtin.str.$round=new Sk.builtin.str("__round__"),Sk.builtin.str.$setattr=new Sk.builtin.str("__setattr__"),Sk.builtin.str.$setitem=new Sk.builtin.str("__setitem__"),Sk.builtin.str.$slots=new Sk.builtin.str("__slots__"),Sk.builtin.str.$str=new Sk.builtin.str("__str__"),Sk.builtin.str.$setname=new Sk.builtin.str("__set_name__"),Sk.builtin.str.$trunc=new Sk.builtin.str("__trunc__"),Sk.builtin.str.$write=new Sk.builtin.str("write"),Sk.misceval.op2method_={Eq:Sk.builtin.str.$eq,NotEq:Sk.builtin.str.$ne,Gt:Sk.builtin.str.$gt,GtE:Sk.builtin.str.$ge,Lt:Sk.builtin.str.$lt,LtE:Sk.builtin.str.$le}}])}).call(this||window)},54215:(e,t,n)=>{"use strict";n.d(t,{K:()=>m,c:()=>b});var i=n(78673);class r extends i.A{constructor(e,t,n,i){super(),this.audio_tour=null,this.audio_code=null,this.windowcode=null,this.first_audio=null,this.prev_audio=null,this.pause_audio=null,this.next_audio=null,this.last_audio=null,this.status=null,this.stop_button=null,this.tourButtons=[],this.elem=null,this.currIndex=null,this.len=null,this.buttonCount=null,this.aname=null,this.ahash=null,this.theDivid=null,this.afile=null,this.playing=!1,this.tourName="";var r=(t=(t=(t=(t=(t=t.replaceAll("*doubleq*",'"')).replaceAll("*singleq*","'")).replaceAll("*open*","(")).replaceAll("*close*",")")).replaceAll("*nline*","
    ")).split("\n"),s=[],o=[],a=i.replaceAll("*doubleq*",'"').split("*atype*");for(let e=0;e1. "+r[0]+"",c=r.length;for(let t=1;t"+(t+1)+". "+r[t]+"":t<99?u+"
    "+(t+1)+". "+r[t]+"
    ":u+"
    "+(t+1)+". "+r[t]+"
    ";u+="";for(var d=0,f=0;f",a+="",a+="",a+="",a+="",a+="
    Your browser does not support the audio tag",this.ahash[d]=f,this.aname.push(d)}$(this.audio_code).html(a),this.len=this.aname.length,this.currIndex=0,this.playCurrIndexAudio()}handlePlaying(){this.elem.pause(),$("#"+this.afile).unbind("ended"),this.unhighlightLines(this.theDivid,this.ahash[this.aname[this.currIndex]])}firstAudio(){this.handlePlaying(),this.logBookEvent({event:"Audio",act:"first",div_id:this.theDivid}),this.currIndex=0,this.playCurrIndexAudio()}prevAudio(){this.currIndex>0&&(this.handlePlaying(),this.logBookEvent({event:"Audio",act:"prev",div_id:this.theDivid}),this.currIndex=this.currIndex-1,this.playCurrIndexAudio())}nextAudio(){this.handlePlaying(),this.logBookEvent({event:"Audio",act:"next",div_id:this.theDivid}),this.currIndex1)for(let t=0;t1)for(var s=parseInt(r[0]),o=parseInt(r[1])+1,a=s;ae.json())).then((n=>{if(""!==n.trim()){let i="",r=n.split("\n"),s=e.split("\n");for(let e of r)if(-1!=e.indexOf(".py:")){const t=/[^.]*.py:(\d+):(\d+):? (.*)/i;let n=e.match(t);n[3].includes("defined from star imports")||n[3].includes("*' used; unable to detect undefined names")||(i+=$.i18n("msd_pyflakes_coach_line")+n[1]+": "+n[3]+"\n",i+=s[n[1]-1]+"\n",i+=" ".repeat(n[2]-1)+"^\n")}else i+=e+"\n";i=i.slice(0,-1),t(i)}t(null)})).catch((e=>{n("Error in Pyflakes Coach: "+e)}))}))}}var u=n(57129);window.vegaEmbed=u.Ay;var c,d,f,h=!1;document.onmousedown=function(){},document.onmouseup=function(){},window.componentMap={};var p="chat.codes";o().commands.autocomplete=function(e){e.showHint({hint:o().hint.anyword})};class m extends i.A{constructor(e){super(e);var t=$(e.orig).find("textarea")[0];this.containerDiv=e.orig,this.useRunestoneServices=e.useRunestoneServices,this.python3=!0,this.origElem=t,this.origText=this.origElem.textContent,this.codeCoachList=[],this.divid=e.orig.id,this.problem_description=$(e.orig).find(".ac_question").text()||"",this.code=$(t).text()||"\n\n\n\n\n",this.parsonspersonalize=$(t).data("parsonspersonalize"),this.parsonsexample=$(t).data("parsonsexample"),this.puzzleScaffoldingDivid=`help_puzzle_${this.parsonspersonalize}_${this.divid}`,this.language=$(t).data("lang"),this.timelimit=$(t).data("timelimit"),this.highlightLines=$(t).data("highlight-lines"),this.includes=$(t).data("include"),this.hidecode=$(t).data("hidecode"),this.chatcodes=$(t).data("chatcodes"),this.hidehistory=$(t).data("hidehistory"),this.question=$(e.orig).find(`#${this.divid}_question`)[0],this.tie=$(t).data("tie"),this.dburl=$(t).data("dburl"),this.runButton=null,this.enabledownload=this.parseBooleanAttribute(t,"data-enabledownload"),this.downloadButton=null,this.saveButton=null,this.loadButton=null,this.outerDiv=null,this.partner="",this.runCount=0,this.firstAfterRun=!0,this.logResults=!0,!eBookConfig.allow_pairs||this.parseBooleanAttribute(t,"data-nopair")?this.enablePartner=!1:this.enablePartner=!0,this.output=null,this.graphics=null,this.codecoach=null,this.codelens=null,this.controlDiv=null,this.historyScrubber=null,this.timestamps=["Original"],this.autorun=this.parseBooleanAttribute(t,"data-autorun"),this.outputLineCount=0,this.outputLines=[],this.chatcodes&&eBookConfig.enable_chatcodes&&(c||(c=new WebSocket("wss://"+p)),d||(d=new window.sharedb.Connection(c)),f||(f=d.get("chatcodes","channels"))),(this.graderactive||this.isTimed)&&(this.hidecode=!1),this.includes&&(this.includes=this.includes.split(/\s+/));let n=this.code.indexOf("===iotests===");if(n>-1){let e=this.code.substring(n+13);this.iotests=JSON.parse(e),this.code=this.code.substring(0,n)}let i=this.code.match(/\^\^\^\^\^*/);if(i){let e=i.index,t=i[0].length;this.prefix=this.code.substring(0,e);let n="\n"==this.code[e+t]?t+1:t;this.code=this.code.substring(e+n)}let r=this.code.indexOf("^^^!");if(r>-1){this.visiblePrefixEnd=r;let e="\n"==this.code[r+4]?5:4;this.visiblePrefix=this.code.substring(0,r),this.code=this.visiblePrefix+this.code.substring(r+e)}let s=this.code.match(/=====*/);if(s){let e=s.index,t=s[0].length,n="\n"==this.code[e+t]?t+1:t;this.suffix=this.code.substring(e+n),""===this.suffix.trim()&&(this.suffix=null),this.code=this.code.substring(0,e)}let o=this.code.indexOf("===!");if(o>-1){let e="\n"==this.code[o+4]?5:4;this.visibleSuffixLength=this.code.length-o-e,this.visibleSuffix=this.code.substring(o+e),this.code=this.code.substring(0,o)+this.visibleSuffix}let a=this.trimLockedCode(this.code);this.history=[a],this.highlightedLines=[],this.lockedLines=[],this.lockTextMarkers=[],this.lockGutterLines=[],this.createEditor(),this.createOutput(),this.createControls(),$(t).data("caption")?this.caption=$(t).data("caption"):this.caption="ActiveCode",this.addCaption("runestone"),"python"!=this.language&&"python3"!=this.language||this.codeCoachList.push(new l),setTimeout(function(){this.editor.refresh()}.bind(this),1e3),this.decorateStatus(),this.autorun&&$(this.runButtonHandler.bind(this)),this.indicate_component_ready(),"undefined"!=typeof Prism&&Prism.highlightAllUnder(this.containerDiv),this.helpLoaded=!1,this.prevHelpedCode=null}createEditor(e){this.outerDiv=document.createElement("div");var t=document.createElement("div");t.id=this.divid.replace(/_/g,"-").toLowerCase();var n=document.createElement("div");n.classList.add("ac_code_div"),n.setAttribute("aria-label","CodeMirror Editor"),this.codeDiv=n,this.origElem.replaceWith(this.outerDiv),t.id!==this.divid&&this.outerDiv.appendChild(t),this.outerDiv.appendChild(n);var i=this.language;"sql"===i?i="text/x-sql":"java"===i||"kotlin"===i?i="text/x-java":"cpp"===i?i="text/x-c++src":"c"===i?i="text/x-csrc":"python3"===i?i="python":"octave"===i||"MATLAB"===i?i="text/x-octave":"html"!==i&&"htmlmixed"!==i||(i="htmlmixed");let r=[];(this.visiblePrefixEnd||this.visibleSuffixLength)&&(r=[{className:"CodeMirror-lock-markers",style:"width: 16px"}]);var s=o()(n,{value:this.code,lineNumbers:!0,mode:i,indentUnit:Number(window.getComputedStyle(document.body).getPropertyValue("--code-editor-indentation")||4),matchBrackets:!0,autoMatchParens:!0,gutters:r,screenReaderLabel:"ActiveCode Editor",extraKeys:{Tab:"indentMore","Shift-Tab":"indentLess","Ctrl-Space":"autocomplete"}});o().on(s,"refresh",(e=>{window.requestAnimationFrame((()=>{s.display.scrollbars.vert.style.bottom="16px"}))})),$(s.getWrapperElement()).resizable({resize:function(){s.setSize($(this).width(),$(this).height()),s.refresh()}}),s.on("keydown",((e,t)=>{s.getWrapperElement().style.borderTopColor="#b43232",s.getWrapperElement().style.borderBottomColor="#b43232"})),s.on("change",function(e){if(0==s.acEditEvent||void 0===s.acEditEvent){if(this.origText===s.getValue()||this.addingScrubber)return void console.log("Fake change event, skipping the log");this.isAnswered=!0,this.logBookEvent({event:"activecode",act:"edit",div_id:this.divid}),s.acEditEvent=!0}this.firstAfterRun&&(this.firstAfterRun=!1,this.startEditTimeStamp=new Date),window.requestAnimationFrame((()=>{this.editor.display.scrollbars.vert.style.bottom="16px"}))}.bind(this)),this.isTimed&&(s.on("paste",(function(e,t){t.preventDefault()})),document.addEventListener("copy",(function(e){e.preventDefault()})),document.addEventListener("cut",(function(e){e.preventDefault()})),document.addEventListener("paste",(function(e){e.preventDefault()})));let a=this;document.addEventListener("keydown",(function(e){"Tab"===e.key&&(s.tabDown=!0)})),document.addEventListener("keyup",(function(e){"Tab"===e.key&&(s.tabDown=!1)})),s.getInputField().addEventListener("focus",(function(e){s.tabDown?s.setOption("extraKeys",{Tab:!1,"Shift-Tab":!1}):s.setOption("extraKeys",{Tab:"indentMore","Shift-Tab":"indentLess"})})),this.containerDiv.addEventListener("keydown",(function(e){if("KeyS"===e.code&&(e.ctrlKey||e.metaKey)){if(a.runButton.disabled)return;a.runButton.click(),e.preventDefault()}"Slash"===e.code&&(e.ctrlKey||e.metaKey)&&("function"==typeof s.toggleComment&&s.toggleComment(),e.preventDefault())})),this.editor=s,window.requestAnimationFrame((()=>{this.editor.display.scrollbars.vert.style.bottom="16px"})),this.setLockedRegions(),this.setHighlightLines(),this.hidecode&&$(this.codeDiv).css("display","none")}async setHighlightLines(){this.editor.operation((()=>{this.highlightedLines.forEach((e=>{this.editor.removeLineClass(e,"wrap","CodeMirror__highlight-line")})),this.highlightedLines=[],this.highlightLines&&("number"==typeof this.highlightLines&&(this.highlightLines=this.highlightLines.toString()),this.highlightLines.split(",").forEach((e=>{let t=(e=e.trim()).split("-");if(t.length>1){let e=parseInt(t[0])-1,n=parseInt(t[1])-1;for(let t=e;t<=n;t++)t>=0&&t<=this.editor.doc.lastLine()&&(this.editor.addLineClass(t,"wrap","CodeMirror__highlight-line"),this.highlightedLines.push(t))}else{let e=parseInt(t[0])-1;e>=0&&e<=this.editor.doc.lastLine()&&(this.editor.addLineClass(e,"wrap","CodeMirror__highlight-line"),this.highlightedLines.push(e))}})))}))}async setLockedRegions(){this.editor.operation((()=>{function e(e){var t=document.createElement("div");t.className="CodeMirror__gutter-locked-marker",this.editor.setGutterMarker(e,"CodeMirror-lock-markers",t),this.lockGutterLines.push(e)}if(this.lockedLines.forEach((e=>{this.editor.removeLineClass(e,"wrap","CodeMirror__locked-line")})),this.lockedLines=[],this.lockGutterLines.forEach((e=>{this.editor.setGutterMarker(e,"CodeMirror-lock-markers",null)})),this.lockGutterLines=[],this.lockTextMarkers.forEach((e=>e.clear())),this.lockTextMarkers=[],this.visiblePrefixEnd){let t=this.editor.posFromIndex(this.visiblePrefixEnd-1).line;e.call(this,Math.floor((0+t)/2));for(let e=0;e<=t;e++)this.editor.addLineClass(e,"wrap","CodeMirror__locked-line"),this.lockedLines.push(e);let n=this.editor.posFromIndex(this.visiblePrefixEnd);this.lockTextMarkers.push(this.editor.markText({line:0,ch:0},{line:n.line,ch:n.ch},{readOnly:!0,atomic:!1,inclusiveLeft:!0,inclusiveRight:!1}))}if(this.visibleSuffixLength){let t=this.editor.doc.getValue().length-this.visibleSuffixLength,n=this.editor.posFromIndex(t),i=this.editor.doc.lastLine();e.call(this,Math.floor((n.line+i)/2));for(let e=n.line;e<=i;e++)this.editor.addLineClass(e,"wrap","CodeMirror__locked-line"),this.lockedLines.push(e);let r=this.editor.posFromIndex(t-1);this.lockTextMarkers.push(this.editor.markText({line:r.line,ch:r.ch},{line:this.editor.doc.lastLine()+1},{readOnly:!0,atomic:!1,inclusiveLeft:!1,inclusiveRight:!0}))}}))}async runButtonHandler(){this.runButton.disabled=!0,this.editor.getWrapperElement().style.borderTopColor=null,this.editor.getWrapperElement().style.borderBottomColor=null;try{await this.runProg()}catch(e){console.log(`there was an error ${e} running the code`)}this.logResults&&this.logCurrentAnswer(),this.runCoaches(),this.renderFeedback(),this.runButton.disabled=!1,this.runCount+=1,this.toggleAlert()}async getParsonsCodeTailor(){let e=this.language,t=this.editor.getValue(),n=this.divid,i="movable"===this.parsonspersonalize?"Solution":"partial"===this.parsonspersonalize?"Multiple":"unknown",r=this.parsonsexample,s=this.problem_description.split("\n").map((e=>e.trim())).filter((e=>""!==e)).join("\n"),o=function(t){if(null!==t&&""!==t){if("python"===e.toLowerCase()||"python3"===e.toLowerCase())return t.replace(/from unittest\.gui import TestCaseGui\s*\n/,"import unittest\n").replace(/class myTests\(TestCaseGui\):/,"class myTests(unittest.TestCase):").replace(/^\s*myTests\(\)\.main\(\)\s*$/m,"");if("java"===e.toLowerCase())return function(e){const t=e.match(/class\s+TestHelper\s*\{[\s\S]*?\}\s*/);return(t?t[0]:"")+"\n\npublic class BackendTest {\n public static void main(String[] args) {\n try {\n TestHelper.runAllTests();\n System.exit(0);\n } catch (Exception e) {\n System.exit(1);\n }\n }\n }"}(t)}}(this.suffix),a={language:e,student_code:t,problem_id:n,personalization_level:i,parsonsexample:r,problem_description:s,internal_test_case:o};return console.log("body:",a),new Promise(((e,t)=>{const n=new AbortController,i="Sorry, we are not able to generate Parsons blocks for you at this time.",r=setTimeout((()=>{n.abort(),t(i)}),18e4);fetch(`/ns/coach/parsons_scaffolding?course=${eBookConfig.course}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),signal:n.signal}).then((e=>(clearTimeout(r),e.ok?e.json():e.text().then((t=>{throw new Error(`HTTP ${e.status} - ${t}`)}))))).then((t=>e(t))).catch((e=>{clearTimeout(r),console.log("Error or timeout waiting for Parsons scaffolding response",e,this.divid);const n=document.getElementById("scaffolding-loading-prompt-"+this.divid);$(n).find("#loading-spinner").remove(),$(n).find("#encouragement-text").text("⚠️ "+i),$(n).find("#countdown-text").text("🫶 Please contact the teaching staff for help!"),t("Error in Parsons Scaffolding: "+e)}))}))}async reopenHelpBtnHandler(e){function t(e,t){const n=[];let i=0;const r=t-100;for(;ii&&(t=n+1)}n.push(e.substring(i,t)),i=t}return n}if(!0!==e&&(e=!1),window.latestParsonsHelpID==this.divid){$(`#scaffolding-container-${this.divid}`).removeClass("hidden");let e={type:"receive_help",reopen:!0};return void this.logBookEvent({event:"gptparsons_base_reopen",act:JSON.stringify(e),div_id:this.divid})}window.latestParsonsHelpID=this.divid;const n=this.helpText.split("||split||"),i=n[0],r=n[1],s=n[2],o=n[3];this.codeAnswer=i;const l=r;let u={type:"receive_help",reopen:!e,code_answer:this.codeAnswer,generation_type:s,solution_type:o};"movable"===this.parsonspersonalize||"partial"===this.parsonspersonalize?u.puzzle=function(e){if(!e||"string"!=typeof e)return"No valid Parsons content available";let t=e.replace(/]*>/g,"").replace(/<\/pre>/g,"");t=t.replace(//g,"\n");let n=document.createElement("div");return n.innerHTML=t,t=n.innerText||n.textContent,t.trim()}(l):(console.warn("No personalization level is set. Puzzle will not be assigned."),u.puzzle="No puzzle type selected"),(n=>{const i={type:n.type,reopen:n.reopen,generation_type:n.generation_type,solution_type:n.solution_type};if(this.logBookEvent({event:"gptparsons_base",act:JSON.stringify(i),div_id:this.divid}),n.code_answer){let i=1;const r=t(n.code_answer,512);r.forEach((s=>{this.logBookEvent({event:`gptparsons_code_${i}`,act:JSON.stringify({reopen:!e,type:"code",content:s,chunkIndex:i,totalChunks:r.length+(n.puzzle?t(n.puzzle,512).length:0)}),div_id:this.divid}),i++}))}if(n.puzzle){const i=t(n.puzzle,512);let r=1;i.forEach((t=>{this.logBookEvent({event:`gptparsons_puzzle_${r}`,act:JSON.stringify({reopen:!e,type:"puzzle",content:t,chunkIndex:r,totalChunks:i.length}),div_id:this.divid}),r++}))}})(u);let c=$(this.outerDiv).find(".ac_question").last().html();if("correctCode"!==l&&"emptyHelpParsons"!==l)var d=`\n
    \n
    \n
    `+c+"
    "+l+"
    ";else d="";if(document.getElementById(`parsons-scaffolding-${this.divid}`))$(`#scaffolding-container-${this.divid}`).removeClass("hidden");else{console.log("Creating new scaffolding container for",this.divid);let e=document.createElement("div");e.id=`scaffolding-container-${this.divid}`,e.classList.add("scaffolding-container"),this.outerDiv.insertBefore(e,this.outerDiv.firstChild);let t=document.createElement("button");t.classList.add("btn","btn-success"),t.innerText="Close Help",t.onclick=e=>{let t="unknown",n=e.currentTarget.closest(`#scaffolding-container-${this.divid}`);if(n){let e=n.querySelector(`#parsons-scaffolding-${this.divid}`);if(e){let n=e.querySelector(".runestone.parsons-container");if(n){let e=n.querySelector('[id^="help_"]');e?t=e.id:console.error('Inner div with id starting with "help_parsons_" not found')}else console.error("parsons-container not found")}else console.error("parsons-scaffolding not found")}else console.error("Scaffolding container not found");this.logBookEvent({event:"gptparsons_close",act:JSON.stringify({type:"close_help"}),div_id:t}),$(`#scaffolding-container-${this.divid}`).addClass("hidden")},e.appendChild(t);let n=document.createElement("button");n.id=`copy-answer-button-${this.puzzleScaffoldingDivid}`,n.classList.add("btn","btn-success","copy-button-hide"),n.innerText="Copy Answer to Clipboard",n.onclick=()=>{this.copyScaffoldingSolutionToClipboard()},e.appendChild(n);let i=document.createElement("div");i.id=`parsons-scaffolding-${this.divid}`,i.classList.add("parsons-scaffolding"),e.appendChild(i)}"movable"===this.parsonspersonalize||"partial"===this.parsonspersonalize?"correctCode"!==l&&"emptyHelpParsons"!==l?await(0,a.JK)(d,`parsons-scaffolding-${this.divid}`):"emptyHelpParsons"===l?document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML="
    Oops! Your code stumped our puzzle machine. Call in your instructor for a power-up!
    ":"correctCode"===l&&(document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML="
    Your code is already correct! No Parsons puzzle needed.
    "):document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML="
    No Parsons puzzle available.
    "}copyScaffoldingSolutionToClipboard(){var e=document.createElement("textarea");e.id="temp-textarea",document.querySelector(`#scaffolding-container-${this.divid}`).appendChild(e),"movable"===this.parsonspersonalize||"partial"===this.parsonspersonalize?e.value=this.codeAnswer:e.value="No solution available",console.log(this.codeAnswer),e.select(),e.setSelectionRange(0,99999);try{document.execCommand("copy"),e.remove();let t={type:"copy_help"};this.logBookEvent({event:"gptparsons_copy",act:JSON.stringify({...t}),div_id:this.divid}),$(`#copy-answer-button-${this.puzzleScaffoldingDivid}`).text("Copied!").prop("disabled",!0),setTimeout((()=>{$(`#copy-answer-button-${this.puzzleScaffoldingDivid}`).text("Copy Answer to Clipboard").prop("disabled",!1)}),2e3)}catch(e){alert("Oops! There was an issue copying to the clipboard. Please type the solution manually.")}}async parsonsBtnHandler(){function e(e,t){const n=[];let i=0;const r=t-100;for(;ii&&(t=n+1)}n.push(e.substring(i,t)),i=t}return n}if(this.parsonsBtn&&!this.parsonsBtn.disabled&&(this.parsonsBtn.disabled=!0),null!=this.prevHelpedCode&&this.prevHelpedCode.trim()==this.editor.getValue().trim())return void alert('Your code has not changed, please click "See Help Again"');let t=document.querySelector("#temp-textarea");t&&t.remove(),this.prevHelpedCode=this.editor.getValue();let n=$(this.outerDiv).find("#scaffolding-loading-prompt-"+this.divid);n.length&&n.remove();let i=document.createElement("div");i.id="scaffolding-loading-prompt-"+this.divid,i.classList.add("scaffolding-loading-prompt");let r=document.createElement("div");r.id="loading-spinner",this.outerDiv.insertBefore(i,this.outerDiv.firstChild);let s=document.createElement("div");s.id="encouragement-text",i.appendChild(s),i.appendChild(r);let o=document.createElement("div");o.id="countdown-text",i.appendChild(o),$(i).addClass("loading"),i.scrollIntoView(),s.innerText="Appreciate your effort! Please wait while we generate the help for you.",o.innerText="Working hard on displaying all blocks at once for you...";let a={type:"request_help",code:this.editor.getValue()};if(this.logBookEvent({event:"gptparsons_request_base",act:this.parsonspersonalize,div_id:this.divid}),a.code){let t=1;e(a.code,512).forEach((n=>{this.logBookEvent({event:`gptparsons_request_code_${t}`,act:JSON.stringify({type:"code",content:n,requestChunkIndex:t,totalChunks:t.length+e(a.code,512).length}),div_id:this.divid}),t++}))}this.helpText=await this.getParsonsCodeTailor(),$(this.outerDiv).find("#scaffolding-loading-prompt-"+this.divid).removeClass("loading"),window.latestParsonsHelpID="",this.reopenHelpBtnHandler(!0),this.helpLoaded||(this.helpLoaded=!0,$(this.outerDiv).find(".reopen-help-btn").removeClass("hide"),"movable"!==this.parsonspersonalize&&"partial"!==this.parsonspersonalize||$(this.outerDiv).find(".parsons-scaffolding-btn").text("Regenerate Help"))}createControls(){var e,t=document.createElement("div");if($(t).addClass("ac_actions"),(e=document.createElement("button")).title=$.i18n("msg_activecode_run_button_title"),$(e).text($.i18n("msg_activecode_run_code")),$(e).addClass("btn btn-success run-button"),t.appendChild(e),this.runButton=e,this.runButton.onclick=this.runButtonHandler.bind(this),$(e).attr("type","button"),(this.enabledownload||eBookConfig.downloadsEnabled)&&this.addDownloadButton(t),this.hidecode||this.hidehistory||this.addHistoryScrubber(!0),this.parseBooleanAttribute(this.origElem,"data-gradebutton")&&!this.graderactive&&this.addFeedbackButton(t),this.hidecode&&this.enableHideShow(t),this.parseBooleanAttribute(this.origElem,"data-codelens")&&!this.graderactive&&this.enableCodeLens(t),"movable"===this.parsonspersonalize||"partial"===this.parsonspersonalize){let e=document.createElement("button");e.innerText="Get Help",e.classList.add("btn","parsons-scaffolding-btn"),e.onclick=this.parsonsBtnHandler.bind(this),t.appendChild(e);let n=document.createElement("button");n.innerText="See Help Again",n.classList.add("btn","reopen-help-btn","hide"),n.onclick=this.reopenHelpBtnHandler.bind(this),t.appendChild(n)}g.has(this.language)&&this.enableReformat(t),$(this.origElem).data("audio")&&this.enableAudioTours(t),eBookConfig.isInstructor&&this.enableInstructorSharing(t),this.enablePartner&&this.setupPartner(t),this.chatcodes&&eBookConfig.enable_chatcodes&&this.enableChatCodes(t),$(this.outerDiv).prepend(t),this.question&&($(this.question).html().match(/^\s+$/)?$(this.question).remove():$(this.outerDiv).prepend(this.question)),this.controlDiv=t}addFeedbackButton(e){let t=document.createElement("button");$(t).addClass("ac_opt btn btn-default"),$(t).text($.i18n("msg_activecode_show_feedback")),$(t).css("margin-left","10px"),$(t).attr("type","button"),this.gradeButton=t,e.appendChild(t),$(t).click(this.createGradeSummary.bind(this))}addDownloadButton(e){let t=document.createElement("button");$(t).text("Download"),$(t).addClass("btn save-button"),e.appendChild(t),this.downloadButton=t,$(t).click(this.downloadFile.bind(this,this.language)),$(t).attr("type","button")}enableHideShow(e){$(this.runButton).attr("disabled","disabled");let t=document.createElement("button");$(t).addClass("ac_opt btn btn-default"),$(t).text($.i18n("msg_activecode_show_code")),$(t).css("margin-left","10px"),$(t).attr("type","button"),this.showHideButt=t,e.appendChild(t),$(t).click(function(){$(this.codeDiv).toggle(),null==this.historyScrubber?this.addHistoryScrubber(!0):$(this.historyScrubber.parentElement).toggle(),$(this.showHideButt).text()==$.i18n("msg_activecode_show_code")?$(this.showHideButt).text($.i18n("msg_activecode_hide_code")):$(this.showHideButt).text($.i18n("msg_activecode_show_code")),$(this.runButton).attr("disabled")?$(this.runButton).removeAttr("disabled"):$(this.runButton).attr("disabled","disabled")}.bind(this))}enableCodeLens(e){let t=document.createElement("button");$(t).addClass("ac_opt btn btn-default"),$(t).text($.i18n("msg_activecode_show_codelens")),$(t).css("margin-left","10px"),this.clButton=t,e.appendChild(t),$(t).click(this.showCodelens.bind(this))}enableReformat(e){let t=document.createElement("button");$(t).addClass("ac_opt btn btn-default"),$(t).text($.i18n("msg_activecode_reformat")),$(t).css("margin-left","10px"),this.reformatButton=t,e.appendChild(t),$(t).click(this.reformat.bind(this))}enableAudioTours(e){let t=document.createElement("button");$(t).addClass("ac_opt btn btn-default"),$(t).text($.i18n("msg_activecode_audio_tour")),$(t).css("margin-left","10px"),this.atButton=t,e.appendChild(t),$(t).click(function(){new r(this.divid,this.code,1,$(this.origElem).data("audio"))}.bind(this))}enableInstructorSharing(e){let t=document.createElement("button");$(t).addClass("btn btn-info"),$(t).text("Share Code"),$(t).css("margin-left","10px"),this.shareButt=t,e.appendChild(t),$(t).click(async function(){if(!confirm("You are about to share this code with ALL of your students. Are you sure you want to continue?"))return;let e={divid:this.divid,code:this.editor.getValue(),lang:this.language},t=new Request(eBookConfig.ajaxURL+"broadcast_code.json",{method:"POST",headers:this.jsonHeaders,body:JSON.stringify(e)}),n=await fetch(t);if(!n.ok)return void(303===n.status||404===n.status?alert("You must be logged in to share code"):alert("Sharing Failed return status: ${post_promise.status}"));let i=await n.json();"success"===i.mess?alert(`Shared Code with ${i.share_count} students`):alert("Sharing Failed")}.bind(this))}setupPartner(e){var t=document.createElement("input");t.type="checkbox",t.id=`${this.divid}_part`,e.appendChild(t);var n=document.createElement("label");n.for=`${this.divid}_part`,$(n).text("Pair?"),e.appendChild(n),$(t).click(function(){if(this.partner)this.partner=!1,$(i).hide(),this.partner="",i.value="",$(n).text("Pair?");else{let e=localStorage.getItem("partnerAgree");if(!e){if(e=confirm("Pair Programming should only be used with the consent of your instructor.Your partner must be a registered member of the class and have agreed to pair with you.By clicking OK you certify that both of these conditions have been met."),!e)return;localStorage.setItem("partnerAgree","true")}this.partner=!0,$(n).text("with: "),$(i).show()}}.bind(this));var i=document.createElement("input");i.type="text",e.appendChild(i),$(i).hide(),$(i).change(function(){this.partner=i.value}.bind(this))}enableChatCodes(e){var t=document.createElement("div"),n=document.createElement("span"),i=window.location.host+"-"+this.divid;e.appendChild(t),$(t).text("Chat: "),$(t).append(n);let r=document.createElement("a");$(r).addClass("ac_opt btn btn-default"),$(r).text("Create Channel"),$(r).css("margin-left","10px"),$(r).attr("type","button"),$(r).attr("target","_blank"),$(r).attr("href","http://"+p+"/new?"+$.param({topic:window.location.host+"-"+this.divid,code:this.editor.getValue(),lang:"Python"})),this.chatButton=r,t.appendChild(r);var s=function(){var e=f.data,t=1;$(n).html(""),e.channels.forEach((function(e){if(!e.archived&&i===e.topic){var r=$(""),s="http://"+p+"/"+e.channelName;r.attr({href:s,target:"_blank"}),r.text(" "+e.channelName+"("+t+") "),$(n).append(r),t++}})),1===t&&$(n).text("(no active converstations on this problem)")};f.subscribe(s),f.on("op",s)}enableSaveLoad(){$(this.runButton).text($.i18n("msg_activecode_save_run"))}async addHistoryScrubber(e){let t;this.addingScrubber=!0;var n={acid:this.divid};if(void 0!==this.sid&&(n.sid=this.sid),console.log("before get hist"),eBookConfig.practice_mode||!eBookConfig.isLoggedIn||this.isTimed&&!this.assessmentTaken)this.renderScrubber();else{let i=new Request(`${eBookConfig.new_server_prefix}/assessment/gethist`,{method:"POST",headers:this.jsonHeaders,body:JSON.stringify(n)});try{t=await fetch(i);let e=await t.json();if(!t.ok)throw new Error(`Failed to get the history data: ${e.detail}`);if(e=e.detail,void 0!==e.history){this.history=this.history.concat(e.history);for(let t in e.timestamps)this.timestamps.push(new Date(e.timestamps[t]).toLocaleString())}}catch(e){console.log(`unable to fetch history: ${e}`)}this.renderScrubber(e)}return this.addingScrubber=!1,"success"}renderScrubber(e){console.log("making a new scrubber");var t=document.createElement("div");$(t).css("display","inline-block"),$(t).css("margin-left","10px"),$(t).css("margin-right","10px"),$(t).css({"min-width":"200px","max-width":"300px"});var n=document.createElement("div");if(this.timestampP=document.createElement("span"),this.slideit=function(e,t){let i=this.history[$(n).slider("value")],r=this.readdLockedCode(i);this.editor.setValue(r),this.setLockedRegions();var s=this.timestamps[$(n).slider("value")];let o=$(n).slider("value"),a=this.history.length;$(this.timestampP).text(`${s} - ${o+1} of ${a}`),null!==e&&"slide"!=e.type&&this.logBookEvent({event:"activecode",act:"slide:"+s,div_id:this.divid}),this.setHighlightLines()},$(n).slider({max:this.history.length-1,value:this.history.length-1}),$(n).css("margin","10px"),$(n).on("slide",this.slideit.bind(this)),$(n).on("slidechange",this.slideit.bind(this)),t.appendChild(n),n.childNodes[0].setAttribute("aria-label","History slider"),t.appendChild(this.timestampP),this.deadline){let e=0,t=!1;for(;ethis.deadline?t=!0:e+=1;e-=1,n.value=Math.max(e,0);let i=this.history[n.value],r=this.readdLockedCode(i);this.editor.setValue(r),this.setLockedRegions(),$(n).slider("value",n.value)}else if(e){n.value=this.history.length-1;let e=this.history[n.value],t=this.readdLockedCode(e);this.editor.setValue(t),this.setLockedRegions()}else n.value=0;this.setHighlightLines();let i=$(n).slider("value"),r=this.history.length,s=this.timestamps[$(n).slider("value")];$(this.timestampP).text(`${s} - ${i+1} of ${r}`),this.historyScrubber=n,$(t).insertAfter(this.runButton)}createOutput(){var e=document.createElement("div");$(e).addClass("ac_output"),this.outDiv=e,this.output=document.createElement("pre"),this.output.id=this.divid+"_stdout",this.output.setAttribute("aria-label","Output"),this.output.setAttribute("aria-live","polite"),this.output.setAttribute("aria-atomic","true"),this.output.setAttribute("role","log"),this.output.innerHTML="",$(this.output).css("max-height","400px"),$(this.output).css("overflow","auto"),this.graphics=document.createElement("div"),this.graphics.id=this.divid+"_graphics",$(this.graphics).addClass("ac-canvas"),$(this.graphics).on("DOMNodeInserted","canvas",function(){$(this.graphics).addClass("visible-ac-canvas")}.bind(this));var t=document.createElement("div");t.classList.add("alert","alert-warning","codecoach"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.setAttribute("role","log"),$(t).css("display","none"),t.appendChild(document.createElement("h3")).textContent=$.i18n("msg_activecode_code_coach"),this.outerDiv.appendChild(t),this.codecoach=t,e.appendChild(this.output),e.appendChild(this.graphics),this.outerDiv.appendChild(e);var n=document.createElement("div");n.classList.add("codelens"),n.id=`${this.divid}_codelens`,$(n).css("display","none"),this.codelens=n,this.outerDiv.appendChild(n),this.eContainer=document.createElement("div"),this.eContainer.setAttribute("aria-live","polite"),this.eContainer.setAttribute("aria-atomic","true"),this.eContainer.setAttribute("role","log"),this.eContainer.className="error alert alert-danger",this.eContainer.id=this.divid+"_errinfo",this.eContainer.style.visibility="hidden",this.outerDiv.appendChild(this.eContainer)}disableSaveLoad(){$(this.saveButton).addClass("disabled"),$(this.saveButton).attr("title","Login to save your code"),$(this.loadButton).addClass("disabled"),$(this.loadButton).attr("title","Login to load your code")}computeChangesPerSecond(){let e;if(this.editor.getValue(),!this.historyScrubber)return 0;e=this.history[this.historyScrubber.value-1];const t=this.computeEditDistance(),n=((new Date).getTime()-this.startEditTimeStamp)/1e3;return n>36e3?-1:t/n}computeEditDistance(){const e=this.editor.getValue();let t;if(!this.historyScrubber)return 0;t=this.history[this.historyScrubber.value];const n=[];for(let i=0;i<=e.length;i++){n[i]=[];for(let e=0;e<=t.length;e++)n[i][e]=0===i?e:0===e?i:0}for(let i=1;i<=e.length;i++)for(let r=1;r<=t.length;r++)e[i-1]===t[r-1]?n[i][r]=n[i-1][r-1]:n[i][r]=Math.min(n[i-1][r]+1,n[i][r-1]+1,n[i-1][r-1]+1);return n[e.length][t.length]}downloadFile(e){var t=this.divid+"_"+(new Date).toJSON().substring(0,10).split("-").join("")+"."+_[e],n=this.editor.getValue();if("Blob"in window){var i=n.replace(/\n/g,"\r\n"),r=new Blob([i],{type:"text/plain"});if("msSaveOrOpenBlob"in navigator)navigator.msSaveOrOpenBlob(r,t);else{var s=document.createElement("a");s.download=t,s.innerHTML="Download File",s.href=window.URL.createObjectURL(r),s.style.display="none",document.body.appendChild(s),s.click()}}else alert("Your browser does not support the HTML5 Blob.")}async createGradeSummary(){var e={div_id:this.divid};let t=new Request(eBookConfig.ajaxURL+"getassignmentgrade",{method:"POST",headers:this.jsonHeaders,body:JSON.stringify(e)}),n=await fetch(t),i=await n.json();var r;return i?2==i.version?(r="

    Grade Report

    This question: "+i.grade,i.released&&(r+=" out of "+i.max),r+="

    ",0==i.released&&(r+="Preliminary Comments: "),r+=i.comment+"

    "):r="

    Grade Report

    This assignment: "+i.grade+"

    "+i.comment+"

    Number of graded assignments: "+i.count+"

    Average score: "+i.avg+"

    ":r="

    The server did not return any grade information

    ",$(``).modal(),n}async showCodelens(){if("none"!=this.codelens.style.display)return this.codelens.style.display="none",void(this.clButton.innerText=$.i18n("msg_activecode_show_in_codelens"));this.codelens.style.display="block",this.clButton.innerText=$.i18n("msg_activecode_hide_codelens");var e=this.codelens.firstChild;e&&this.codelens.removeChild(e);var t=await this.buildProg(!1),n={};n.code=t,n.origin="opt-frontend.js",n.cumulative=!1,n.heapPrimitives=!1,n.drawParentPointers=!1,n.textReferences=!1,n.showOnlyOutputs=!1,n.rawInputLstJSON=JSON.stringify([]),"python"==this.language?this.python3?n.py=3:n.py=2:"javascript"==this.langauge?n.py="js":n.py=this.language,n.curInstr=0,n.codeDivWidth=350,n.codeDivHeight=400;var i=`https://pythontutor.com/iframe-embed.html#${$.param(n)}`,r=document.createElement("iframe");r.setAttribute("id",this.divid+"_codelens"),r.setAttribute("width","100%"),r.setAttribute("height","500"),r.setAttribute("style","display:block"),r.style.background="#fff",r.src=i,this.codelens.appendChild(r),this.logBookEvent({event:"codelens",act:"view",div_id:this.divid})}reformat(){const e=this.editor.firstLine(),t=this.editor.lastLine();for(let n=e;n<=t;n++)this.editor.indentLine(n);this.reformatButton.blur()}toggleEditorVisibility(){}addErrorMessage(e){this.errLastRun=!0,console.log(e);var t=$("

    ").html("Error");this.eContainer.appendChild(t[0]);var n=this.eContainer.appendChild(document.createElement("pre"));if(e.traceback&&e.traceback.length>=1){var i=e.traceback[0].lineno;if(i<=this.pretextLines)return void(n.innerHTML="An error occurred in the hidden, included code. Sorry we can't give you a more helpful error message");if(i>this.progLines+this.pretextLines)return void(n.innerHTML=`An error occurred after the end of your code.\nOne possible reason is that you have an unclosed parenthesis or string.\nAnother possibility is that there is an error in the hidden test code.\nYet another is that there is an internal error. The internal error message is: ${e.message}`);this.pretextLines>0&&(e.traceback[0].lineno=e.traceback[0].lineno-this.pretextLines+1)}var r=e.toString(),s=r.indexOf(":"),o=r.substring(0,s);n.innerHTML=r,$(this.eContainer).append("

    Description

    "),this.eContainer.appendChild(document.createElement("p")).innerHTML=k[o],$(this.eContainer).append("

    To Fix

    "),this.eContainer.appendChild(document.createElement("p")).innerHTML=k[o+"Fix"],o.toLowerCase()}setTimeLimit(e){var t=this.timelimit;void 0!==e&&(t=e),this.code.indexOf("ontimer")>-1||this.code.indexOf("onclick")>-1||this.code.indexOf("onkey")>-1||this.code.indexOf("setDelay")>-1?Sk.execLimit=null:Sk.execLimit="off"===t?null:t||25e3}builtinRead(e){if(void 0===Sk.builtinFiles||void 0===Sk.builtinFiles.files[e])throw $.i18n("msg_activecode_file_not_found",e);return Sk.builtinFiles.files[e]}fileReader(e){let t=document.getElementById(e);if(null===t&&(t=document.querySelector(`[data-filename="${e}"]`)),Sk.builtinFiles.files.hasOwnProperty(e)){let n=Sk.builtinFiles.files[e];if(null===t)return n;console.log("Name conflict for file: "+e+" in Skulpt and in the DOM. Using DOM file.")}if(null!=t){let e;if("textarea"==t.nodeName.toLowerCase())e=t.value;else{let n=t.querySelector("pre");e=n?n.textContent:t.textContent}return e}if(!e.endsWith(".js")&&!e.endsWith(".py")){let t=null;if($.ajax({async:!1,url:`/ns/logger/get_source_code?course_id=${eBookConfig.course}&filename=${e}`,success:function(e){t=e.detail.file_contents}}),t)return t;throw new Sk.builtin.IOError($.i18n("msg_activecode_no_file_or_dir",e))}}outputfun(e){if(!(this.outputLineCount>1e3))return e=e.replace(//g,">").replace(/\n/g,"
    "),new Sk.misceval.promiseToSuspension(new Promise(function(t){setTimeout(function(){this.outputLineCount<1e3?($(this.output).append(e),this.outputLineCount+=1,t(Sk.builtin.none.none$)):1e3==this.outputLineCount&&($(this.output).append("Too Much output"),this.outputLineCount+=1,h=!0,t(Sk.builtin.none.none$))}.bind(this),1)}.bind(this)))}filewriter(e,t){let n=document.getElementById(e.name);if(n)0==e.pos$&&$(n).val("");else{let t=document.createElement("div");$(t).addClass("runestone");let i=document.createElement("div");$(i).addClass("datafile_caption"),i.innerHTML=`Data file: ${e.name}`,n=document.createElement("textarea"),n.rows=10,n.cols=50,n.id=e.name,$(n).css("margin-bottom","5px"),$(n).addClass("ac_output"),t.appendChild(i),t.appendChild(n),this.outerDiv.appendChild(t)}let i=$(n).val();return i+=t.v,$(n).val(i),$(n).css("display","block"),e.pos$=i.length,i.length}async getIncludedCode(e){if(window.componentMap[e])return window.componentMap[e].editor.getValue();{let t=new Request(`/ns/logger/get_source_code?course_id=${eBookConfig.course}&acid=${e}`,{method:"GET",headers:this.jsonHeaders}),n=await fetch(t);return(await n.json()).detail.file_contents}}trimLockedCode(e){let t=this.visiblePrefix?this.visiblePrefix.length:0,n=this.visibleSuffix?this.visibleSuffix.length:0;return n>0?e.slice(t,-n):e.slice(t)}readdLockedCode(e){return(this.visiblePrefix||"")+e+(this.visibleSuffix||"")}async buildProg(e){var t,n=this.editor.getValue()+"\n";if(this.prefix&&(n=this.prefix+n),this.pretext="",this.pretextLines=0,this.progLines=n.match(/\n/g).length+1,this.includes){t="";for(var i=0;i{for(let t of e)if("fulfilled"===t.status&&null!==t.value&&""!==t.value.trim()){let e=document.createElement("div");e.classList.add("python_check_results"),e.appendChild(document.createElement("pre")).textContent=t.value,$(this.codecoach).css("display","block"),setTimeout((()=>{this.codecoach.append(e)}),10)}}))}renderFeedback(){if(this.unit_results_divid)if(this.unit_results_divid.indexOf("_offscreen_")>0){let e=`${this.divid}_offscreen_unit_results`,t=document.getElementById(e),n=document.body.removeChild(t);$(this.outerDiv).find(`#${e}`).length>0?n=$(this.outerDiv).find(`#${e}`)[0]:this.outerDiv.appendChild(n),$(n).show()}else{let e=this.divid+"_unit_results";const t=document.getElementById(e).querySelectorAll("tr > td:first-child");for(const e of t){let t="rgb(131, 211, 130)"===e.style.backgroundColor;e.style.backgroundColor=null,e.classList.add(t?"ac-feedback-pass":"ac-feedback-fail")}if(0==$(this.outerDiv).find(`#${e}`).length&&0==$(this.outerDiv).find(`#${e}_offscreen_unit_results`).length){let t=document.getElementById(e);t&&this.outerDiv.appendChild(t)}}}toggleAlert(){this.is_toggle&&3==this.runCount&&("success"==this.errinfo&&100==this?.unit_results.substring(8,11)||(setTimeout((function(){alert("Help is Available Using the Toggle Question Selector! You can try the Mixed-up Question first.")}),500),this.logBookEvent({event:"togglealert",act:"Help is Available Using the Toggle Question Selector",div_id:this.divid})))}async runProg(e,t){console.log("starting runProg"),this.output.innerHTML="",h=!1,this.outputLineCount=0,this.outputLines=[],this.logResults=void 0===t||t,"boolean"!=typeof e&&(e=!1);var n=await this.buildProg(!0);if(this.saveCode="True",$(this.output).text(""),this.unit_results_divid){let e=document.getElementById(this.unit_results_divid+"_unit_results");e&&(e.innerHTML="")}this.eContainer.innerHTML="",this.eContainer.style.visibility="hidden",this.codelens&&(this.codelens.style.display="none"),this.clButton&&(this.clButton.innerText=$.i18n("msg_activecode_show_in_codelens")),Sk.configure({output:this.outputfun.bind(this),read:this.fileReader,filewrite:this.filewriter.bind(this),__future__:Sk.python3,killableWhile:!0,killableFor:!0,nonreadopen:!0,imageProxy:"/ns/rsproxy/imageproxy",inputfunTakesPrompt:!0,jsonpSites:["https://itunes.apple.com"]}),Sk.divid=this.divid,Sk.logResults=t,this.graderactive&&this.outerDiv.closest(".loading")?Sk.gradeContainer=this.outerDiv.closest(".loading").id:Sk.gradeContainer=this.divid,this.setTimeLimit(),(Sk.TurtleGraphics||(Sk.TurtleGraphics={})).target=this.graphics,Sk.canvas=this.graphics.id,e||(this.saveCode=await this.manage_scrubber(this.saveCode),$(this.runButton).attr("disabled","disabled"),$(this.historyScrubber).off("slidechange"),$(this.historyScrubber).slider("disable"),this.outDiv.style.visibility="visible");try{await Sk.misceval.asyncToPromise((function(){return Sk.importMainWithBody("",!1,n,!0)}),{"*":()=>{if(h)throw console.log("stopExecution is true"),new Error("The program was interrupted")}}),e||(this.slideit&&$(this.historyScrubber).on("slidechange",this.slideit.bind(this)),$(this.historyScrubber).slider("enable")),this.errLastRun=!1,this.errinfo="success"}catch(t){e||($(this.historyScrubber).on("slidechange",this.slideit.bind(this)),$(this.historyScrubber).slider("enable")),this.errinfo=t.toString(),this.eContainer.style.visibility="visible",setTimeout((()=>{this.addErrorMessage(t)}),10)}finally{$(this.runButton).removeAttr("disabled"),this.firstAfterRun=!0,void 0!==window.allVisualizers&&$.each(window.allVisualizers,(function(e,t){t.redrawConnectors()})),this.editor.acEditEvent=!1}}disableInteraction(){$(this.runButton).hide(),$(this.codeDiv).addClass("ac-disabled")}}var _={python:"py",html:"html",javascript:"js",java:"java",python2:"py",python3:"py",cpp:"cpp",c:"c",sql:"sql",octave:"m",kotlin:"kt"};function b(e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)}var g=new Set(["java","cpp","c","javascript"]),k={};k.ParseError=$.i18n("msg_sctivecode_parse_error"),k.ParseErrorFix=$.i18n("msg_sctivecode_parse_error_fix"),k.TypeError=$.i18n("msg_activecode_type_error"),k.TypeErrorFix=$.i18n("msg_activecode_type_error_fix"),k.NameError=$.i18n("msg_activecode_name_error"),k.NameErrorFix=$.i18n("msg_activecode_name_error_fix"),k.ValueError=$.i18n("msg_activecode_value_error"),k.ValueErrorFix=$.i18n("msg_activecode_value_error_fix"),k.AttributeError=$.i18n("msg_activecode_attribute_error"),k.AttributeErrorFix=$.i18n("msg_activecode_attribute_error_fix"),k.TokenError=$.i18n("msg_activecode_token_error"),k.TokenErrorFix=$.i18n("msg_activecode_token_error_fix"),k.TimeLimitError=$.i18n("msg_activecode_time_limit_error"),k.TimeLimitErrorFix=$.i18n("msg_activecode_time_limit_error_fix"),k.TimeoutError=$.i18n("msg_activecode_time_limit_error"),k.TimeoutErrorFix=$.i18n("msg_activecode_time_limit_error_fix"),k.Error=$.i18n("msg_activecode_general_error"),k.ErrorFix=$.i18n("msg_activecode_general_error_fix"),k.SyntaxError=$.i18n("msg_activecode_syntax_error"),k.SyntaxErrorFix=$.i18n("msg_activecode_syntax_error_fix"),k.IndexError=$.i18n("msg_activecode_index_error"),k.IndexErrorFix=$.i18n("msg_activecode_index_error_fix"),k.URIError=$.i18n("msg_activecode_uri_error"),k.URIErrorFix=$.i18n("msg_activecode_uri_error_fix"),k.ImportError=$.i18n("msg_activecode_import_error"),k.ImportErrorFix=$.i18n("msg_activecode_import_error_fix"),k.ReferenceError=$.i18n("msg_activecode_reference_error"),k.ReferenceErrorFix=$.i18n("msg_activecode_reference_error_fix"),k.ZeroDivisionError=$.i18n("msg_activecode_zero_division_error"),k.ZeroDivisionErrorFix=$.i18n("msg_activecode_zero_division_error_fix"),k.RangeError=$.i18n("msg_activecode_range_error"),k.RangeErrorFix=$.i18n("msg_activecode_range_error_fix"),k.InternalError=$.i18n("msg_activecode_internal_error"),k.InternalErrorFix=$.i18n("msg_activecode_internal_error_fix"),k.IndentationError=$.i18n("msg_activecode_indentation_error"),k.IndentationErrorFix=$.i18n("msg_activecode_indentation_error_fix"),k.NotImplementedError=$.i18n("msg_activecode_not_implemented_error"),k.NotImplementedErrorFix=$.i18n("msg_activecode_not_implemented_error_fix"),k.KeyError=$.i18n("msg_activecode_key_error"),k.KeyErrorFix=$.i18n("msg_activecode_key_error_fix"),k.AssertionError=$.i18n("msg_activecode_assertion_error"),k.AssertionErrorFix=$.i18n("msg_activecode_assertion_error_fix"),String.prototype.replaceAll=function(e,t){return this.split(e).join(t)}},60893:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});class i{constructor(e,t){let n=new RegExp("Expected:\\s+(.*?)Actual:\\s+(.*?)Message:\\s+(.*?)Passed:\\s+(true|false)","g");this.textResults="";let i=e.matchAll(n),r=document.createElement("div");r.classList.add("unittest-results");let s=document.createElement("table");s.classList.add("ac-feedback"),r.appendChild(s),r.setAttribute("id",`${t}_unit_results`);let o=document.createElement("tr");o.innerHTML='ResultExpectedActualNotes',s.appendChild(o);for(const t of i){let n=document.createElement("tr"),i=document.createElement("td");i.classList.add("ac-feedback"),"true"==t[t.length-1]?(i.classList.add("ac-feedback-pass"),i.innerHTML=$.i18n("msg_activecode_passed")):(i.classList.add("ac-feedback-fail"),i.innerHTML=$.i18n("msg_activecode_failed")),n.appendChild(i),s.appendChild(n);for(let e=1;e")).replace(/(
    )+/g,"
    ")).replaceAll("<img","{},67476:()=>{},67920:()=>{},73565:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>S});var i=n(54215),r=n(29184);class s extends i.K{constructor(e){super(e),this.code=$("\n \n \n \n \n `,s=document.createElement("div");s.innerHTML=r,document.body.appendChild(s);let o=document.getElementById("ac_modal_"+e);new MutationObserver((e=>{e.forEach((e=>{"style"!==e.attributeName&&"class"!==e.attributeName||(0,i.c)(o)&&o.querySelectorAll(".CodeMirror").forEach((function(e){e.CodeMirror.refresh()}))}))})).observe(o,{attributes:!0,attributeFilter:["style","class"]}),document.querySelector(".ac-modal-header button.close").addEventListener("click",(function(){document.getElementById("ac_modal_"+e).style.display="none",document.querySelector(".activecode-toggle").focus()}))}static toggleScratchActivecode(){if(!eBookConfig.enableScratchAC)return;var e="ac_modal_"+eBookConfig.scratchDiv,t=document.getElementById(e);t.classList.remove("ac_section"),t.style.display="none"===t.style.display||""===t.style.display?"block":"none";const n='.first-focusable, button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';let i=t.querySelector(n),r=t.querySelectorAll(n),s=r[r.length-1];t.addEventListener("keydown",(e=>{"Tab"===e.key?(i=t.querySelector(n),r=t.querySelectorAll(n),s=r[r.length-1],e.shiftKey?document.activeElement===i&&(e.preventDefault(),s.focus()):document.activeElement===s&&(e.preventDefault(),i.focus())):"Escape"===e.key&&(t.style.display="none",document.querySelector(".activecode-toggle").focus())})),i&&(console.log(`focus on ${i}`),i.focus())}}document.addEventListener("runestone:login-complete",(function(){if(S.createScratchActivecode(),document.querySelectorAll("[data-component='activecode']").forEach((function(e){if(null===e.closest("[data-component='timedAssessment']"))try{let t=e.querySelector("textarea");window.componentMap[e.id]=S.createActiveCode(e,t?t.dataset.lang:null)}catch(t){console.error(`Error rendering Activecode Problem ${e.id}\n Details: ${t}`),console.error(t.stack)}})),f)for(let e in window.componentMap)window.componentMap[e].disableSaveLoad&&window.componentMap[e].disableSaveLoad();else for(let e in window.componentMap)window.componentMap[e].enableSaveLoad&&window.componentMap[e].enableSaveLoad()})),void 0===window.component_factory&&(window.component_factory={}),window.component_factory.activecode=S.createActiveCodeFromOpts,window.ACFactory=S,document.addEventListener("runestone:logout",(function(){f=!0})),document.addEventListener("runestone:logout",(function(){for(let e in window.componentMap)window.componentMap.hasOwnProperty(e)&&"activecode"==window.componentMap[e].attributes["data-component"]&&window.componentMap[e].disableSaveLoad()}))},90132:()=>{$.i18n().load({en:{msg_activecode_load_history:"Load History",msg_activecode_audio_tour:"Audio Tour",msg_activecode_loaded_code:"Loaded your saved code.",msg_activecode_no_saved_code:"No saved code.",msg_activecode_run_code:"Run",msg_activecode_show_feedback:"Show Feedback",msg_activecode_show_code:"Show Code",msg_activecode_hide_code:"Hide Code",msg_activecode_show_codelens:"Show CodeLens",msg_activecode_show_in_codelens:"Show in CodeLens",msg_activecode_hide_codelens:"Hide Codelens",msg_activecode_reformat:"Reformat",msg_activecode_parse_error:"A parse error means that Python does not understand the syntax on the line the error message points out. Common examples are forgetting commas beteween arguments or forgetting a : on a for statement",msg_activecode_parse_error_fix:"To fix a parse error you just need to look carefully at the line with the error and possibly the line before it. Make sure it conforms to all of Python's rules.",msg_activecode_type_error:"Type errors most often occur when an expression tries to combine two objects with types that should not be combined. Like raising a string to a power",msg_activecode_type_error_fix:"To fix a type error you will most likely need to trace through your code and make sure the variables have the types you expect them to have. It may be helpful to print out each variable along the way to be sure its value is what you think it should be.",msg_activecode_name_error:"A name error almost always means that you have used a variable before it has a value. Often this may be a simple typo, so check the spelling carefully.",msg_activecode_name_error_fix:"Check the right hand side of assignment statements and your function calls, this is the most likely place for a NameError to be found.",msg_activecode_value_error:"A ValueError most often occurs when you pass a parameter to a function and the function is expecting one type and you pass another.",msg_activecode_value_error_fix:"The error message gives you a pretty good hint about the name of the function as well as the value that is incorrect. Look at the error message closely and then trace back to the variable containing the problematic value.",msg_activecode_attribute_error:"This error message is telling you that the object on the left hand side of the dot, does not have the attribute or method on the right hand side.",msg_activecode_attribute_error_fix:"The most common variant of this message is that the object undefined does not have attribute X. This tells you that the object on the left hand side of the dot is not what you think. Trace the variable back and print it out in various places until you discover where it becomes undefined. Otherwise check the attribute on the right hand side of the dot for a typo.",msg_activecode_token_error:"Most of the time this error indicates that you have forgotten a right parenthesis or have forgotten to close a pair of quotes.",msg_activecode_token_error_fix:"Check each line of your program and make sure that your parenthesis are balanced.",msg_activecode_time_limit_error:"Your program is running too long. Most programs in this book should run in less than 10 seconds easily. This probably indicates your program is in an infinite loop.",msg_activecode_time_limit_error_fix:"Add some print statements to figure out if your program is in an infinte loop. If it is not you can increase the run time with sys.setExecutionLimit(msecs)",msg_activecode_general_error:"Your program is running for too long. Most programs in this book should run in less than 30 seconds easily. This probably indicates your program is in an infinite loop.",msg_activecode_general_error_fix:"Add some print statements to figure out if your program is in an infinte loop. If it is not you can increase the run time with sys.setExecutionLimit(msecs)",msg_activecode_syntax_error:"This message indicates that Python can't figure out the syntax of a particular statement. Some examples are assigning to a literal, or a function call",msg_activecode_syntax_error_fix:"Check your assignment statements and make sure that the left hand side of the assignment is a variable, not a literal or a function.",msg_activecode_key_error:"This message indicates that you are trying to access an element of a dictionary, but the dictionary does not have that the key you are using.",msg_activecode_key_error_fix:"You may have a typo in the name of your key. It is also good practice to check if the key exists using a statement like if key in mydict. You can also use mydict.get(key,defaultvalue) so that if the key is not in the dictionary you get the default value instead of an error.",msg_activecode_index_error:"This message means that you are trying to index past the end of a string or a list. For example if your list has 3 things in it and you try to access the item at position 3 or more.",msg_activecode_index_error_fix:"Remember that the first item in a list or string is at index position 0, quite often this message comes about because you are off by one. Remember in a list of length 3 the last legal index is 2",msg_activecode_uri_error:"",msg_activecode_uri_error_fix:"",msg_activecode_import_error:"This error message indicates that you are trying to import a module that does not exist",msg_activecode_import_error_fix:"One problem may simply be that you have a typo. It may also be that you are trying to import a module that exists in 'real' Python, but does not exist in this book. If this is the case, please submit a feature request to have the module added.",msg_activecode_reference_error:"This is most likely an internal error, particularly if the message references the console.",msg_activecode_reference_error_fix:"Try refreshing the webpage, and if the error continues, submit a bug report along with your code",msg_activecode_zero_division_error:"This tells you that you are trying to divide by 0. Typically this is because the value of the variable in the denominator of a division expression has the value 0",msg_activecode_zero_division_error_fix:"You may need to protect against dividing by 0 with an if statment, or you may need to rexamine your assumptions about the legal values of variables, it could be an earlier statment that is unexpectedly assigning a value of zero to the variable in question.",msg_activecode_range_error:"This message almost always shows up in the form of Maximum call stack size exceeded.",msg_activecode_range_error_fix:"This always occurs when a function calls itself. Its pretty likely that you are not doing this on purpose. Except in the chapter on recursion. If you are in that chapter then its likely you haven't identified a good base case.",msg_activecode_internal_error:"An Internal error may mean that you've triggered a bug in our Python",msg_activecode_internal_error_fix:"Report this error, along with your code as a bug.",msg_activecode_indentation_error:"This error occurs when you have not indented your code properly. This is most likely to happen as part of an if, for, while or def statement.",msg_activecode_indentation_error_fix:"Check your if, def, for, and while statements to be sure the lines are properly indented beneath them. Another source of this error comes from copying and pasting code where you have accidentally left some bits of code lying around that don't belong there anymore.",msg_activecode_not_implemented_error:"This error occurs when you try to use a builtin function of Python that has not been implemented in this in-browser version of Python.",msg_activecode_not_implemented_error_fix:"For now the only way to fix this is to not use the function. There may be workarounds. If you really need this builtin function then file a bug report and tell us how you are trying to use the function.",msg_activecode_file_not_found:"File not found: '$1'",msg_activecode_no_file_or_dir:"[Errno 2] No such file or directory: '$1'",msg_activecode_starting:"Click the play button to begin the $1",msg_activecode_playing:"Playing the $1",msg_activecode_loading_audio:"Loading audio. Please wait. If the tour doesn't start soon click on the leftmost control button (Play first audio in tour)",msg_activecode_pause_current_audio:"Pause current audio",msg_activecode_pause_audio:"Pause audio",msg_activecode_play_paused_audio:"Play paused audio",msg_activecode_audio_paused:"The $1 has been paused. Click on the play button to resume the tour.",msg_activecode_input_prg:"Input for Program",msg_activecode_were_compiling_err:"There were errors compiling your code. See below.",msg_activecode_compile_only:"Code successfully compiled. No executable built.",msg_activecode_time_limit_exc:"Time Limit Exceeded on your program",msg_activecode_server_err:"A server error occurred",msg_activecode_compiling_running:"Compiling and Running your Code Now...",msg_activecode_server_comm_err:"Error communicating with the server.",msg_activecode_save_run:"Save & Run",msg_activecode_run_button_title:"Save & Run (ctrl-s)",msg_activecode_render:"Save & Render",msg_activecode_assertion_error:"An assertion error happens when python encounters an assertion statement. Python evaluates the expression to the right of the word assert; if that expression is True everything is fine and the program continues. If the expression is False Python raises an error and stops.",msg_activecode_assertion_error_fix:"Check the expression to the right of assert. The expression is False and you will need to determine why that is. You may want to simply print out the individual parts of the expression to understand why it is evaluating to False.",msg_activecode_load_db:"Loading DB...",msg_activecode_code_coach:"Code Coach",msg_activecode_passed:"Passed",msg_activecode_failed:"Failed",msg_activecode_unit_test_results:"Unit Test Results",msg_activecode_test_run_error:"Runtime error",msg_activecode_test_compile_error:"Compiler error",msg_activecode_iotest_results:"IO tests completed. See table for results.",msg_activecode_assertions_checked:"Assertions checked:"}})},95545:()=>{$.i18n().load({"sr-Cyrl":{msg_activecode_load_history:"Учитај историју",msg_activecode_audio_tour:"Аудио тура",msg_activecode_loaded_code:"Ваш изворни код је учитан.",msg_activecode_no_saved_code:"Не постоји снимљен код.",msg_activecode_run_code:"Покрени програм",msg_activecode_show_feedback:"Прикажи резултат",msg_activecode_show_code:"Прикажи код",msg_activecode_hide_code:"Затвори код",msg_activecode_show_codelens:"Корак по корак",msg_activecode_show_in_codelens:"Корак по корак",msg_activecode_hide_codelens:"Затвори корак по корак",msg_activecode_reformat:"Реформат",msg_sctivecode_parse_error:"Синтаксна грешка (parse error) значи да Пајтон не разуме синтаксу у линији кога на коју порука о грешци указује. Типични примери овакве грешке су заборавлјена двотачка код 'if' или 'for' исказа или заборављена запета између аргумената код позива функције",msg_sctivecode_parse_error_fix:"Да бисте исправили синтаксну грешку треба пажњиво да погледате линију изворног кода на коју указује поруга о грешци и можда претходну линину изворног кода. Проверите да ли су поштована сва синтаксна правила Пајтона."}})},97887:(e,t,n)=>{"use strict";function i(e){function t(e,t){return e<>>32-t}function n(e,t){var n,i,r,s,o;return r=2147483648&e,s=2147483648&t,o=(1073741823&e)+(1073741823&t),(n=1073741824&e)&(i=1073741824&t)?2147483648^o^r^s:n|i?1073741824&o?3221225472^o^r^s:1073741824^o^r^s:o^r^s}function i(e,i,r,s,o,a,l){return e=n(e,n(n(function(e,t,n){return e&t|~e&n}(i,r,s),o),l)),n(t(e,a),i)}function r(e,i,r,s,o,a,l){return e=n(e,n(n(function(e,t,n){return e&n|t&~n}(i,r,s),o),l)),n(t(e,a),i)}function s(e,i,r,s,o,a,l){return e=n(e,n(n(function(e,t,n){return e^t^n}(i,r,s),o),l)),n(t(e,a),i)}function o(e,i,r,s,o,a,l){return e=n(e,n(n(function(e,t,n){return t^(e|~n)}(i,r,s),o),l)),n(t(e,a),i)}function a(e){var t,n="",i="";for(t=0;t<=3;t++)n+=(i="0"+(e>>>8*t&255).toString(16)).substr(i.length-2,2);return n}var l,u,c,d,f,h,p,m,_,b=Array();for(e=function(e){e=e.replace(/\r\n/g,"\n");for(var t="",n=0;n127&&i<2048?(t+=String.fromCharCode(i>>6|192),t+=String.fromCharCode(63&i|128)):(t+=String.fromCharCode(i>>12|224),t+=String.fromCharCode(i>>6&63|128),t+=String.fromCharCode(63&i|128))}return t}(e),b=function(e){for(var t,n=e.length,i=n+8,r=16*((i-i%64)/64+1),s=Array(r-1),o=0,a=0;a>>29,s}(e),h=1732584193,p=4023233417,m=2562383102,_=271733878,l=0;li})},99872:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{A:()=>LiveCode});var _activecode_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(54215),_md5_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(97887),_extractUnitResults_JUnit_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(60893),_extractUnitResults_Doctest_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(30691),_codelens_js_pytutor_embed_bundle_js__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(60764),_codelens_js_pytutor_embed_bundle_js__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_codelens_js_pytutor_embed_bundle_js__WEBPACK_IMPORTED_MODULE_1__),byte_base64__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(96042);class LiveCode extends _activecode_js__WEBPACK_IMPORTED_MODULE_0__.K{constructor(e){var t=$(e.orig).find("textarea")[0];super(e),this.stdin=$(t).data("stdin"),this.additional_files=$(t).data("add-files"),this.datafiles=$(t).data("datafile"),this.sourcefile=$(t).data("sourcefile"),this.compileargs=unescapeHtml($(t).data("compileargs"))||"",this.compileAlso=unescapeHtml($(t).data("compile-also")),this.linkargs=unescapeHtml($(t).data("linkargs")),this.runargs=unescapeHtml($(t).data("runargs")),this.interpreterargs=unescapeHtml($(t).data("interpreterargs")),this.API_KEY="67033pV7eUUvqo07OJDIV8UZ049aLEK1",this.USE_API_KEY=!0,this.JOBE_SERVER=eBookConfig.jobehost||eBookConfig.host,this.resource=eBookConfig.proxyuri_runs||"/ns/rsproxy/jobeRun",this.jobePutFiles=eBookConfig.proxyuri_files||"/ns/rsproxy/jobePushFile/",this.jobeCheckFiles=eBookConfig.proxyuri_files||"/ns/rsproxy/jobeCheckFile/",this.div2id={},void 0!==this.stdin&&this.createInputElement(),this.createErrorOutput()}outputfun(e){}createInputElement(){let e=document.createElement("div");var t=document.createElement("label");t.for=this.divid+"_stdin",$(t).text($.i18n("msg_activecode_input_prg"));var n=document.createElement("textarea");n.id=this.divid+"_stdin",n.classList.add("activecode__stdin"),n.value=this.stdin,n.setAttribute("rows","3"),this.outerDiv.appendChild(e),e.appendChild(t),e.appendChild(n),this.stdin_el=n}createErrorOutput(){}getCombinedSuffixes(){return this.suffix&&this.visibleSuffix?this.suffix+this.visibleSuffix:this.suffix?this.suffix:this.visibleSuffix?this.visibleSuffix:""}hasUnitTests(){let e=this.getCombinedSuffixes();return"java"===this.language?e.indexOf("import org.junit")>-1:"cpp"===this.language&&(e.indexOf("doctest.h")>-1||this.prefix&&this.prefix.indexOf("doctest.h")>-1)}async runProg(e,t){this.logResults=void 0===t||t,"boolean"!=typeof e&&(e=!1),await this.runSetup();try{if(this.iotests)if(this.hasUnitTests())console.log(`IO tests are not supported with unit tests. They will be ignored in ${this.divid}`);else{let e=[];for(let t of this.iotests){let n=JSON.parse(this.json_runspec);n.run_spec.input=t.input,this.json_runspec=JSON.stringify(n);let i=await this.submitToJobe();if(!i.ok)return this.addJobeErrorMessage($.i18n(`Server Error: ${i.statusText}`)),$(this.runButton).removeAttr("disabled"),"fail";let r=await i.json();r.test=t,e.push(r)}this.processJobeIOResponses(e)}else{let e=await this.submitToJobe();if(!e.ok)return this.addJobeErrorMessage($.i18n(`Server Error: ${e.statusText}`)),$(this.runButton).removeAttr("disabled"),"fail";let t=await e.json();this.processJobeResponse(t)}}catch(e){return this.addJobeErrorMessage($.i18n("msg_activecode_server_comm_err")+e.toString()),$(this.runButton).removeAttr("disabled"),`fail: ${e}`}return"success"}async runSetup(){var stdin,source,saveCode="True",sfilemap={java:"",cpp:"test.cpp",c:"test.c",python3:"test.py",python2:"test.py",octave:"octatest.m"},sourcefilename="",testdrivername="",file_checkp;if(this.suffix&&"java"==this.language){this.suffix.indexOf("import org.junit")<0&&(console.log(`Missing imports in unit tests:\n ${this.suffix}`),this.suffix="\n import static org.junit.Assert.*;\n import org.junit.*;\n import java.io.*;\n "+this.suffix);let e=new RegExp(/public\s+class\s+(\w+)/);source=await this.buildProg(!1);let t=source.match(e);if(!t)throw alert("Error: Could not find the class name in the source, this will not compile."),new Error("No class name in source");sourcefilename=t[1]+".java",t=this.suffix.match(e),t&&(testdrivername=t[1]+".java")}else source=await this.buildProg(!0);try{btoa(source)}catch(e){return void alert("Error: Bad Characters in the activecode window. Likely a quote character that has been copy/pasted. 🙁")}this.saveCode=await this.manage_scrubber(saveCode);var paramlist=["compileargs","linkargs","runargs","interpreterargs","memorylimit"],paramobj={};for(let param of paramlist)this[param]&&(paramobj[param]=eval(this[param]));if("octave"===this.language&&(paramobj.memorylimit=2e5),this.compileargs&&this.compileargs.toString().indexOf("fsanitize")>-1&&(paramobj.memorylimit=2e9),this.timelimit){let e=this.timelimit/1e3;paramobj.cputime=e}this.stdin&&(stdin=$(this.stdin_el).val()),this.sourcefile||(this.sourcefile=sfilemap[this.language]),$(this.output).html($.i18n("msg_activecode_compiling_running"));let allFilesRaw=[];if(null!=this.datafiles){let e=this.datafiles.split(",");for(let t of e){let e=t.trim();allFilesRaw.push({filename:e,type:"datafile"})}}if(null!=this.additional_files){let e=this.additional_files.split(",");for(let t of e){let e=t.trim();allFilesRaw.push({acid:e})}}var files=[];for(let e of allFilesRaw){let t,n,i;if("datafile"===e.type?(i=document.querySelector(`[data-filename="${e.filename}"]`),i||(i=document.getElementById(e.filename))):i=document.getElementById(e.acid),i){if(window.componentMap&&window.componentMap.hasOwnProperty(i.id)){let e=window.componentMap[i.id].editor;n=e.getValue()}else n=i.value?i.value:i.textContent;t=i.dataset.filename||e.filename}else{let i=null,r=null,s;if("datafile"===e.type)s=`/ns/logger/get_source_code?course_id=${eBookConfig.course}&filename=${e.filename}`;else{s=`/ns/logger/get_source_code?course_id=${eBookConfig.course}&acid=${e.acid}`;let t=new Request(`${eBookConfig.new_server_prefix}/assessment/get_latest_code?acid=${e.acid}`,{method:"POST",headers:this.jsonHeaders});try{let e=await fetch(t),n=await e.json();n=n.detail,n&&n.code&&(r=n.code)}catch(e){console.log("Error getting student code: "+e)}}$.ajax({async:!1,url:s,success:function(e){i=e.detail}}),i&&(n=r||i.file_contents,t=i.filename)}if(t){let e=t.substring(t.lastIndexOf(".")+1);if("jar"===e)files=files.concat(this.parseJavaClasses(n));else if(["jpg","png","gif"].indexOf(e)>-1){let r;i?i.toDataURL?(r=i.toDataURL("image/"+e),r=r.substring(r.indexOf(",")+1)):r=i.src.substring(i.src.indexOf(",")+1):r=n,files.push({name:t,content:r})}else files.push({name:t,content:n})}else $.i18n("msg_activecode_no_file_or_dir")}if(this.junitDriverCode=`\n import org.junit.runner.JUnitCore;\n import org.junit.runner.Result;\n import org.junit.runner.notification.Failure;\n\n public class TestRunner {\n public static void main(String[] args) {\n CodeTestHelper.resetFinalResults();\n Result result = JUnitCore.runClasses(${testdrivername.replace(".java",".class")});\n System.out.println(CodeTestHelper.getFinalResults());\n\n int total = result.getRunCount();\n int fails = result.getFailureCount();\n int corr = total - fails;\n System.out.println("You got " + corr + " out of " + total + " correct. " + String.format("%.2f", (100.0 * corr / total)) + "%");\n }\n }\n `,this.suffix&&"java"==this.language&&(files.push({name:sourcefilename,content:source}),files.push({name:testdrivername,content:this.suffix}),source=this.junitDriverCode,paramobj.compileargs?paramobj.compileargs.push(sourcefilename):paramobj.compileargs=[sourcefilename]),this.compileAlso){paramobj.compileargs=paramobj.compileargs||[];let e=this.compileAlso.split(",");paramobj.compileargs=paramobj.compileargs.concat(e)}let runspec={language_id:this.language,sourcecode:source,parameters:paramobj,sourcefilename:this.sourcefile};if(stdin&&(runspec.input=stdin),0===files.length)this.json_runspec=JSON.stringify({run_spec:runspec}),file_checkp=Promise.resolve("ready");else{runspec.file_list=[];var promises=[],instance=this;for(let e=0;e{instance.checkFile(files[e],t,n)})))}this.json_runspec=JSON.stringify({run_spec:runspec}),this.div2id=instance.div2id,file_checkp=Promise.all(promises).catch((function(e){console.log("Error: "+e)}))}return file_checkp}async submitToJobe(){var e=this.json_runspec;let t=this.JOBE_SERVER+this.resource;$(this.runButton).attr("disabled","disabled"),$(this.outDiv).show({duration:700,queue:!1}),$(this.errDiv).remove(),$(this.output).css("visibility","visible");let n=new Headers({"Content-type":"application/json; charset=utf-8",Accept:"application/json","X-API-KEY":this.API_KEY}),i=new Request(t,{method:"POST",headers:n,body:e});return fetch(i)}processJobeResponse(e){var t,n=this.output;switch(this.parsedOutput={},$(this.runButton).removeAttr("disabled"),t=15===e.outcome?"success":e.outcome,this.errinfo=t,e.outcome){case 15:if("java"===this.language)this.parsedOutput=new _extractUnitResults_JUnit_js__WEBPACK_IMPORTED_MODULE_4__.A(e.stdout,this.divid),$(n).html(this.parsedOutput.stdout);else if("cpp"===this.language&&e.stdout.includes("[doctest]"))this.parsedOutput=new _extractUnitResults_Doctest_js__WEBPACK_IMPORTED_MODULE_5__.A(e.stdout,this.divid),$(n).html(this.parsedOutput.stdout);else{let t=e.stdout?e.stdout:"";$(n).html(t)}(this.hasUnitTests()||this.iotests)&&(void 0===this.parsedOutput.pct&&(this.parsedOutput.pct=this.parsedOutput.passed=this.parsedOutput.failed=0),this.unit_results=`percent:${this.parsedOutput.pct}:passed:${this.parsedOutput.passed}:failed:${this.parsedOutput.failed}`);break;case 11:$(n).html($.i18n("msg_activecode_were_compiling_err")),this.addJobeErrorMessage(e.cmpinfo),this.errinfo=e.cmpinfo;break;case 12:("cpp"===this.language||"c"===this.language)&&e.stderr.includes("Permission denied")&&this.compileargs&&this.compileargs.includes("-c")?$(n).html($.i18n("msg_activecode_compile_only")):($(n).html(e.stdout.replace(/\n/g,"
    ")),e.stderr&&this.addJobeErrorMessage(e.stderr));break;case 13:$(n).html(escapeHtml(e.stdout).replace(/\n/g,"
    ")),this.addJobeErrorMessage($.i18n("msg_activecode_time_limit_exc"));break;default:e.stderr?$(n).html(e.stderr.replace(/\n/g,"
    ")):this.addJobeErrorMessage($.i18n("msg_activecode_server_err"))}}processJobeIOResponses(e){$(this.output).html($.i18n("msg_activecode_iotest_results")),$(this.runButton).removeAttr("disabled");const t=this.output;this.parsedOutput={};const n=document.createElement("div"),i=document.createElement("div");i.classList.add("unittest-results__heading"),i.innerHTML=$.i18n("msg_activecode_unit_test_results"),n.appendChild(i),n.classList.add("unittest-results");const r=document.createElement("table");r.classList.add("ac-feedback"),n.appendChild(r),n.setAttribute("id",`${this.divid}_unit_results`);const s=document.createElement("tr");s.innerHTML='Input:Expected Output:Your Output:Result:',r.appendChild(s),this.parsedOutput.table=n;let o=0;this.errinfo=null;const a=e=>e.trimEnd().split("\n").map((e=>e.trimEnd())).join("\n");for(let n of e){const e=a(n.stdout),i=a(n.test.out),s=document.createElement("tr"),l=document.createElement("td");l.classList.add("ac-feedback"),l.innerHTML=`
    ${n.test.input}\n\n
    `,s.appendChild(l);const u=document.createElement("td");u.classList.add("ac-feedback"),u.innerHTML=`
    ${i}
    `,s.appendChild(u);const c=document.createElement("td");c.classList.add("ac-feedback");let d=e.replaceAll(" "," ").replaceAll("\n","
    ");c.innerHTML=`
    ${d}
    `,s.appendChild(c);const f=document.createElement("td");switch(f.classList.add("ac-feedback"),s.appendChild(f),r.appendChild(s),n.outcome){case 15:e===i?(o++,f.innerHTML=$.i18n("msg_activecode_passed"),f.classList.add("ac-feedback-pass")):(f.innerHTML=$.i18n("msg_activecode_failed"),f.classList.add("ac-feedback-fail"));break;case 11:$(t).html(n.cmpinfo.replace(/\n/g,"
    ")),f.innerHTML=$.i18n("msg_activecode_test_compile_error"),f.classList.add("ac-feedback-fail"),this.errinfo=n.cmpinfo;break;case 12:$(t).html(n.stderr.replace(/\n/g,"
    ")),f.innerHTML=$.i18n("msg_activecode_test_run_error"),f.classList.add("ac-feedback-fail"),this.errinfo=n.stderr;break;case 13:$(t).html(escapeHtml(n.stdout).replace(/\n/g,"
    ")),f.innerHTML=$.i18n("msg_activecode_time_limit_exc"),f.classList.add("ac-feedback-fail"),this.errinfo="time exceeded "+n.stdout;break;default:n.stderr&&$(t).html(n.stderr.replace(/\n/g,"
    ")),f.innerHTML=$.i18n("msg_activecode_server_err"),f.classList.add("ac-feedback-fail"),this.errinfo=n.stderr}if(this.errinfo)break}const l=o/e.length*100;this.unit_results=`percent:${l}:passed:${o}:failed:${e.length-o}`;const u=document.createElement("div");u.classList.add("unittest-results__percent"),u.innerHTML=`${Math.round(l)}% `+$.i18n("msg_activecode_passed"),this.parsedOutput.pctString=u,this.errinfo||(this.errinfo="success")}renderFeedback(){let e=document.getElementById(`${this.divid}_unit_results`);e&&e.remove(),this.parsedOutput&&this.parsedOutput.table&&this.outDiv.parentNode.appendChild(this.parsedOutput.table),e=document.getElementById(`${this.divid}_unit_results`),e&&e.appendChild(this.parsedOutput.pctString)}addJobeErrorMessage(e){this.errDiv&&this.errDiv.remove();var t=$("

    ").html("Error"),n=this.outerDiv.appendChild(document.createElement("div"));this.errDiv=n,n.setAttribute("aria-live","polite"),n.setAttribute("aria-atomic","true"),n.setAttribute("role","log"),n.className="error alert alert-danger",n.id=this.divid+"_errinfo",n.appendChild(t[0]);var i=n.appendChild(document.createElement("pre"));setTimeout((()=>{i.innerHTML=escapeHtml(e)}),10)}checkFile(e,t,n){var i=this.div2id[e.name],r=this.jobeCheckFiles+i,s=this.JOBE_SERVER+r,o=new XMLHttpRequest;o.open("HEAD",s,!0),o.setRequestHeader("Content-type","application/json"),o.setRequestHeader("Accept","text/plain"),o.setRequestHeader("X-API-KEY",this.API_KEY),o.onerror=function(){},o.onload=function(){switch(o.status){case 208:case 404:this.pushDataFile(e,t,n);break;case 400:default:n();break;case 204:t()}}.bind(this),o.send()}pushDataFile(e,t,n){var i,r=e.name,s=r.substring(r.indexOf(".")+1),o=this.div2id[r],a=e.content;i=-1===["jar","zip","png","jpg","jpeg"].indexOf(s)?(0,byte_base64__WEBPACK_IMPORTED_MODULE_2__.Cw)(a):a;var l=JSON.stringify({file_contents:i}),u=this.jobePutFiles+o,c=this.JOBE_SERVER+u,d=new XMLHttpRequest;d.open("PUT",c,!0),d.setRequestHeader("Content-type","application/json"),d.setRequestHeader("Accept","text/plain"),d.setRequestHeader("X-API-KEY",this.API_KEY),d.onload=function(){switch(d.status){case 403:case 400:default:n();break;case 204:t()}}.bind(this),d.onerror=function(){n()},d.send(l)}async showCodelens(){let e="";if("none"!=this.codelens.style.display)return this.codelens.style.display="none",void(this.clButton.innerText=$.i18n("msg_activecode_show_in_codelens"));this.codelens.style.display="block",e="Building your visualization",this.codelens.innerHTML=e,this.clButton.innerText=$.i18n("msg_activecode_hide_codelens");var t=this.codelens.firstChild;t&&(this.codelens.removeChild(t),this.codelens.innerHTML=e);var n=await this.buildProg(!1);n.match(/System.exit/)&&(alert("Sorry... System.exit breaks the visualizer temporarily removing"),n=n.replace(/System.exit\(\d+\);/,""));var i={};i.code=n,i.lang=this.language,this.stdin&&(i.stdin=$(this.stdin_el).val());var r=this.codelens.id;let s=new Request("/ns/rsproxy/pytutor_trace",{method:"POST",body:JSON.stringify(i),headers:this.jsonHeaders});try{let e=await fetch(s),t=await e.json();addVisualizerToPage(t,r,{startingInstruction:0,editCodeBaseURL:null,hideCode:!1,lang:i.lang})}catch(e){document.getElementById(r).innerHTML="Sorry, an error occurred while creating your visualization.",console.log("Get Trace Failed -- "),console.log(e)}this.logBookEvent({event:"codelens",act:"view",div_id:this.divid})}parseJavaClasses(e){e=e.trim();for(var t=!1,n=0,i=0,r=[],s=0,o=0,a=0;a0&&a").replace(/"/g,'"').replace(/'/g,"'")}function escapeHtml(e){return e?e.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):""}}}]); +//# sourceMappingURL=877.c2f5ef32dd94b9b6.js.map \ No newline at end of file diff --git a/course/_static/877.c2f5ef32dd94b9b6.js.gz b/course/_static/877.c2f5ef32dd94b9b6.js.gz new file mode 100755 index 0000000000000000000000000000000000000000..36175a001640bf32f676084143594ea917c49af2 GIT binary patch literal 351323 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.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νv~|53jn}(SLQvRnSzA?` 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

    B8RAGHPNXD-GDca^8&Go;e;dxEd8q`#iSnjdM@P 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

    6WPEU4UvlS&58%Daz`7V+lAC}NZK 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≈Y;TeSUvL2vhe5#y5wIm)&nu^I1Cge#wYa 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 0:\\n if self.pos + length < newpos:\\n newpos = self.pos + length\\n r = self.buf[self.pos:newpos]\\n self.pos = newpos\\n return r\\n\\n def readlines(self, sizehint = 0):\\n \\\"\\\"\\\"Read until EOF using readline() and return a list containing the\\n lines thus read.\\n\\n If the optional sizehint argument is present, instead of reading up\\n to EOF, whole lines totalling approximately sizehint bytes (or more\\n to accommodate a final whole line).\\n \\\"\\\"\\\"\\n total = 0\\n lines = []\\n line = self.readline()\\n while line:\\n lines.append(line)\\n total += len(line)\\n if 0 < sizehint <= total:\\n break\\n line = self.readline()\\n return lines\\n\\n def truncate(self, size=None):\\n \\\"\\\"\\\"Truncate the file's size.\\n\\n If the optional size argument is present, the file is truncated to\\n (at most) that size. The size defaults to the current position.\\n The current file position is not changed unless the position\\n is beyond the new file size.\\n\\n If the specified size exceeds the file's current size, the\\n file remains unchanged.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if size is None:\\n size = self.pos\\n elif size < 0:\\n raise IOError(22, \\\"Negative size not allowed\\\")\\n elif size < self.pos:\\n self.pos = size\\n self.buf = self.getvalue()[:size]\\n self.len = size\\n\\n def write(self, s):\\n \\\"\\\"\\\"Write a string to the file.\\n\\n There is no return value.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if not s: return\\n # Force s to be a string or unicode\\n if not isinstance(s, str):\\n s = str(s)\\n spos = self.pos\\n slen = self.len\\n if spos == slen:\\n self.buflist.append(s)\\n self.len = self.pos = spos + len(s)\\n return\\n if spos > slen:\\n self.buflist.append('\\\\0'*(spos - slen))\\n slen = spos\\n newpos = spos + len(s)\\n if spos < slen:\\n if self.buflist:\\n self.buf += ''.join(self.buflist)\\n self.buflist = [self.buf[:spos], s, self.buf[newpos:]]\\n self.buf = ''\\n if newpos > slen:\\n slen = newpos\\n else:\\n self.buflist.append(s)\\n slen = newpos\\n self.len = slen\\n self.pos = newpos\\n\\n def writelines(self, iterable):\\n \\\"\\\"\\\"Write a sequence of strings to the file. The sequence can be any\\n iterable object producing strings, typically a list of strings. There\\n is no return value.\\n\\n (The name is intended to match readlines(); writelines() does not add\\n line separators.)\\n \\\"\\\"\\\"\\n write = self.write\\n for line in iterable:\\n write(line)\\n\\n def flush(self):\\n \\\"\\\"\\\"Flush the internal buffer\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n\\n def getvalue(self):\\n \\\"\\\"\\\"\\n Retrieve the entire contents of the \\\"file\\\" at any time before\\n the StringIO object's close() method is called.\\n\\n The StringIO object can accept either Unicode or 8-bit strings,\\n but mixing the two may take some care. If both are used, 8-bit\\n strings that cannot be interpreted as 7-bit ASCII (that use the\\n 8th bit) will cause a UnicodeError to be raised when getvalue()\\n is called.\\n \\\"\\\"\\\"\\n _complain_ifclosed(self.closed)\\n if self.buflist:\\n self.buf += ''.join(self.buflist)\\n self.buflist = []\\n return self.buf\\n\\n # The following two methods implement the PEP343 context management protocol\\n # for StringIO objects, allowing them to be used in with statements.\\n # In standard Python this is done via inheriting from IOBase\\n # Possible pure Python implementation: https://github.com/python/cpython/blob/main/Lib/_pyio.py\\n def __enter__(self):\\n _complain_ifclosed(self.closed)\\n return self\\n\\n def __exit__(self, *args):\\n self.close()\\n\",\"src/lib/UserDict.py\":\"import _sk_fail; _sk_fail._(\\\"UserDict\\\")\\n\",\"src/lib/UserList.py\":\"import _sk_fail; _sk_fail._(\\\"UserList\\\")\\n\",\"src/lib/UserString.py\":\"import _sk_fail; _sk_fail._(\\\"UserString\\\")\\n\",\"src/lib/_LWPCookieJar.py\":\"import _sk_fail; _sk_fail._(\\\"_LWPCookieJar\\\")\\n\",\"src/lib/_MozillaCookieJar.py\":\"import _sk_fail; _sk_fail._(\\\"_MozillaCookieJar\\\")\\n\",\"src/lib/__future__.py\":\"import _sk_fail;_sk_fail._(\\\"__future__\\\")\\n\",\"src/lib/__phello__.foo.py\":\"import _sk_fail; _sk_fail._(\\\"__phello__.foo\\\")\\n\",\"src/lib/_abcoll.py\":\"import _sk_fail; _sk_fail._(\\\"_abcoll\\\")\\n\",\"src/lib/_sk_fail.py\":\"class NotImplementedImportError(ImportError, NotImplementedError): pass\\n\\ndef _(name):\\n msg = \\\"{} is not yet implemented in Skulpt\\\".format(name)\\n raise NotImplementedImportError(msg, name=name)\\n\",\"src/lib/_threading_local.py\":\"import _sk_fail; _sk_fail._(\\\"_threading_local\\\")\\n\",\"src/lib/abc.py\":\"import _sk_fail; _sk_fail._(\\\"abc\\\")\\n\",\"src/lib/aifc.py\":\"import _sk_fail; _sk_fail._(\\\"aifc\\\")\\n\",\"src/lib/altair/__init__.py\":\"import random\\n\\ntry:\\n from vega_caller import render_graph\\nexcept:\\n print(\\\"Mock render\\\")\\n\\n def render_graph(js):\\n print(js)\\n\\n\\nclass Chart:\\n # TODO allow data to be specified as a URL to a CSV or DB or json\\n def __init__(self, data, title=None):\\n self.title = title\\n self.data_id = random.randrange(1000000, 5000000)\\n self.dsname = \\\"data-{}\\\".format(self.data_id)\\n if isinstance(data, dict):\\n self.data = Data(**data)\\n else:\\n self.data = data\\n\\n self.json = {}\\n self.json[\\\"$schema\\\"] = \\\"https://vega.github.io/schema/vega-lite/v2.5.json\\\"\\n self.json[\\\"data\\\"] = {}\\n if self.title:\\n self.json[\\\"title\\\"] = self.title\\n\\n self.json[\\\"data\\\"] = {\\\"values\\\": self.data.vals}\\n self.is_composite = False\\n\\n # mark can be a simple string or a dictionary\\n # \\\"mark\\\": {\\\"color\\\": \\\"green\\\", \\\"opacity\\\": 0.2, \\\"type\\\": \\\"rect\\\"}\\n\\n def mark_json(self, mark_type, **kwargs):\\n if kwargs:\\n self.json[\\\"mark\\\"] = {}\\n self.json[\\\"mark\\\"][\\\"type\\\"] = mark_type\\n self.json[\\\"mark\\\"].update(kwargs)\\n else:\\n self.json[\\\"mark\\\"] = mark_type\\n\\n return self\\n\\n def mark_bar(self, **kwargs):\\n return self.mark_json(\\\"bar\\\", **kwargs)\\n\\n def mark_point(self, **kwargs):\\n return self.mark_json(\\\"point\\\", **kwargs)\\n\\n def mark_line(self, **kwargs):\\n return self.mark_json(\\\"line\\\", **kwargs)\\n\\n def mark_rect(self, **kwargs):\\n return self.mark_json(\\\"rect\\\", **kwargs)\\n\\n def mark_area(self, **kwargs):\\n return self.mark_json(\\\"area\\\", **kwargs)\\n\\n def mark_tick(self, **kwargs):\\n return self.mark_json(\\\"tick\\\", **kwargs)\\n\\n def encode(self, x=\\\"\\\", y=\\\"\\\", color=\\\"\\\", size=\\\"\\\", tooltip=\\\"\\\"):\\n self.encoding = {}\\n if x:\\n if isinstance(x, Axis):\\n self.encoding[\\\"x\\\"] = x.toJson()\\n else:\\n self.encoding[\\\"x\\\"] = Axis(x).toJson()\\n if y:\\n if isinstance(y, Axis):\\n self.encoding[\\\"y\\\"] = y.toJson()\\n else:\\n self.encoding[\\\"y\\\"] = Axis(y).toJson()\\n\\n # \\\"color\\\": {\\\"type\\\": \\\"nominal\\\", \\\"field\\\": \\\"species\\\"}\\n if color:\\n field, tp = _get_name_type(color)\\n self.encoding[\\\"color\\\"] = dict(type=tp, field=field)\\n\\n # \\\"size\\\": {\\\"type\\\": \\\"quantitative\\\", \\\"field\\\": \\\"Acceleration\\\"}\\n if size:\\n field, tp = _get_name_type(size)\\n self.encoding[\\\"size\\\"] = dict(type=tp, field=field)\\n\\n if tooltip:\\n field, tp = _get_name_type(tooltip)\\n self.encoding[\\\"tooltip\\\"] = dict(type=tp, field=field)\\n\\n self.json[\\\"encoding\\\"] = self.encoding\\n return self\\n\\n def interactive(self):\\n iconfig = {\\n \\\"selector002\\\": {\\n \\\"type\\\": \\\"interval\\\",\\n \\\"bind\\\": \\\"scales\\\",\\n \\\"encodings\\\": [\\\"x\\\", \\\"y\\\"],\\n \\\"on\\\": \\\"[mousedown, window:mouseup] > window:mousemove!\\\",\\n \\\"translate\\\": \\\"[mousedown, window:mouseup] > window:mousemove!\\\",\\n \\\"zoom\\\": \\\"wheel!\\\",\\n \\\"mark\\\": {\\\"fill\\\": \\\"#333\\\", \\\"fillOpacity\\\": 0.125, \\\"stroke\\\": \\\"white\\\"},\\n \\\"resolve\\\": \\\"global\\\",\\n }\\n }\\n self.json[\\\"selection\\\"] = iconfig\\n return self\\n\\n def display(self):\\n render_graph(self.json)\\n\\n def __add__(self, other):\\n return self.add_layer(other, \\\"layer\\\")\\n\\n def __and__(self, other):\\n return self.add_layer(other, \\\"vconcat\\\")\\n\\n def __or__(self, other):\\n return self.add_layer(other, \\\"hconcat\\\")\\n\\n def add_layer(self, other, lname):\\n # multle layers are added by concatenating the new element to the\\n # existing layer. If the layer does not exist then initialize\\n # it from self.\\n if lname not in self.json:\\n self.json[lname] = []\\n self.json[\\\"datasets\\\"] = {}\\n temp = {}\\n temp[\\\"data\\\"] = {\\\"name\\\": self.dsname}\\n self.json[\\\"datasets\\\"][self.dsname] = self.json[\\\"data\\\"][\\\"values\\\"]\\n del self.json[\\\"data\\\"]\\n temp[\\\"encoding\\\"] = self.json[\\\"encoding\\\"]\\n del self.json[\\\"encoding\\\"]\\n temp[\\\"mark\\\"] = self.json[\\\"mark\\\"]\\n del self.json[\\\"mark\\\"]\\n self.json[lname].append(temp)\\n temp = {}\\n self.json[\\\"datasets\\\"][other.dsname] = other.json[\\\"data\\\"][\\\"values\\\"]\\n temp[\\\"data\\\"] = {\\\"name\\\": other.dsname}\\n temp[\\\"encoding\\\"] = other.json[\\\"encoding\\\"]\\n temp[\\\"mark\\\"] = other.json[\\\"mark\\\"]\\n self.json[lname].append(temp)\\n return self\\n\\n\\n# \\\"datasets\\\": {\\n# \\\"data-e56e43354d9b8f2ab0d1e90cf27cd47f\\\": [\\n# {\\\"a\\\": 4, \\\"b\\\": 1, \\\"c\\\": \\\"r\\\"},\\n# {\\\"a\\\": 5, \\\"b\\\": 2, \\\"c\\\": \\\"g\\\"},\\n# {\\\"a\\\": 6, \\\"b\\\": 3, \\\"c\\\": \\\"b\\\"}\\n# ],\\n# \\\"data-a4c3047a15bf9380c2e615cf87648369\\\": [\\n# {\\\"a\\\": 1, \\\"b\\\": 4, \\\"c\\\": \\\"r\\\"},\\n# {\\\"a\\\": 2, \\\"b\\\": 5, \\\"c\\\": \\\"g\\\"},\\n# {\\\"a\\\": 3, \\\"b\\\": 6, \\\"c\\\": \\\"b\\\"}\\n# ]\\n# }\\n\\n# TODO: add a rect mark type for a heat map\\n\\n\\ndef _get_name_type(name):\\n typed = {\\\"Q\\\": \\\"quantitative\\\", \\\"O\\\": \\\"ordinal\\\", \\\"N\\\": \\\"nominal\\\", \\\"T\\\": \\\"temporal\\\"}\\n nt = name.split(\\\":\\\")\\n tstring = \\\"quantitative\\\"\\n if len(nt) == 2:\\n tstring = typed[nt[1]]\\n return nt[0], tstring\\n\\n\\nclass Axis:\\n def __init__(self, name, bin=False):\\n self.aggregate = None\\n self.name, self.type = _get_name_type(name)\\n if \\\"()\\\" in self.name: # aggregate function\\n self.aggregate = self.name.replace(\\\"()\\\", \\\"\\\")\\n self.name = None\\n self.bin = bin\\n\\n def toJson(self):\\n json = {}\\n if self.name:\\n json[\\\"field\\\"] = self.name\\n if self.type:\\n json[\\\"type\\\"] = self.type\\n if self.bin:\\n json[\\\"bin\\\"] = True\\n if self.aggregate:\\n json[\\\"aggregate\\\"] = self.aggregate\\n\\n return json\\n\\n\\nclass X(Axis):\\n pass\\n\\n\\nclass Y(Axis):\\n pass\\n\\n\\nclass Data:\\n def __init__(self, **kwargs):\\n \\\"\\\"\\\"\\n input can be the form of a series of keyword args where\\n the keyword is the column name, or a single keyword data\\n that is a list of json style records as rows.\\n could also accept a csv file? or keywords columns and rows\\n This accepts a lot more options that \\\"real altair\\\" to make it easier\\n to work with non-DataFrame data sets. Internally:\\n self.keys contains the list of column names\\n self.vals is a list of dictionaries of the form [{col1:val1, col2:val2, ... coln:valn},\\n {col1:val3, col2:val4, ... coln:valn},\\n {col1:val5, col2:val6, ... coln:valn}]\\n \\\"\\\"\\\"\\n # todo: accept a URL as the argument to read a CSV or JSON file\\n if len(kwargs) == 1 and \\\"data\\\" in kwargs:\\n self.data = kwargs[\\\"data\\\"]\\n self.keys = self.data[0].keys()\\n self.vals = self.data\\n elif len(kwargs) == 2 and (\\\"columns\\\" in kwargs) and (\\\"rows\\\" in kwargs):\\n self.keys = kwargs[\\\"columns\\\"]\\n self.vals = []\\n for r in kwargs[\\\"rows\\\"]:\\n self.vals.append(dict(zip(self.keys, r)))\\n else:\\n keys = kwargs.keys()\\n vals = []\\n primary_key = list(keys)[0]\\n for ix in range(len(kwargs[primary_key])):\\n d = {}\\n for key in keys:\\n d[key] = kwargs[key][ix]\\n vals.append(d)\\n self.vals = vals\\n self.keys = keys\\n\\n def __str__(self):\\n # header = \\\"\\\\t\\\".join(self.keys) + \\\"\\\\n\\\"\\n header = \\\"\\\"\\n for key in self.keys:\\n header += key.center(10) + \\\" \\\"\\n header += \\\"\\\\n\\\"\\n template = \\\"\\\"\\n for key in self.keys:\\n template += \\\"{\\\" + key + \\\": <10} \\\"\\n template += \\\"\\\\n\\\"\\n res = \\\"\\\"\\n for row in self.vals:\\n res += template.format(**row)\\n\\n return header + res\\n\\n\\nif __name__ == \\\"__main__\\\":\\n d = Data(a=[3, 4, 5], b=[1, 2, 3], c=[\\\"r\\\", \\\"g\\\", \\\"b\\\"])\\n print(d)\\n print(\\n type(\\n Chart({\\\"a\\\": list(\\\"abc\\\"), \\\"b\\\": [1, 2, 3]}).mark_bar().encode(x=\\\"a:N\\\", y=\\\"b\\\")\\n )\\n )\\n aa = (\\n Chart(Data(a=[3, 4, 5], b=[1, 2, 3], c=[\\\"r\\\", \\\"g\\\", \\\"b\\\"]))\\n .mark_point(color=\\\"red\\\")\\n .encode(x=\\\"b\\\", y=\\\"a\\\", color=\\\"c:O\\\")\\n )\\n print(\\\"aa = \\\", aa)\\n aa.display()\\n\\n bb = (\\n Chart(Data(a=[1, 2, 3], b=[4, 5, 6], c=[\\\"r\\\", \\\"g\\\", \\\"b\\\"]))\\n .mark_line()\\n .encode(x=\\\"b\\\", y=\\\"a\\\", color=\\\"c:O\\\")\\n )\\n print(\\\"bb = \\\", bb)\\n bb.display()\\n print(\\\"aa+bb\\\", (aa + bb).display())\\n # Chart(Data(a=[1,2,3,2,2,4,5,5,6,7,8,8,8,8,8,9,0,0])).mark_bar().encode(Axis('a:Q', bin=True),y='count()')\\n\\n\\n# todo: see if I can work with the repr of an object to get the behavior that altair gets in notebooks\\n# todo: implement a Bin object to specifiy maxbins\\n\",\"src/lib/antigravity.py\":\"import webbrowser\\n\\nwebbrowser.open(\\\"https://xkcd.com/353/\\\")\\n\",\"src/lib/anydbm.py\":\"import _sk_fail; _sk_fail._(\\\"anydbm\\\")\\n\",\"src/lib/ast.py\":\"import _sk_fail; _sk_fail._(\\\"ast\\\")\\n\",\"src/lib/asynchat.py\":\"import _sk_fail; _sk_fail._(\\\"asynchat\\\")\\n\",\"src/lib/asyncore.py\":\"import _sk_fail; _sk_fail._(\\\"asyncore\\\")\\n\",\"src/lib/atexit.py\":\"import _sk_fail; _sk_fail._(\\\"atexit\\\")\\n\",\"src/lib/audiodev.py\":\"import _sk_fail; _sk_fail._(\\\"audiodev\\\")\\n\",\"src/lib/base64.py\":\"import _sk_fail; _sk_fail._(\\\"base64\\\")\\n\",\"src/lib/bdb.py\":\"import _sk_fail; _sk_fail._(\\\"bdb\\\")\\n\",\"src/lib/binhex.py\":\"import _sk_fail; _sk_fail._(\\\"binhex\\\")\\n\",\"src/lib/bisect.py\":\"\\\"\\\"\\\"Bisection algorithms.\\\"\\\"\\\"\\n\\ndef insort_right(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Insert item x in list a, and keep it sorted assuming a is sorted.\\n\\n If x is already in a, insert it to the right of the rightmost x.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if x < a[mid]: hi = mid\\n else: lo = mid+1\\n a.insert(lo, x)\\n\\ndef bisect_right(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Return the index where to insert item x in list a, assuming a is sorted.\\n\\n The return value i is such that all e in a[:i] have e <= x, and all e in\\n a[i:] have e > x. So if x already appears in the list, a.insert(x) will\\n insert just after the rightmost x already there.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if x < a[mid]: hi = mid\\n else: lo = mid+1\\n return lo\\n\\ndef insort_left(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Insert item x in list a, and keep it sorted assuming a is sorted.\\n\\n If x is already in a, insert it to the left of the leftmost x.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if a[mid] < x: lo = mid+1\\n else: hi = mid\\n a.insert(lo, x)\\n\\n\\ndef bisect_left(a, x, lo=0, hi=None):\\n \\\"\\\"\\\"Return the index where to insert item x in list a, assuming a is sorted.\\n\\n The return value i is such that all e in a[:i] have e < x, and all e in\\n a[i:] have e >= x. So if x already appears in the list, a.insert(x) will\\n insert just before the leftmost x already there.\\n\\n Optional args lo (default 0) and hi (default len(a)) bound the\\n slice of a to be searched.\\n \\\"\\\"\\\"\\n\\n if lo < 0:\\n raise ValueError('lo must be non-negative')\\n if hi is None:\\n hi = len(a)\\n while lo < hi:\\n mid = (lo+hi)//2\\n if a[mid] < x: lo = mid+1\\n else: hi = mid\\n return lo\\n\\n# Overwrite above definitions with a fast C implementation\\ntry:\\n from _bisect import *\\nexcept ImportError:\\n pass\\n\\n# Create aliases\\nbisect = bisect_right\\ninsort = insort_right\\n\",\"src/lib/bsddb/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"bsddb\\\")\\n\",\"src/lib/cProfile.py\":\"import _sk_fail; _sk_fail._(\\\"cProfile\\\")\\n\",\"src/lib/cgi.py\":\"import _sk_fail; _sk_fail._(\\\"cgi\\\")\\n\",\"src/lib/cgitb.py\":\"import _sk_fail; _sk_fail._(\\\"cgitb\\\")\\n\",\"src/lib/chunk.py\":\"import _sk_fail; _sk_fail._(\\\"chunk\\\")\\n\",\"src/lib/cmd.py\":\"import _sk_fail; _sk_fail._(\\\"cmd\\\")\\n\",\"src/lib/code.py\":\"import _sk_fail; _sk_fail._(\\\"code\\\")\\n\",\"src/lib/codecs.py\":\"import _sk_fail; _sk_fail._(\\\"codecs\\\")\\n\",\"src/lib/codeop.py\":\"import _sk_fail; _sk_fail._(\\\"codeop\\\")\\n\",\"src/lib/colorsys.py\":\"import _sk_fail; _sk_fail._(\\\"colorsys\\\")\\n\",\"src/lib/commands.py\":\"import _sk_fail; _sk_fail._(\\\"commands\\\")\\n\",\"src/lib/compileall.py\":\"import _sk_fail; _sk_fail._(\\\"compileall\\\")\\n\",\"src/lib/compiler/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"compiler\\\")\\n\",\"src/lib/config/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"config\\\")\\n\",\"src/lib/contextlib.py\":\"import _sk_fail; _sk_fail._(\\\"contextlib\\\")\\n\",\"src/lib/cookielib.py\":\"import _sk_fail; _sk_fail._(\\\"cookielib\\\")\\n\",\"src/lib/copy.py\":\"\\\"\\\"\\\"\\nThis file was modified from CPython.\\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\\n\\\"\\\"\\\"\\nimport types\\nclass Error(Exception):\\n pass\\nerror = Error \\nclass _EmptyClass:\\n pass\\ntry:\\n long\\nexcept NameError:\\n long = int\\ntry:\\n bytes\\nexcept NameError:\\n bytes = str\\n\\ndef check_notimplemented_state(x):\\n getstate = getattr(x, \\\"__getstate__\\\", None)\\n setstate = getattr(x, \\\"__setstate__\\\", None)\\n initargs = getattr(x, \\\"__getinitargs__\\\", None)\\n if getstate or setstate or initargs:\\n raise NotImplementedError(\\\"Skulpt does not yet support copying with user-defined __getstate__, __setstate__ or __getinitargs__()\\\")\\n\\n\\ndef copy(x):\\n cls = type(x)\\n if callable(x):\\n return x\\n copier = getattr(cls, \\\"__copy__\\\", None)\\n if copier:\\n return copier(x)\\n if cls in (type(None), int, float, bool, str, bytes, tuple, type, frozenset, long):\\n return x\\n if (cls == list) or (cls == dict) or (cls == set) or (cls == slice):\\n return cls(x)\\n reductor = getattr(x, \\\"__reduce_ex__\\\", None)\\n if reductor:\\n rv = reductor(4)\\n else:\\n reductor = getattr(x, \\\"__reduce__\\\", None)\\n if reductor:\\n rv = reductor()\\n elif str(cls)[1:6] == \\\"class\\\":\\n check_notimplemented_state(x)\\n copier = _copy_inst\\n return copier(x)\\n else:\\n raise Error(\\\"un(shallow)copyable object of type %s\\\" % cls)\\n if isinstance(rv, str):\\n return x\\n return _reconstruct(x, rv, 0)\\n\\ndef _copy_inst(x):\\n if hasattr(x, '__copy__'):\\n return x.__copy__()\\n if hasattr(x, '__getinitargs__'):\\n args = x.__getinitargs__()\\n y = x.__class__(*args)\\n else:\\n y = _EmptyClass()\\n y.__class__ = x.__class__\\n if hasattr(x, '__getstate__'):\\n state = x.__getstate__()\\n else:\\n state = x.__dict__\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n y.__dict__.update(state)\\n return y\\n\\nd = _deepcopy_dispatch = {}\\n\\ndef deepcopy(x, memo=None, _nil=[]):\\n \\\"\\\"\\\"Deep copy operation on arbitrary Python objects.\\n See the module's __doc__ string for more info.\\n \\\"\\\"\\\"\\n if memo is None:\\n memo = {}\\n idx = id(x)\\n y = memo.get(idx, _nil)\\n if y is not _nil:\\n return y\\n cls = type(x)\\n copier = _deepcopy_dispatch.get(cls)\\n if copier:\\n y = copier(x, memo)\\n else:\\n try:\\n issc = issubclass(cls, type)\\n except TypeError: # cls is not a class (old Boost; see SF #502085)\\n issc = 0\\n if issc:\\n y = _deepcopy_atomic(x, memo)\\n else:\\n copier = getattr(x, \\\"__deepcopy__\\\", None)\\n if copier:\\n y = copier(memo)\\n else:\\n reductor = getattr(x, \\\"__reduce_ex__\\\", None)\\n if reductor:\\n rv = reductor(2)\\n else:\\n rv = None\\n reductor = getattr(x, \\\"__reduce__\\\", None)\\n if reductor:\\n rv = reductor()\\n elif str(cls)[1:6] == \\\"class\\\":\\n check_notimplemented_state(x)\\n copier = _deepcopy_dispatch[\\\"InstanceType\\\"]\\n y = copier(x, memo)\\n else:\\n raise Error(\\n \\\"un(deep)copyable object of type %s\\\" % cls)\\n if rv is not None:\\n y = _reconstruct(x, rv, 1, memo)\\n memo[idx] = y\\n _keep_alive(x, memo) # Make sure x lives at least as long as d\\n return y\\n\\ndef _deepcopy_atomic(x, memo):\\n return x\\nd[type(None)] = _deepcopy_atomic\\n# d[type(Ellipsis)] = _deepcopy_atomic\\nd[type(NotImplemented)] = _deepcopy_atomic\\nd[int] = _deepcopy_atomic\\nd[float] = _deepcopy_atomic\\nd[bool] = _deepcopy_atomic\\nd[complex] = _deepcopy_atomic\\nd[bytes] = _deepcopy_atomic\\nd[str] = _deepcopy_atomic\\n# try:\\n# d[types.CodeType] = _deepcopy_atomic\\n# except AttributeError:\\n# pass\\nd[type] = _deepcopy_atomic\\n# d[types.BuiltinFunctionType] = _deepcopy_atomic\\nd[types.FunctionType] = _deepcopy_atomic\\n# d[weakref.ref] = _deepcopy_atomic\\n\\ndef _deepcopy_list(x, memo):\\n y = []\\n memo[id(x)] = y\\n for a in x:\\n y.append(deepcopy(a, memo))\\n return y\\nd[list] = _deepcopy_list\\n\\ndef _deepcopy_set(x, memo):\\n result = set([]) # make empty set\\n memo[id(x)] = result # register this set in the memo for loop checking\\n for a in x: # go through elements of set\\n result.add(deepcopy(a, memo)) # add the copied elements into the new set\\n return result # return the new set\\nd[set] = _deepcopy_set\\n\\ndef _deepcopy_frozenset(x, memo):\\n result = frozenset(_deepcopy_set(x,memo)) \\n memo[id(x)] = result \\n return result\\nd[frozenset] = _deepcopy_frozenset\\n\\ndef _deepcopy_tuple(x, memo):\\n y = [deepcopy(a, memo) for a in x]\\n # We're not going to put the tuple in the memo, but it's still important we\\n # check for it, in case the tuple contains recursive mutable structures.\\n try:\\n return memo[id(x)]\\n except KeyError:\\n pass\\n for k, j in zip(x, y):\\n if k is not j:\\n y = tuple(y)\\n break\\n else:\\n y = x\\n return y\\nd[tuple] = _deepcopy_tuple\\n\\ndef _deepcopy_dict(x, memo):\\n y = {}\\n memo[id(x)] = y\\n for key, value in x.items():\\n y[deepcopy(key, memo)] = deepcopy(value, memo)\\n return y\\nd[dict] = _deepcopy_dict\\n\\n# def _deepcopy_method(x, memo): # Copy instance methods\\n# y = type(x)(x.im_func, deepcopy(x.im_self, memo), x.im_class);\\n# return y\\nd[types.MethodType] = _deepcopy_atomic\\n\\ndef _deepcopy_inst(x, memo):\\n if hasattr(x, '__deepcopy__'):\\n return x.__deepcopy__(memo)\\n if hasattr(x, '__getinitargs__'):\\n args = x.__getinitargs__()\\n args = deepcopy(args, memo)\\n y = x.__class__(*args)\\n else:\\n y = _EmptyClass()\\n y.__class__ = x.__class__\\n memo[id(x)] = y\\n if hasattr(x, '__getstate__'):\\n state = x.__getstate__()\\n else:\\n state = x.__dict__\\n state = deepcopy(state, memo)\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n y.__dict__.update(state)\\n return y\\nd[\\\"InstanceType\\\"] = _deepcopy_inst\\n\\ndef _keep_alive(x, memo):\\n \\\"\\\"\\\"Keeps a reference to the object x in the memo.\\n Because we remember objects by their id, we have\\n to assure that possibly temporary objects are kept\\n alive by referencing them.\\n We store a reference at the id of the memo, which should\\n normally not be used unless someone tries to deepcopy\\n the memo itself...\\n \\\"\\\"\\\"\\n try:\\n memo[id(memo)].append(x)\\n except KeyError:\\n # aha, this is the first one :-)\\n memo[id(memo)]=[x]\\n\\ndef _reconstruct(x, info, deep, memo=None):\\n if isinstance(info, str):\\n return x\\n assert isinstance(info, tuple)\\n if memo is None:\\n memo = {}\\n n = len(info)\\n assert n in (2, 3, 4, 5)\\n callable, args = info[:2]\\n if n > 2:\\n state = info[2]\\n else:\\n state = None\\n if n > 3:\\n listiter = info[3]\\n else:\\n listiter = None\\n if n > 4:\\n dictiter = info[4]\\n else:\\n dictiter = None\\n if deep:\\n args = deepcopy(args, memo)\\n y = callable(*args)\\n memo[id(x)] = y\\n\\n if state is not None:\\n if deep:\\n state = deepcopy(state, memo)\\n if hasattr(y, '__setstate__'):\\n y.__setstate__(state)\\n else:\\n if isinstance(state, tuple) and len(state) == 2:\\n state, slotstate = state\\n else:\\n slotstate = None\\n if state is not None:\\n y.__dict__.update(state)\\n if slotstate is not None:\\n for key, value in slotstate.items():\\n setattr(y, key, value)\\n\\n if listiter is not None:\\n for item in listiter:\\n if deep:\\n item = deepcopy(item, memo)\\n y.append(item)\\n if dictiter is not None:\\n for key, value in dictiter:\\n if deep:\\n key = deepcopy(key, memo)\\n value = deepcopy(value, memo)\\n y[key] = value\\n return y\\n\\ndel d\\n\\ndel types\\n\\n# Helper for instance creation without calling __init__\\nclass _EmptyClass:\\n pass\",\"src/lib/copy_reg.py\":\"import _sk_fail; _sk_fail._(\\\"copy_reg\\\")\\n\",\"src/lib/csv.py\":\"import _sk_fail; _sk_fail._(\\\"csv\\\")\\n\",\"src/lib/ctypes/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"ctypes\\\")\\n\",\"src/lib/ctypes/macholib/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"macholib\\\")\\n\",\"src/lib/curses/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"curses\\\")\\n\",\"src/lib/dbhash.py\":\"import _sk_fail; _sk_fail._(\\\"dbhash\\\")\\n\",\"src/lib/decimal.py\":\"import _sk_fail; _sk_fail._(\\\"decimal\\\")\\n\",\"src/lib/difflib.py\":\"import _sk_fail; _sk_fail._(\\\"difflib\\\")\\n\",\"src/lib/dircache.py\":\"import _sk_fail; _sk_fail._(\\\"dircache\\\")\\n\",\"src/lib/dis.py\":\"import _sk_fail; _sk_fail._(\\\"dis\\\")\\n\",\"src/lib/distutils/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"distutils\\\")\\n\",\"src/lib/distutils/command/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"command\\\")\\n\",\"src/lib/distutils/tests/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"tests\\\")\\n\",\"src/lib/doctest.py\":\"import _sk_fail; _sk_fail._(\\\"doctest\\\")\\n\",\"src/lib/dumbdbm.py\":\"import _sk_fail; _sk_fail._(\\\"dumbdbm\\\")\\n\",\"src/lib/dummy_thread.py\":\"import _sk_fail; _sk_fail._(\\\"dummy_thread\\\")\\n\",\"src/lib/dummy_threading.py\":\"import _sk_fail; _sk_fail._(\\\"dummy_threading\\\")\\n\",\"src/lib/email/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"email\\\")\\n\",\"src/lib/email/mime/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"mime\\\")\\n\",\"src/lib/email/test/data/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"data\\\")\\n\",\"src/lib/encodings/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"encodings\\\")\\n\",\"src/lib/filecmp.py\":\"import _sk_fail; _sk_fail._(\\\"filecmp\\\")\\n\",\"src/lib/fileinput.py\":\"import _sk_fail; _sk_fail._(\\\"fileinput\\\")\\n\",\"src/lib/fnmatch.py\":\"import _sk_fail; _sk_fail._(\\\"fnmatch\\\")\\n\",\"src/lib/formatter.py\":\"import _sk_fail; _sk_fail._(\\\"formatter\\\")\\n\",\"src/lib/fpformat.py\":\"import _sk_fail; _sk_fail._(\\\"fpformat\\\")\\n\",\"src/lib/fractions.py\":\"import _sk_fail; _sk_fail._(\\\"fractions\\\")\\n\",\"src/lib/ftplib.py\":\"import _sk_fail; _sk_fail._(\\\"ftplib\\\")\\n\",\"src/lib/genericpath.py\":\"import _sk_fail; _sk_fail._(\\\"genericpath\\\")\\n\",\"src/lib/getopt.py\":\"import _sk_fail; _sk_fail._(\\\"getopt\\\")\\n\",\"src/lib/getpass.py\":\"import _sk_fail; _sk_fail._(\\\"getpass\\\")\\n\",\"src/lib/gettext.py\":\"import _sk_fail; _sk_fail._(\\\"gettext\\\")\\n\",\"src/lib/glob.py\":\"import _sk_fail; _sk_fail._(\\\"glob\\\")\\n\",\"src/lib/gzip.py\":\"import _sk_fail; _sk_fail._(\\\"gzip\\\")\\n\",\"src/lib/hashlib.py\":\"import _sk_fail; _sk_fail._(\\\"hashlib\\\")\\n\",\"src/lib/heapq.py\":\"\\\"\\\"\\\"Heap queue algorithm (a.k.a. priority queue).\\n\\nHeaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\\nall k, counting elements from 0. For the sake of comparison,\\nnon-existing elements are considered to be infinite. The interesting\\nproperty of a heap is that a[0] is always its smallest element.\\n\\nUsage:\\n\\nheap = [] # creates an empty heap\\nheappush(heap, item) # pushes a new item on the heap\\nitem = heappop(heap) # pops the smallest item from the heap\\nitem = heap[0] # smallest item on the heap without popping it\\nheapify(x) # transforms list into a heap, in-place, in linear time\\nitem = heapreplace(heap, item) # pops and returns smallest item, and adds\\n # new item; the heap size is unchanged\\n\\nOur API differs from textbook heap algorithms as follows:\\n\\n- We use 0-based indexing. This makes the relationship between the\\n index for a node and the indexes for its children slightly less\\n obvious, but is more suitable since Python uses 0-based indexing.\\n\\n- Our heappop() method returns the smallest item, not the largest.\\n\\nThese two make it possible to view the heap as a regular Python list\\nwithout surprises: heap[0] is the smallest item, and heap.sort()\\nmaintains the heap invariant!\\n\\\"\\\"\\\"\\n\\n# Original code by Kevin O'Connor, augmented by Tim Peters and Raymond Hettinger\\n\\n__about__ = \\\"\\\"\\\"Heap queues\\n\\n[explanation by François Pinard]\\n\\nHeaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\\nall k, counting elements from 0. For the sake of comparison,\\nnon-existing elements are considered to be infinite. The interesting\\nproperty of a heap is that a[0] is always its smallest element.\\n\\nThe strange invariant above is meant to be an efficient memory\\nrepresentation for a tournament. The numbers below are `k', not a[k]:\\n\\n 0\\n\\n 1 2\\n\\n 3 4 5 6\\n\\n 7 8 9 10 11 12 13 14\\n\\n 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30\\n\\n\\nIn the tree above, each cell `k' is topping `2*k+1' and `2*k+2'. In\\na usual binary tournament we see in sports, each cell is the winner\\nover the two cells it tops, and we can trace the winner down the tree\\nto see all opponents s/he had. However, in many computer applications\\nof such tournaments, we do not need to trace the history of a winner.\\nTo be more memory efficient, when a winner is promoted, we try to\\nreplace it by something else at a lower level, and the rule becomes\\nthat a cell and the two cells it tops contain three different items,\\nbut the top cell \\\"wins\\\" over the two topped cells.\\n\\nIf this heap invariant is protected at all time, index 0 is clearly\\nthe overall winner. The simplest algorithmic way to remove it and\\nfind the \\\"next\\\" winner is to move some loser (let's say cell 30 in the\\ndiagram above) into the 0 position, and then percolate this new 0 down\\nthe tree, exchanging values, until the invariant is re-established.\\nThis is clearly logarithmic on the total number of items in the tree.\\nBy iterating over all items, you get an O(n ln n) sort.\\n\\nA nice feature of this sort is that you can efficiently insert new\\nitems while the sort is going on, provided that the inserted items are\\nnot \\\"better\\\" than the last 0'th element you extracted. This is\\nespecially useful in simulation contexts, where the tree holds all\\nincoming events, and the \\\"win\\\" condition means the smallest scheduled\\ntime. When an event schedule other events for execution, they are\\nscheduled into the future, so they can easily go into the heap. So, a\\nheap is a good structure for implementing schedulers (this is what I\\nused for my MIDI sequencer :-).\\n\\nVarious structures for implementing schedulers have been extensively\\nstudied, and heaps are good for this, as they are reasonably speedy,\\nthe speed is almost constant, and the worst case is not much different\\nthan the average case. However, there are other representations which\\nare more efficient overall, yet the worst cases might be terrible.\\n\\nHeaps are also very useful in big disk sorts. You most probably all\\nknow that a big sort implies producing \\\"runs\\\" (which are pre-sorted\\nsequences, which size is usually related to the amount of CPU memory),\\nfollowed by a merging passes for these runs, which merging is often\\nvery cleverly organised[1]. It is very important that the initial\\nsort produces the longest runs possible. Tournaments are a good way\\nto that. If, using all the memory available to hold a tournament, you\\nreplace and percolate items that happen to fit the current run, you'll\\nproduce runs which are twice the size of the memory for random input,\\nand much better for input fuzzily ordered.\\n\\nMoreover, if you output the 0'th item on disk and get an input which\\nmay not fit in the current tournament (because the value \\\"wins\\\" over\\nthe last output value), it cannot fit in the heap, so the size of the\\nheap decreases. The freed memory could be cleverly reused immediately\\nfor progressively building a second heap, which grows at exactly the\\nsame rate the first heap is melting. When the first heap completely\\nvanishes, you switch heaps and start a new run. Clever and quite\\neffective!\\n\\nIn a word, heaps are useful memory structures to know. I use them in\\na few applications, and I think it is good to keep a `heap' module\\naround. :-)\\n\\n--------------------\\n[1] The disk balancing algorithms which are current, nowadays, are\\nmore annoying than clever, and this is a consequence of the seeking\\ncapabilities of the disks. On devices which cannot seek, like big\\ntape drives, the story was quite different, and one had to be very\\nclever to ensure (far in advance) that each tape movement will be the\\nmost effective possible (that is, will best participate at\\n\\\"progressing\\\" the merge). Some tapes were even able to read\\nbackwards, and this was also used to avoid the rewinding time.\\nBelieve me, real good tape sorts were quite spectacular to watch!\\nFrom all times, sorting has always been a Great Art! :-)\\n\\\"\\\"\\\"\\n\\n__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace',\\n 'nlargest', 'nsmallest', 'heappushpop']\\n\\n\\ndef heappush(heap, item):\\n \\\"\\\"\\\"Push item onto heap, maintaining the heap invariant.\\\"\\\"\\\"\\n heap.append(item)\\n _siftdown(heap, 0, len(heap) - 1)\\n\\n\\ndef heappop(heap):\\n \\\"\\\"\\\"Pop the smallest item off the heap, maintaining the heap invariant.\\\"\\\"\\\"\\n lastelt = heap.pop() # raises appropriate IndexError if heap is empty\\n if heap:\\n returnitem = heap[0]\\n heap[0] = lastelt\\n _siftup(heap, 0)\\n return returnitem\\n return lastelt\\n\\n\\ndef heapreplace(heap, item):\\n \\\"\\\"\\\"Pop and return the current smallest value, and add the new item.\\n\\n This is more efficient than heappop() followed by heappush(), and can be\\n more appropriate when using a fixed-size heap. Note that the value\\n returned may be larger than item! That constrains reasonable uses of\\n this routine unless written as part of a conditional replacement:\\n\\n if item > heap[0]:\\n item = heapreplace(heap, item)\\n \\\"\\\"\\\"\\n returnitem = heap[0] # raises appropriate IndexError if heap is empty\\n heap[0] = item\\n _siftup(heap, 0)\\n return returnitem\\n\\n\\ndef heappushpop(heap, item):\\n \\\"\\\"\\\"Fast version of a heappush followed by a heappop.\\\"\\\"\\\"\\n if heap and heap[0] < item:\\n item, heap[0] = heap[0], item\\n _siftup(heap, 0)\\n return item\\n\\n\\ndef heapify(x):\\n \\\"\\\"\\\"Transform list into a heap, in-place, in O(len(x)) time.\\\"\\\"\\\"\\n n = len(x)\\n # Transform bottom-up. The largest index there's any point to looking at\\n # is the largest with a child index in-range, so must have 2*i + 1 < n,\\n # or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so\\n # j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is\\n # (2*j+1-1)/2 = j so j-1 is the largest, and that's again n//2-1.\\n for i in reversed(range(n // 2)):\\n _siftup(x, i)\\n\\n\\ndef _heappop_max(heap):\\n \\\"\\\"\\\"Maxheap version of a heappop.\\\"\\\"\\\"\\n lastelt = heap.pop() # raises appropriate IndexError if heap is empty\\n if heap:\\n returnitem = heap[0]\\n heap[0] = lastelt\\n _siftup_max(heap, 0)\\n return returnitem\\n return lastelt\\n\\n\\ndef _heapreplace_max(heap, item):\\n \\\"\\\"\\\"Maxheap version of a heappop followed by a heappush.\\\"\\\"\\\"\\n returnitem = heap[0] # raises appropriate IndexError if heap is empty\\n heap[0] = item\\n _siftup_max(heap, 0)\\n return returnitem\\n\\n\\ndef _heapify_max(x):\\n \\\"\\\"\\\"Transform list into a maxheap, in-place, in O(len(x)) time.\\\"\\\"\\\"\\n n = len(x)\\n for i in reversed(range(n // 2)):\\n _siftup_max(x, i)\\n\\n# 'heap' is a heap at all indices >= startpos, except possibly for pos. pos\\n# is the index of a leaf with a possibly out-of-order value. Restore the\\n# heap invariant.\\n\\n\\ndef _siftdown(heap, startpos, pos):\\n newitem = heap[pos]\\n # Follow the path to the root, moving parents down until finding a place\\n # newitem fits.\\n while pos > startpos:\\n parentpos = (pos - 1) >> 1\\n parent = heap[parentpos]\\n if newitem < parent:\\n heap[pos] = parent\\n pos = parentpos\\n continue\\n break\\n heap[pos] = newitem\\n\\n# The child indices of heap index pos are already heaps, and we want to make\\n# a heap at index pos too. We do this by bubbling the smaller child of\\n# pos up (and so on with that child's children, etc) until hitting a leaf,\\n# then using _siftdown to move the oddball originally at index pos into place.\\n#\\n# We *could* break out of the loop as soon as we find a pos where newitem <=\\n# both its children, but turns out that's not a good idea, and despite that\\n# many books write the algorithm that way. During a heap pop, the last array\\n# element is sifted in, and that tends to be large, so that comparing it\\n# against values starting from the root usually doesn't pay (= usually doesn't\\n# get us out of the loop early). See Knuth, Volume 3, where this is\\n# explained and quantified in an exercise.\\n#\\n# Cutting the # of comparisons is important, since these routines have no\\n# way to extract \\\"the priority\\\" from an array element, so that intelligence\\n# is likely to be hiding in custom comparison methods, or in array elements\\n# storing (priority, record) tuples. Comparisons are thus potentially\\n# expensive.\\n#\\n# On random arrays of length 1000, making this change cut the number of\\n# comparisons made by heapify() a little, and those made by exhaustive\\n# heappop() a lot, in accord with theory. Here are typical results from 3\\n# runs (3 just to demonstrate how small the variance is):\\n#\\n# Compares needed by heapify Compares needed by 1000 heappops\\n# -------------------------- --------------------------------\\n# 1837 cut to 1663 14996 cut to 8680\\n# 1855 cut to 1659 14966 cut to 8678\\n# 1847 cut to 1660 15024 cut to 8703\\n#\\n# Building the heap by using heappush() 1000 times instead required\\n# 2198, 2148, and 2219 compares: heapify() is more efficient, when\\n# you can use it.\\n#\\n# The total compares needed by list.sort() on the same lists were 8627,\\n# 8627, and 8632 (this should be compared to the sum of heapify() and\\n# heappop() compares): list.sort() is (unsurprisingly!) more efficient\\n# for sorting.\\n\\n\\ndef _siftup(heap, pos):\\n endpos = len(heap)\\n startpos = pos\\n newitem = heap[pos]\\n # Bubble up the smaller child until hitting a leaf.\\n childpos = 2 * pos + 1 # leftmost child position\\n while childpos < endpos:\\n # Set childpos to index of smaller child.\\n rightpos = childpos + 1\\n if rightpos < endpos and not heap[childpos] < heap[rightpos]:\\n childpos = rightpos\\n # Move the smaller child up.\\n heap[pos] = heap[childpos]\\n pos = childpos\\n childpos = 2 * pos + 1\\n # The leaf at pos is empty now. Put newitem there, and bubble it up\\n # to its final resting place (by sifting its parents down).\\n heap[pos] = newitem\\n _siftdown(heap, startpos, pos)\\n\\n\\ndef _siftdown_max(heap, startpos, pos):\\n 'Maxheap variant of _siftdown'\\n newitem = heap[pos]\\n # Follow the path to the root, moving parents down until finding a place\\n # newitem fits.\\n while pos > startpos:\\n parentpos = (pos - 1) >> 1\\n parent = heap[parentpos]\\n if parent < newitem:\\n heap[pos] = parent\\n pos = parentpos\\n continue\\n break\\n heap[pos] = newitem\\n\\n\\ndef _siftup_max(heap, pos):\\n 'Maxheap variant of _siftup'\\n endpos = len(heap)\\n startpos = pos\\n newitem = heap[pos]\\n # Bubble up the larger child until hitting a leaf.\\n childpos = 2 * pos + 1 # leftmost child position\\n while childpos < endpos:\\n # Set childpos to index of larger child.\\n rightpos = childpos + 1\\n if rightpos < endpos and not heap[rightpos] < heap[childpos]:\\n childpos = rightpos\\n # Move the larger child up.\\n heap[pos] = heap[childpos]\\n pos = childpos\\n childpos = 2 * pos + 1\\n # The leaf at pos is empty now. Put newitem there, and bubble it up\\n # to its final resting place (by sifting its parents down).\\n heap[pos] = newitem\\n _siftdown_max(heap, startpos, pos)\\n\\n\\n# Algorithm notes for nlargest() and nsmallest()\\n# ==============================================\\n#\\n# Make a single pass over the data while keeping the k most extreme values\\n# in a heap. Memory consumption is limited to keeping k values in a list.\\n#\\n# Measured performance for random inputs:\\n#\\n# number of comparisons\\n# n inputs k-extreme values (average of 5 trials) % more than min()\\n# ------------- ---------------- --------------------- -----------------\\n# 1,000 100 3,317 231.7%\\n# 10,000 100 14,046 40.5%\\n# 100,000 100 105,749 5.7%\\n# 1,000,000 100 1,007,751 0.8%\\n# 10,000,000 100 10,009,401 0.1%\\n#\\n# Theoretical number of comparisons for k smallest of n random inputs:\\n#\\n# Step Comparisons Action\\n# ---- -------------------------- ---------------------------\\n# 1 1.66 * k heapify the first k-inputs\\n# 2 n - k compare remaining elements to top of heap\\n# 3 k * (1 + lg2(k)) * ln(n/k) replace the topmost value on the heap\\n# 4 k * lg2(k) - (k/2) final sort of the k most extreme values\\n#\\n# Combining and simplifying for a rough estimate gives:\\n#\\n# comparisons = n + k * (log(k, 2) * log(n/k) + log(k, 2) + log(n/k))\\n#\\n# Computing the number of comparisons for step 3:\\n# -----------------------------------------------\\n# * For the i-th new value from the iterable, the probability of being in the\\n# k most extreme values is k/i. For example, the probability of the 101st\\n# value seen being in the 100 most extreme values is 100/101.\\n# * If the value is a new extreme value, the cost of inserting it into the\\n# heap is 1 + log(k, 2).\\n# * The probability times the cost gives:\\n# (k/i) * (1 + log(k, 2))\\n# * Summing across the remaining n-k elements gives:\\n# sum((k/i) * (1 + log(k, 2)) for i in range(k+1, n+1))\\n# * This reduces to:\\n# (H(n) - H(k)) * k * (1 + log(k, 2))\\n# * Where H(n) is the n-th harmonic number estimated by:\\n# gamma = 0.5772156649\\n# H(n) = log(n, e) + gamma + 1 / (2 * n)\\n# http://en.wikipedia.org/wiki/Harmonic_series_(mathematics)#Rate_of_divergence\\n# * Substituting the H(n) formula:\\n# comparisons = k * (1 + log(k, 2)) * (log(n/k, e) + (1/n - 1/k) / 2)\\n#\\n# Worst-case for step 3:\\n# ----------------------\\n# In the worst case, the input data is reversed sorted so that every new element\\n# must be inserted in the heap:\\n#\\n# comparisons = 1.66 * k + log(k, 2) * (n - k)\\n#\\n# Alternative Algorithms\\n# ----------------------\\n# Other algorithms were not used because they:\\n# 1) Took much more auxiliary memory,\\n# 2) Made multiple passes over the data.\\n# 3) Made more comparisons in common cases (small k, large n, semi-random input).\\n# See the more detailed comparison of approach at:\\n# http://code.activestate.com/recipes/577573-compare-algorithms-for-heapqsmallest\\n\\ndef nsmallest(n, iterable, key=None):\\n \\\"\\\"\\\"Find the n smallest elements in a dataset.\\n\\n Equivalent to: sorted(iterable, key=key)[:n]\\n \\\"\\\"\\\"\\n\\n # Short-cut for n==1 is to use min()\\n if n == 1:\\n it = iter(iterable)\\n sentinel = object()\\n result = min(it, default=sentinel, key=key)\\n return [] if result is sentinel else [result]\\n\\n # When n>=size, it's faster to use sorted()\\n try:\\n size = len(iterable)\\n except (TypeError, AttributeError):\\n pass\\n else:\\n if n >= size:\\n return sorted(iterable, key=key)[:n]\\n\\n # When key is none, use simpler decoration\\n if key is None:\\n it = iter(iterable)\\n # put the range(n) first so that zip() doesn't\\n # consume one too many elements from the iterator\\n result = [(elem, i) for i, elem in zip(range(n), it)]\\n if not result:\\n return result\\n _heapify_max(result)\\n top = result[0][0]\\n order = n\\n _heapreplace = _heapreplace_max\\n for elem in it:\\n if elem < top:\\n _heapreplace(result, (elem, order))\\n top, _order = result[0]\\n order += 1\\n result.sort()\\n return [elem for (elem, order) in result]\\n\\n # General case, slowest method\\n it = iter(iterable)\\n result = [(key(elem), i, elem) for i, elem in zip(range(n), it)]\\n if not result:\\n return result\\n _heapify_max(result)\\n top = result[0][0]\\n order = n\\n _heapreplace = _heapreplace_max\\n for elem in it:\\n k = key(elem)\\n if k < top:\\n _heapreplace(result, (k, order, elem))\\n top, _order, _elem = result[0]\\n order += 1\\n result.sort()\\n return [elem for (k, order, elem) in result]\\n\\n\\ndef nlargest(n, iterable, key=None):\\n \\\"\\\"\\\"Find the n largest elements in a dataset.\\n\\n Equivalent to: sorted(iterable, key=key, reverse=True)[:n]\\n \\\"\\\"\\\"\\n\\n # Short-cut for n==1 is to use max()\\n if n == 1:\\n it = iter(iterable)\\n sentinel = object()\\n result = max(it, default=sentinel, key=key)\\n return [] if result is sentinel else [result]\\n\\n # When n>=size, it's faster to use sorted()\\n try:\\n size = len(iterable)\\n except (TypeError, AttributeError):\\n pass\\n else:\\n if n >= size:\\n return sorted(iterable, key=key, reverse=True)[:n]\\n\\n # When key is none, use simpler decoration\\n if key is None:\\n it = iter(iterable)\\n result = [(elem, i) for i, elem in zip(range(0, -n, -1), it)]\\n if not result:\\n return result\\n heapify(result)\\n top = result[0][0]\\n order = -n\\n _heapreplace = heapreplace\\n for elem in it:\\n if top < elem:\\n _heapreplace(result, (elem, order))\\n top, _order = result[0]\\n order -= 1\\n result.sort(reverse=True)\\n return [elem for (elem, order) in result]\\n\\n # General case, slowest method\\n it = iter(iterable)\\n result = [(key(elem), i, elem) for i, elem in zip(range(0, -n, -1), it)]\\n if not result:\\n return result\\n heapify(result)\\n top = result[0][0]\\n order = -n\\n _heapreplace = heapreplace\\n for elem in it:\\n k = key(elem)\\n if top < k:\\n _heapreplace(result, (k, order, elem))\\n top, _order, _elem = result[0]\\n order -= 1\\n result.sort(reverse=True)\\n return [elem for (k, order, elem) in result]\\n\\n\\n# If available, use C implementation\\ntry:\\n from _heapq import *\\nexcept ImportError:\\n pass\\ntry:\\n from _heapq import _heapreplace_max\\nexcept ImportError:\\n pass\\ntry:\\n from _heapq import _heapify_max\\nexcept ImportError:\\n pass\\ntry:\\n from _heapq import _heappop_max\\nexcept ImportError:\\n pass\\n\\n\\nif __name__ == \\\"__main__\\\":\\n\\n import doctest # pragma: no cover\\n print(doctest.testmod()) # pragma: no cover\\n\",\"src/lib/hmac.py\":\"import _sk_fail; _sk_fail._(\\\"hmac\\\")\\n\",\"src/lib/hotshot/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"hotshot\\\")\\n\",\"src/lib/htmlentitydefs.py\":\"import _sk_fail; _sk_fail._(\\\"htmlentitydefs\\\")\\n\",\"src/lib/htmllib.py\":\"import _sk_fail; _sk_fail._(\\\"htmllib\\\")\\n\",\"src/lib/httplib.py\":\"import _sk_fail; _sk_fail._(\\\"httplib\\\")\\n\",\"src/lib/idlelib/Icons/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"Icons\\\")\\n\",\"src/lib/idlelib/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"idlelib\\\")\\n\",\"src/lib/ihooks.py\":\"import _sk_fail; _sk_fail._(\\\"ihooks\\\")\\n\",\"src/lib/imaplib.py\":\"import _sk_fail; _sk_fail._(\\\"imaplib\\\")\\n\",\"src/lib/imghdr.py\":\"import _sk_fail; _sk_fail._(\\\"imghdr\\\")\\n\",\"src/lib/imputil.py\":\"import _sk_fail; _sk_fail._(\\\"imputil\\\")\\n\",\"src/lib/io.py\":\"import _sk_fail; _sk_fail._(\\\"io\\\")\\n\",\"src/lib/lib-dynload/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"lib-dynload\\\")\\n\",\"src/lib/lib-tk/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"lib-tk\\\")\\n\",\"src/lib/lib2to3/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"lib2to3\\\")\\n\",\"src/lib/lib2to3/fixes/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"fixes\\\")\\n\",\"src/lib/lib2to3/pgen2/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"pgen2\\\")\\n\",\"src/lib/lib2to3/tests/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"tests\\\")\\n\",\"src/lib/linecache.py\":\"import _sk_fail; _sk_fail._(\\\"linecache\\\")\\n\",\"src/lib/locale.py\":\"import _sk_fail; _sk_fail._(\\\"locale\\\")\\n\",\"src/lib/logging/__init__.py\":\"# Minimal implementation original from CPython 3.9 source code\\n\\nimport sys, time, re\\n\\n\\n__all__ = [\\n \\\"BASIC_FORMAT\\\",\\n \\\"BufferingFormatter\\\",\\n \\\"CRITICAL\\\",\\n \\\"DEBUG\\\",\\n \\\"ERROR\\\",\\n \\\"FATAL\\\",\\n \\\"FileHandler\\\",\\n \\\"Filter\\\",\\n \\\"Formatter\\\",\\n \\\"Handler\\\",\\n \\\"INFO\\\",\\n \\\"LogRecord\\\",\\n \\\"Logger\\\",\\n \\\"LoggerAdapter\\\",\\n \\\"NOTSET\\\",\\n \\\"NullHandler\\\",\\n \\\"StreamHandler\\\",\\n \\\"WARN\\\",\\n \\\"WARNING\\\",\\n \\\"addLevelName\\\",\\n \\\"basicConfig\\\",\\n \\\"captureWarnings\\\",\\n \\\"critical\\\",\\n \\\"debug\\\",\\n \\\"disable\\\",\\n \\\"error\\\",\\n \\\"exception\\\",\\n \\\"fatal\\\",\\n \\\"getLevelName\\\",\\n \\\"getLogger\\\",\\n \\\"getLoggerClass\\\",\\n \\\"info\\\",\\n \\\"log\\\",\\n \\\"makeLogRecord\\\",\\n \\\"setLoggerClass\\\",\\n \\\"shutdown\\\",\\n \\\"warning\\\",\\n \\\"getLogRecordFactory\\\",\\n \\\"setLogRecordFactory\\\",\\n \\\"lastResort\\\",\\n \\\"raiseExceptions\\\",\\n]\\n\\n\\n_startTime = time.time()\\nraiseExceptions = False\\nlogThreads = False\\nlogMultiprocessing = False\\nlogProcesses = False\\nlogAsyncioTasks = False\\n\\n# ---------------------------------------------------------------------------\\n# Level related stuff\\n# ---------------------------------------------------------------------------\\n\\nCRITICAL = 50\\nFATAL = CRITICAL\\nERROR = 40\\nWARNING = 30\\nWARN = WARNING\\nINFO = 20\\nDEBUG = 10\\nNOTSET = 0\\n\\n_levelToName = {\\n CRITICAL: \\\"CRITICAL\\\",\\n ERROR: \\\"ERROR\\\",\\n WARNING: \\\"WARNING\\\",\\n INFO: \\\"INFO\\\",\\n DEBUG: \\\"DEBUG\\\",\\n NOTSET: \\\"NOTSET\\\",\\n}\\n_nameToLevel = {\\n \\\"CRITICAL\\\": CRITICAL,\\n \\\"FATAL\\\": FATAL,\\n \\\"ERROR\\\": ERROR,\\n \\\"WARN\\\": WARNING,\\n \\\"WARNING\\\": WARNING,\\n \\\"INFO\\\": INFO,\\n \\\"DEBUG\\\": DEBUG,\\n \\\"NOTSET\\\": NOTSET,\\n}\\n\\n\\ndef getLevelName(level):\\n result = _levelToName.get(level)\\n if result is not None:\\n return result\\n result = _nameToLevel.get(level)\\n if result is not None:\\n return result\\n return \\\"Level %s\\\" % level\\n\\n\\ndef addLevelName(level, levelName):\\n _levelToName[level] = levelName\\n _nameToLevel[levelName] = level\\n\\n\\ndef _checkLevel(level):\\n if isinstance(level, int):\\n rv = level\\n elif str(level) == level:\\n if level not in _nameToLevel:\\n raise ValueError(\\\"Unknown level: %r\\\" % level)\\n rv = _nameToLevel[level]\\n else:\\n raise TypeError(\\\"Level not an integer or a valid string: %r\\\" % level)\\n return rv\\n\\n\\nclass _FakeRlock(object):\\n def __enter__(self):\\n pass\\n\\n def __exit__(self, exc_type, exc_value, traceback):\\n pass\\n\\n\\n_lock = _FakeRlock()\\n\\n# ---------------------------------------------------------------------------\\n# The logging record\\n# ---------------------------------------------------------------------------\\n\\n\\nclass LogRecord(object):\\n def __init__(\\n self,\\n name,\\n level,\\n pathname,\\n lineno,\\n msg,\\n args,\\n exc_info,\\n func=None,\\n sinfo=None,\\n **kwargs,\\n ):\\n ct = time.time()\\n self.name = name\\n self.msg = msg\\n if args and len(args) == 1 and isinstance(args[0], dict) and args[0]:\\n args = args[0]\\n self.args = args\\n self.levelname = getLevelName(level)\\n self.levelno = level\\n self.pathname = pathname\\n self.filename = pathname\\n self.module = \\\"Unknown module\\\"\\n self.exc_info = exc_info\\n self.exc_text = None # used to cache the traceback text\\n self.stack_info = sinfo\\n self.lineno = lineno\\n self.funcName = func\\n self.created = ct\\n self.msecs = int((ct - int(ct)) * 1000) + 0.0 # see gh-89047\\n self.relativeCreated = (self.created - _startTime) * 1000\\n self.thread = None\\n self.threadName = None\\n self.processName = None\\n self.process = None\\n self.taskName = None\\n\\n def __repr__(self):\\n return '' % (\\n self.name,\\n self.levelno,\\n self.pathname,\\n self.lineno,\\n self.msg,\\n )\\n\\n def getMessage(self):\\n msg = str(self.msg)\\n if self.args:\\n msg = msg % self.args\\n return msg\\n\\n\\n#\\n# Determine which class to use when instantiating log records.\\n#\\n_logRecordFactory = LogRecord\\n\\n\\ndef setLogRecordFactory(factory):\\n global _logRecordFactory\\n _logRecordFactory = factory\\n\\n\\ndef getLogRecordFactory():\\n return _logRecordFactory\\n\\n\\ndef makeLogRecord(dict):\\n rv = _logRecordFactory(None, None, \\\"\\\", 0, \\\"\\\", (), None, None)\\n rv.__dict__.update(dict)\\n return rv\\n\\n\\n# ---------------------------------------------------------------------------\\n# Formatter classes and functions\\n# ---------------------------------------------------------------------------\\nclass PercentStyle(object):\\n default_format = \\\"%(message)s\\\"\\n asctime_format = \\\"%(asctime)s\\\"\\n asctime_search = \\\"%(asctime)\\\"\\n validation_pattern = re.compile(\\n r\\\"%\\\\(\\\\w+\\\\)[#0+ -]*(\\\\*|\\\\d+)?(\\\\.(\\\\*|\\\\d+))?[diouxefgcrsa%]\\\", re.I\\n )\\n\\n def __init__(self, fmt, *, defaults=None):\\n self._fmt = fmt or self.default_format\\n self._defaults = defaults\\n\\n def usesTime(self):\\n return self._fmt.find(self.asctime_search) >= 0\\n\\n def validate(self):\\n if not self.validation_pattern.search(self._fmt):\\n raise ValueError(\\n \\\"Invalid format '%s' for '%s' style\\\"\\n % (self._fmt, self.default_format[0])\\n )\\n\\n def _format(self, record):\\n defaults = self._defaults\\n if defaults:\\n values = defaults | record.__dict__\\n else:\\n values = record.__dict__\\n return self._fmt % values\\n\\n def format(self, record):\\n try:\\n return self._format(record)\\n except KeyError as e:\\n raise ValueError(\\\"Formatting field not found in record: %s\\\" % e)\\n\\n\\nclass StrFormatStyle(PercentStyle):\\n default_format = \\\"{message}\\\"\\n asctime_format = \\\"{asctime}\\\"\\n asctime_search = \\\"{asctime\\\"\\n\\n fmt_spec = re.compile(\\n r\\\"^(.?[<>=^])?[+ -]?#?0?(\\\\d+|{\\\\w+})?[,_]?(\\\\.(\\\\d+|{\\\\w+}))?[bcdefgnosx%]?$\\\", re.I\\n )\\n field_spec = re.compile(r\\\"^(\\\\d+|\\\\w+)(\\\\.\\\\w+|\\\\[[^]]+\\\\])*$\\\")\\n\\n def _format(self, record):\\n defaults = self._defaults\\n if defaults:\\n values = defaults | record.__dict__\\n else:\\n values = record.__dict__\\n return self._fmt.format(**values)\\n\\n def validate(self):\\n \\\"\\\"\\\"Validate the input format, ensure it is the correct string formatting style\\\"\\\"\\\"\\n return # TODO - _str_formatter.parse is not a thing - just assume it's valid\\n fields = set()\\n try:\\n for _, fieldname, spec, conversion in _str_formatter.parse(self._fmt):\\n if fieldname:\\n if not self.field_spec.match(fieldname):\\n raise ValueError(\\n \\\"invalid field name/expression: %r\\\" % fieldname\\n )\\n fields.add(fieldname)\\n if conversion and conversion not in \\\"rsa\\\":\\n raise ValueError(\\\"invalid conversion: %r\\\" % conversion)\\n if spec and not self.fmt_spec.match(spec):\\n raise ValueError(\\\"bad specifier: %r\\\" % spec)\\n except ValueError as e:\\n raise ValueError(\\\"invalid format: %s\\\" % e)\\n if not fields:\\n raise ValueError(\\\"invalid format: no fields\\\")\\n\\n\\nclass StringTemplateStyle(PercentStyle):\\n default_format = \\\"${message}\\\"\\n asctime_format = \\\"${asctime}\\\"\\n asctime_search = \\\"${asctime}\\\"\\n\\n def __init__(self, fmt, *, defaults=None):\\n raise NotImplementedError(\\\"StringTemplateStyle is not implemented\\\")\\n\\n\\nBASIC_FORMAT = \\\"%(levelname)s:%(name)s:%(message)s\\\"\\n\\n_STYLES = {\\n \\\"%\\\": (PercentStyle, BASIC_FORMAT),\\n \\\"{\\\": (StrFormatStyle, \\\"{levelname}:{name}:{message}\\\"),\\n \\\"$\\\": (StringTemplateStyle, \\\"${levelname}:${name}:${message}\\\"),\\n}\\n\\n\\nclass Formatter(object):\\n def converter(self, x):\\n return time.localtime(x)\\n\\n def __init__(self, fmt=None, datefmt=None, style='%', validate=True, *,\\n defaults=None):\\n if style not in _STYLES:\\n raise ValueError(\\\"Style must be one of: %s\\\" % \\\",\\\".join(_STYLES.keys()))\\n self._style = _STYLES[style][0](fmt, defaults=defaults)\\n if validate:\\n self._style.validate()\\n\\n self._fmt = self._style._fmt\\n self.datefmt = datefmt\\n\\n default_time_format = \\\"%Y-%m-%d %H:%M:%S\\\"\\n default_msec_format = \\\"%s,%03d\\\"\\n\\n def formatTime(self, record, datefmt=None):\\n ct = self.converter(record.created)\\n if datefmt:\\n s = time.strftime(datefmt, ct)\\n else:\\n s = time.strftime(self.default_time_format, ct)\\n if self.default_msec_format:\\n s = self.default_msec_format % (s, record.msecs)\\n return s\\n\\n def formatException(self, ei):\\n raise NotImplementedError(\\\"formatException is not implemented\\\")\\n\\n def usesTime(self):\\n return self._style.usesTime()\\n\\n def formatMessage(self, record):\\n return self._style.format(record)\\n\\n def formatStack(self, stack_info):\\n return stack_info\\n\\n def format(self, record):\\n record.message = record.getMessage()\\n if self.usesTime():\\n record.asctime = self.formatTime(record, self.datefmt)\\n s = self.formatMessage(record)\\n if record.exc_info:\\n # Cache the traceback text to avoid converting it multiple times\\n # (it's constant anyway)\\n if not record.exc_text:\\n record.exc_text = self.formatException(record.exc_info)\\n if record.exc_text:\\n if s[-1:] != \\\"\\\\n\\\":\\n s = s + \\\"\\\\n\\\"\\n s = s + record.exc_text\\n if record.stack_info:\\n if s[-1:] != \\\"\\\\n\\\":\\n s = s + \\\"\\\\n\\\"\\n s = s + self.formatStack(record.stack_info)\\n return s\\n\\n\\n#\\n# The default formatter to use when no other is specified\\n#\\n_defaultFormatter = Formatter()\\n\\n\\nclass BufferingFormatter(object):\\n def __init__(self, linefmt=None):\\n if linefmt:\\n self.linefmt = linefmt\\n else:\\n self.linefmt = _defaultFormatter\\n\\n def formatHeader(self, records):\\n return \\\"\\\"\\n\\n def formatFooter(self, records):\\n return \\\"\\\"\\n\\n def format(self, records):\\n rv = \\\"\\\"\\n if len(records) > 0:\\n rv = rv + self.formatHeader(records)\\n for record in records:\\n rv = rv + self.linefmt.format(record)\\n rv = rv + self.formatFooter(records)\\n return rv\\n\\n\\n# ---------------------------------------------------------------------------\\n# Filter classes and functions\\n# ---------------------------------------------------------------------------\\n\\n\\nclass Filter(object):\\n def __init__(self, name=\\\"\\\"):\\n self.name = name\\n self.nlen = len(name)\\n\\n def filter(self, record):\\n if self.nlen == 0:\\n return True\\n elif self.name == record.name:\\n return True\\n elif record.name.find(self.name, 0, self.nlen) != 0:\\n return False\\n return record.name[self.nlen] == \\\".\\\"\\n\\n\\nclass Filterer(object):\\n def __init__(self):\\n self.filters = []\\n\\n def addFilter(self, filter):\\n if filter not in self.filters:\\n self.filters.append(filter)\\n\\n def removeFilter(self, filter):\\n if filter in self.filters:\\n self.filters.remove(filter)\\n\\n def filter(self, record):\\n for f in self.filters:\\n if hasattr(f, \\\"filter\\\"):\\n result = f.filter(record)\\n else:\\n result = f(record) # assume callable - will raise if not\\n if not result:\\n return False\\n if isinstance(result, LogRecord):\\n record = result\\n return record\\n\\n\\n# ---------------------------------------------------------------------------\\n# Handler classes and functions\\n# ---------------------------------------------------------------------------\\n\\n# _handlers = weakref.WeakValueDictionary() # map of handler names to handlers\\n_handlers = {} # map of handler names to handlers\\n\\n\\nclass Handler(Filterer):\\n def __init__(self, level=NOTSET):\\n Filterer.__init__(self)\\n self._name = None\\n self.level = _checkLevel(level)\\n self.formatter = None\\n self._closed = False\\n\\n def get_name(self):\\n return self._name\\n\\n def set_name(self, name):\\n if self._name in _handlers:\\n del _handlers[self._name]\\n self._name = name\\n if name:\\n _handlers[name] = self\\n\\n name = property(get_name, set_name)\\n\\n def setLevel(self, level):\\n self.level = _checkLevel(level)\\n\\n def format(self, record):\\n if self.formatter:\\n fmt = self.formatter\\n else:\\n fmt = _defaultFormatter\\n return fmt.format(record)\\n\\n def emit(self, record):\\n raise NotImplementedError(\\\"emit must be implemented \\\" \\\"by Handler subclasses\\\")\\n\\n def handle(self, record):\\n rv = self.filter(record)\\n if isinstance(rv, LogRecord):\\n record = rv\\n if rv:\\n self.emit(record)\\n return rv\\n\\n def setFormatter(self, fmt):\\n self.formatter = fmt\\n\\n def flush(self):\\n pass\\n\\n def close(self):\\n self._closed = True\\n if self._name and self._name in _handlers:\\n del _handlers[self._name]\\n\\n def handleError(self, record):\\n pass\\n\\n def __repr__(self):\\n level = getLevelName(self.level)\\n return \\\"<%s (%s)>\\\" % (self.__class__.__name__, level)\\n\\n\\nclass StreamHandler(Handler):\\n terminator = \\\"\\\\n\\\"\\n\\n def __init__(self, stream=None):\\n Handler.__init__(self)\\n if stream is None:\\n stream = sys.stderr\\n self.stream = stream\\n\\n def flush(self):\\n if self.stream and hasattr(self.stream, \\\"flush\\\"):\\n self.stream.flush()\\n\\n def emit(self, record):\\n try:\\n msg = self.format(record)\\n stream = self.stream\\n stream.write(msg + self.terminator)\\n self.flush()\\n except RecursionError: # See issue 36272\\n raise\\n except Exception:\\n raise # TODO - we can't really handle errors so just raise them\\n self.handleError(record)\\n\\n def setStream(self, stream):\\n if stream is self.stream:\\n result = None\\n else:\\n result = self.stream\\n self.flush()\\n self.stream = stream\\n return result\\n\\n def __repr__(self):\\n level = getLevelName(self.level)\\n name = getattr(self.stream, \\\"name\\\", \\\"\\\")\\n # bpo-36015: name can be an int\\n name = str(name)\\n if name:\\n name += \\\" \\\"\\n return \\\"<%s %s(%s)>\\\" % (self.__class__.__name__, name, level)\\n\\n\\nclass FileHandler(StreamHandler):\\n def __init__(self, filename, mode=\\\"a\\\", encoding=None, delay=False, errors=None):\\n raise NotImplementedError(\\\"FileHandler is not implemented\\\")\\n\\n\\nclass _StderrHandler(StreamHandler):\\n def __init__(self, level=NOTSET):\\n Handler.__init__(self, level)\\n\\n @property\\n def stream(self):\\n return sys.stderr\\n\\n\\n_defaultLastResort = _StderrHandler(WARNING)\\nlastResort = _defaultLastResort\\n\\n# ---------------------------------------------------------------------------\\n# Manager classes and functions\\n# ---------------------------------------------------------------------------\\n\\n\\nclass PlaceHolder(object):\\n def __init__(self, alogger):\\n self.loggerMap = {alogger: None}\\n\\n def append(self, alogger):\\n if alogger not in self.loggerMap:\\n self.loggerMap[alogger] = None\\n\\n\\ndef setLoggerClass(klass):\\n if klass != Logger:\\n if not issubclass(klass, Logger):\\n raise TypeError(\\\"logger not derived from logging.Logger: \\\" + klass.__name__)\\n global _loggerClass\\n _loggerClass = klass\\n\\n\\ndef getLoggerClass():\\n return _loggerClass\\n\\n\\nclass Manager(object):\\n def __init__(self, rootnode):\\n self.root = rootnode\\n self.disable = 0\\n self.emittedNoHandlerWarning = False\\n self.loggerDict = {}\\n self.loggerClass = None\\n self.logRecordFactory = None\\n\\n @property\\n def disable(self):\\n return self._disable\\n\\n @disable.setter\\n def disable(self, value):\\n self._disable = _checkLevel(value)\\n\\n def getLogger(self, name):\\n rv = None\\n if not isinstance(name, str):\\n raise TypeError(\\\"A logger name must be a string\\\")\\n if name in self.loggerDict:\\n rv = self.loggerDict[name]\\n if isinstance(rv, PlaceHolder):\\n ph = rv\\n rv = (self.loggerClass or _loggerClass)(name)\\n rv.manager = self\\n self.loggerDict[name] = rv\\n self._fixupChildren(ph, rv)\\n self._fixupParents(rv)\\n else:\\n rv = (self.loggerClass or _loggerClass)(name)\\n rv.manager = self\\n self.loggerDict[name] = rv\\n self._fixupParents(rv)\\n return rv\\n\\n def setLoggerClass(self, klass):\\n if klass != Logger:\\n if not issubclass(klass, Logger):\\n raise TypeError(\\n \\\"logger not derived from logging.Logger: \\\" + klass.__name__\\n )\\n self.loggerClass = klass\\n\\n def setLogRecordFactory(self, factory):\\n self.logRecordFactory = factory\\n\\n def _fixupParents(self, alogger):\\n name = alogger.name\\n i = name.rfind(\\\".\\\")\\n rv = None\\n while (i > 0) and not rv:\\n substr = name[:i]\\n if substr not in self.loggerDict:\\n self.loggerDict[substr] = PlaceHolder(alogger)\\n else:\\n obj = self.loggerDict[substr]\\n if isinstance(obj, Logger):\\n rv = obj\\n else:\\n assert isinstance(obj, PlaceHolder)\\n obj.append(alogger)\\n i = name.rfind(\\\".\\\", 0, i - 1)\\n if not rv:\\n rv = self.root\\n alogger.parent = rv\\n\\n def _fixupChildren(self, ph, alogger):\\n name = alogger.name\\n namelen = len(name)\\n for c in ph.loggerMap.keys():\\n # The if means ... if not c.parent.name.startswith(nm)\\n if c.parent.name[:namelen] != name:\\n alogger.parent = c.parent\\n c.parent = alogger\\n\\n def _clear_cache(self):\\n for logger in self.loggerDict.values():\\n if isinstance(logger, Logger):\\n logger._cache.clear()\\n self.root._cache.clear()\\n\\n\\n# ---------------------------------------------------------------------------\\n# Logger classes and functions\\n# ---------------------------------------------------------------------------\\n\\n\\nclass Logger(Filterer):\\n def __init__(self, name, level=NOTSET):\\n Filterer.__init__(self)\\n self.name = name\\n self.level = _checkLevel(level)\\n self.parent = None\\n self.propagate = True\\n self.handlers = []\\n self.disabled = False\\n self._cache = {}\\n\\n def setLevel(self, level):\\n self.level = _checkLevel(level)\\n self.manager._clear_cache()\\n\\n def debug(self, msg, *args, **kwargs):\\n if self.isEnabledFor(DEBUG):\\n self._log(DEBUG, msg, args, **kwargs)\\n\\n def info(self, msg, *args, **kwargs):\\n if self.isEnabledFor(INFO):\\n self._log(INFO, msg, args, **kwargs)\\n\\n def warning(self, msg, *args, **kwargs):\\n if self.isEnabledFor(WARNING):\\n self._log(WARNING, msg, args, **kwargs)\\n\\n def error(self, msg, *args, **kwargs):\\n if self.isEnabledFor(ERROR):\\n self._log(ERROR, msg, args, **kwargs)\\n\\n def exception(self, msg, *args, exc_info=True, **kwargs):\\n self.error(msg, *args, exc_info=exc_info, **kwargs)\\n\\n def critical(self, msg, *args, **kwargs):\\n if self.isEnabledFor(CRITICAL):\\n self._log(CRITICAL, msg, args, **kwargs)\\n\\n fatal = critical\\n\\n def log(self, level, msg, *args, **kwargs):\\n if not isinstance(level, int):\\n if raiseExceptions:\\n raise TypeError(\\\"level must be an integer\\\")\\n else:\\n return\\n if self.isEnabledFor(level):\\n self._log(level, msg, args, **kwargs)\\n\\n def findCaller(self, stack_info=False, stacklevel=1):\\n rv = \\\"(unknown file)\\\", 0, \\\"(unknown function)\\\", None\\n return rv\\n\\n def makeRecord(\\n self,\\n name,\\n level,\\n fn,\\n lno,\\n msg,\\n args,\\n exc_info,\\n func=None,\\n extra=None,\\n sinfo=None,\\n ):\\n rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func, sinfo)\\n if extra is not None:\\n for key in extra:\\n if (key in [\\\"message\\\", \\\"asctime\\\"]) or (key in rv.__dict__):\\n raise KeyError(\\\"Attempt to overwrite %r in LogRecord\\\" % key)\\n rv.__dict__[key] = extra[key]\\n return rv\\n\\n def _log(\\n self,\\n level,\\n msg,\\n args,\\n exc_info=None,\\n extra=None,\\n stack_info=False,\\n stacklevel=1,\\n ):\\n sinfo = None\\n fn, lno, func = \\\"(unknown file)\\\", 0, \\\"(unknown function)\\\"\\n if exc_info:\\n if isinstance(exc_info, BaseException):\\n exc_info = (type(exc_info), exc_info, exc_info.__traceback__)\\n elif not isinstance(exc_info, tuple):\\n exc_info = sys.exc_info()\\n record = self.makeRecord(\\n self.name, level, fn, lno, msg, args, exc_info, func, extra, sinfo\\n )\\n self.handle(record)\\n\\n def handle(self, record):\\n if self.disabled:\\n return\\n maybe_record = self.filter(record)\\n if not maybe_record:\\n return\\n if isinstance(maybe_record, LogRecord):\\n record = maybe_record\\n self.callHandlers(record)\\n\\n def addHandler(self, hdlr):\\n if hdlr not in self.handlers:\\n self.handlers.append(hdlr)\\n\\n def removeHandler(self, hdlr):\\n if hdlr in self.handlers:\\n self.handlers.remove(hdlr)\\n\\n def hasHandlers(self):\\n c = self\\n rv = False\\n while c:\\n if c.handlers:\\n rv = True\\n break\\n if not c.propagate:\\n break\\n else:\\n c = c.parent\\n return rv\\n\\n def callHandlers(self, record):\\n c = self\\n found = 0\\n while c:\\n for hdlr in c.handlers:\\n found = found + 1\\n if record.levelno >= hdlr.level:\\n hdlr.handle(record)\\n if not c.propagate:\\n c = None # break out\\n else:\\n c = c.parent\\n if found == 0:\\n if lastResort:\\n if record.levelno >= lastResort.level:\\n lastResort.handle(record)\\n elif raiseExceptions and not self.manager.emittedNoHandlerWarning:\\n sys.stderr.write(\\n \\\"No handlers could be found for logger\\\" ' \\\"%s\\\"\\\\n' % self.name\\n )\\n self.manager.emittedNoHandlerWarning = True\\n\\n def getEffectiveLevel(self):\\n logger = self\\n while logger:\\n if logger.level:\\n return logger.level\\n logger = logger.parent\\n return NOTSET\\n\\n def isEnabledFor(self, level):\\n if self.disabled:\\n return False\\n\\n try:\\n return self._cache[level]\\n except KeyError:\\n if self.manager.disable >= level:\\n is_enabled = self._cache[level] = False\\n else:\\n is_enabled = self._cache[level] = level >= self.getEffectiveLevel()\\n return is_enabled\\n\\n def getChild(self, suffix):\\n if self.root is not self:\\n suffix = \\\".\\\".join((self.name, suffix))\\n return self.manager.getLogger(suffix)\\n\\n\\n def getChildren(self):\\n\\n def _hierlevel(logger):\\n if logger is logger.manager.root:\\n return 0\\n return 1 + logger.name.count('.')\\n\\n d = self.manager.loggerDict\\n return set(item for item in d.values()\\n if isinstance(item, Logger) and item.parent is self and\\n _hierlevel(item) == 1 + _hierlevel(item.parent))\\n\\n def __repr__(self):\\n level = getLevelName(self.getEffectiveLevel())\\n return \\\"<%s %s (%s)>\\\" % (self.__class__.__name__, self.name, level)\\n\\n\\nclass RootLogger(Logger):\\n def __init__(self, level):\\n Logger.__init__(self, \\\"root\\\", level)\\n\\n\\n_loggerClass = Logger\\n\\n\\nclass LoggerAdapter(object):\\n def __init__(self, logger, extra=None):\\n self.logger = logger\\n self.extra = extra\\n\\n def process(self, msg, kwargs):\\n kwargs[\\\"extra\\\"] = self.extra\\n return msg, kwargs\\n\\n def debug(self, msg, *args, **kwargs):\\n self.log(DEBUG, msg, *args, **kwargs)\\n\\n def info(self, msg, *args, **kwargs):\\n self.log(INFO, msg, *args, **kwargs)\\n\\n def warning(self, msg, *args, **kwargs):\\n self.log(WARNING, msg, *args, **kwargs)\\n\\n def error(self, msg, *args, **kwargs):\\n self.log(ERROR, msg, *args, **kwargs)\\n\\n def exception(self, msg, *args, exc_info=True, **kwargs):\\n self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)\\n\\n def critical(self, msg, *args, **kwargs):\\n self.log(CRITICAL, msg, *args, **kwargs)\\n\\n def log(self, level, msg, *args, **kwargs):\\n if self.isEnabledFor(level):\\n msg, kwargs = self.process(msg, kwargs)\\n self.logger.log(level, msg, *args, **kwargs)\\n\\n def isEnabledFor(self, level):\\n return self.logger.isEnabledFor(level)\\n\\n def setLevel(self, level):\\n self.logger.setLevel(level)\\n\\n def getEffectiveLevel(self):\\n return self.logger.getEffectiveLevel()\\n\\n def hasHandlers(self):\\n return self.logger.hasHandlers()\\n\\n def _log(self, level, msg, args, **kwargs):\\n return self.logger._log(level, msg, args, **kwargs)\\n\\n @property\\n def manager(self):\\n return self.logger.manager\\n\\n @manager.setter\\n def manager(self, value):\\n self.logger.manager = value\\n\\n @property\\n def name(self):\\n return self.logger.name\\n\\n def __repr__(self):\\n logger = self.logger\\n level = getLevelName(logger.getEffectiveLevel())\\n return \\\"<%s %s (%s)>\\\" % (self.__class__.__name__, logger.name, level)\\n\\n\\nroot = RootLogger(WARNING)\\nLogger.root = root\\nLogger.manager = Manager(Logger.root)\\n\\n# ---------------------------------------------------------------------------\\n# Configuration classes and functions\\n# ---------------------------------------------------------------------------\\n\\n\\ndef basicConfig(**kwargs):\\n force = kwargs.pop(\\\"force\\\", False)\\n encoding = kwargs.pop(\\\"encoding\\\", None)\\n errors = kwargs.pop(\\\"errors\\\", \\\"backslashreplace\\\")\\n if force:\\n for h in root.handlers[:]:\\n root.removeHandler(h)\\n h.close()\\n if len(root.handlers) == 0:\\n handlers = kwargs.pop(\\\"handlers\\\", None)\\n if handlers is None:\\n if \\\"stream\\\" in kwargs and \\\"filename\\\" in kwargs:\\n raise ValueError(\\n \\\"'stream' and 'filename' should not be \\\" \\\"specified together\\\"\\n )\\n else:\\n if \\\"stream\\\" in kwargs or \\\"filename\\\" in kwargs:\\n raise ValueError(\\n \\\"'stream' or 'filename' should not be \\\"\\n \\\"specified together with 'handlers'\\\"\\n )\\n if handlers is None:\\n filename = kwargs.pop(\\\"filename\\\", None)\\n mode = kwargs.pop(\\\"filemode\\\", \\\"a\\\")\\n if filename:\\n if \\\"b\\\" in mode:\\n errors = None\\n h = FileHandler(filename, mode, encoding=encoding, errors=errors)\\n else:\\n stream = kwargs.pop(\\\"stream\\\", None)\\n h = StreamHandler(stream)\\n handlers = [h]\\n dfs = kwargs.pop(\\\"datefmt\\\", None)\\n style = kwargs.pop(\\\"style\\\", \\\"%\\\")\\n if style not in _STYLES:\\n raise ValueError(\\\"Style must be one of: %s\\\" % \\\",\\\".join(_STYLES.keys()))\\n fs = kwargs.pop(\\\"format\\\", _STYLES[style][1])\\n fmt = Formatter(fs, dfs, style)\\n for h in handlers:\\n if h.formatter is None:\\n h.setFormatter(fmt)\\n root.addHandler(h)\\n level = kwargs.pop(\\\"level\\\", None)\\n if level is not None:\\n root.setLevel(level)\\n if kwargs:\\n keys = \\\", \\\".join(kwargs.keys())\\n raise ValueError(\\\"Unrecognised argument(s): %s\\\" % keys)\\n\\n\\ndef getLogger(name=None):\\n if not name or isinstance(name, str) and name == root.name:\\n return root\\n return Logger.manager.getLogger(name)\\n\\n\\ndef critical(msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.critical(msg, *args, **kwargs)\\n\\n\\nfatal = critical\\n\\n\\ndef error(msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.error(msg, *args, **kwargs)\\n\\n\\ndef exception(msg, *args, exc_info=True, **kwargs):\\n error(msg, *args, exc_info=exc_info, **kwargs)\\n\\n\\ndef warning(msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.warning(msg, *args, **kwargs)\\n\\n\\ndef info(msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.info(msg, *args, **kwargs)\\n\\n\\ndef debug(msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.debug(msg, *args, **kwargs)\\n\\n\\ndef log(level, msg, *args, **kwargs):\\n if len(root.handlers) == 0:\\n basicConfig()\\n root.log(level, msg, *args, **kwargs)\\n\\n\\ndef disable(level=CRITICAL):\\n root.manager.disable = level\\n root.manager._clear_cache()\\n\\n\\ndef shutdown(handlerList=[]):\\n raise NotImplementedError(\\\"shutdown is not implemented\\\")\\n\\n\\nclass NullHandler(Handler):\\n def handle(self, record):\\n \\\"\\\"\\\"Stub.\\\"\\\"\\\"\\n\\n def emit(self, record):\\n \\\"\\\"\\\"Stub.\\\"\\\"\\\"\\n\\n\\ndef captureWarnings(capture):\\n raise NotImplementedError(\\\"captureWarnings is not implemented\\\")\\n\",\"src/lib/macpath.py\":\"import _sk_fail; _sk_fail._(\\\"macpath\\\")\\n\",\"src/lib/macurl2path.py\":\"import _sk_fail; _sk_fail._(\\\"macurl2path\\\")\\n\",\"src/lib/mailbox.py\":\"import _sk_fail; _sk_fail._(\\\"mailbox\\\")\\n\",\"src/lib/mailcap.py\":\"import _sk_fail; _sk_fail._(\\\"mailcap\\\")\\n\",\"src/lib/markupbase.py\":\"import _sk_fail; _sk_fail._(\\\"markupbase\\\")\\n\",\"src/lib/md5.py\":\"import _sk_fail; _sk_fail._(\\\"md5\\\")\\n\",\"src/lib/mhlib.py\":\"import _sk_fail; _sk_fail._(\\\"mhlib\\\")\\n\",\"src/lib/mimetools.py\":\"import _sk_fail; _sk_fail._(\\\"mimetools\\\")\\n\",\"src/lib/mimetypes.py\":\"import _sk_fail; _sk_fail._(\\\"mimetypes\\\")\\n\",\"src/lib/mimify.py\":\"import _sk_fail; _sk_fail._(\\\"mimify\\\")\\n\",\"src/lib/modulefinder.py\":\"import _sk_fail; _sk_fail._(\\\"modulefinder\\\")\\n\",\"src/lib/multifile.py\":\"import _sk_fail; _sk_fail._(\\\"multifile\\\")\\n\",\"src/lib/multiprocessing/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"multiprocessing\\\")\\n\",\"src/lib/multiprocessing/dummy/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"dummy\\\")\\n\",\"src/lib/mutex.py\":\"import _sk_fail; _sk_fail._(\\\"mutex\\\")\\n\",\"src/lib/netrc.py\":\"import _sk_fail; _sk_fail._(\\\"netrc\\\")\\n\",\"src/lib/new.py\":\"import _sk_fail; _sk_fail._(\\\"new\\\")\\n\",\"src/lib/nntplib.py\":\"import _sk_fail; _sk_fail._(\\\"nntplib\\\")\\n\",\"src/lib/ntpath.py\":\"import _sk_fail; _sk_fail._(\\\"ntpath\\\")\\n\",\"src/lib/nturl2path.py\":\"import _sk_fail; _sk_fail._(\\\"nturl2path\\\")\\n\",\"src/lib/numbers.py\":\"Number = (int, float, complex)\\nIntegral = int\\nComplex = complex\\n\",\"src/lib/opcode.py\":\"import _sk_fail; _sk_fail._(\\\"opcode\\\")\\n\",\"src/lib/optparse.py\":\"import _sk_fail; _sk_fail._(\\\"optparse\\\")\\n\",\"src/lib/os.py\":\"import _sk_fail; _sk_fail._(\\\"os\\\")\\n\",\"src/lib/os2emxpath.py\":\"import _sk_fail; _sk_fail._(\\\"os2emxpath\\\")\\n\",\"src/lib/pdb.py\":\"import _sk_fail; _sk_fail._(\\\"pdb\\\")\\n\",\"src/lib/pickle.py\":\"import _sk_fail; _sk_fail._(\\\"pickle\\\")\\n\",\"src/lib/pickletools.py\":\"import _sk_fail; _sk_fail._(\\\"pickletools\\\")\\n\",\"src/lib/pipes.py\":\"import _sk_fail; _sk_fail._(\\\"pipes\\\")\\n\",\"src/lib/pkgutil.py\":\"import _sk_fail; _sk_fail._(\\\"pkgutil\\\")\\n\",\"src/lib/platform.py\":\"import _sk_fail; _sk_fail._(\\\"platform\\\")\\n\",\"src/lib/plistlib.py\":\"import _sk_fail; _sk_fail._(\\\"plistlib\\\")\\n\",\"src/lib/popen2.py\":\"import _sk_fail; _sk_fail._(\\\"popen2\\\")\\n\",\"src/lib/poplib.py\":\"import _sk_fail; _sk_fail._(\\\"poplib\\\")\\n\",\"src/lib/posixfile.py\":\"import _sk_fail; _sk_fail._(\\\"posixfile\\\")\\n\",\"src/lib/posixpath.py\":\"import _sk_fail; _sk_fail._(\\\"posixpath\\\")\\n\",\"src/lib/pprint.py\":\"import _sk_fail; _sk_fail._(\\\"pprint\\\")\\n\",\"src/lib/profile.py\":\"import _sk_fail; _sk_fail._(\\\"profile\\\")\\n\",\"src/lib/pstats.py\":\"import _sk_fail; _sk_fail._(\\\"pstats\\\")\\n\",\"src/lib/pty.py\":\"import _sk_fail; _sk_fail._(\\\"pty\\\")\\n\",\"src/lib/py_compile.py\":\"import _sk_fail; _sk_fail._(\\\"py_compile\\\")\\n\",\"src/lib/pyclbr.py\":\"import _sk_fail; _sk_fail._(\\\"pyclbr\\\")\\n\",\"src/lib/pydoc.py\":\"import _sk_fail; _sk_fail._(\\\"pydoc\\\")\\n\",\"src/lib/pydoc_topics.py\":\"import _sk_fail; _sk_fail._(\\\"pydoc_topics\\\")\\n\",\"src/lib/pythonds/__init__.py\":\"\",\"src/lib/pythonds/basic/__init__.py\":\"\\n#__all__ = [\\\"stack\\\"]\\n\\n\\nfrom .stack import Stack\\nfrom .queue import Queue\\nfrom .deque import Deque\\n\\n\\n\",\"src/lib/pythonds/basic/deque.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n#\\n# deque.py\\n\\n\\nclass Deque:\\n def __init__(self):\\n self.items = []\\n\\n def isEmpty(self):\\n return self.items == []\\n\\n def addFront(self, item):\\n self.items.append(item)\\n\\n def addRear(self, item):\\n self.items.insert(0, item)\\n\\n def removeFront(self):\\n return self.items.pop()\\n\\n def removeRear(self):\\n return self.items.pop(0)\\n\\n def size(self):\\n return len(self.items)\\n\",\"src/lib/pythonds/basic/queue.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n#\\n# queue.py\\n\\n\\nclass Queue:\\n def __init__(self):\\n self.items = []\\n\\n def isEmpty(self):\\n return self.items == []\\n\\n def enqueue(self, item):\\n self.items.insert(0, item)\\n\\n def dequeue(self):\\n return self.items.pop()\\n\\n def size(self):\\n return len(self.items)\\n\",\"src/lib/pythonds/basic/stack.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n#\\n# stack.py\\n\\n\\nclass Stack:\\n def __init__(self):\\n self.items = []\\n\\n def isEmpty(self):\\n return self.items == []\\n\\n def push(self, item):\\n self.items.append(item)\\n\\n def pop(self):\\n return self.items.pop()\\n\\n def peek(self):\\n return self.items[len(self.items) - 1]\\n\\n def size(self):\\n return len(self.items)\\n\",\"src/lib/pythonds/graphs/__init__.py\":\"\\n\\nfrom .adjGraph import Graph\\nfrom .adjGraph import Vertex\\nfrom .priorityQueue import PriorityQueue\\n\",\"src/lib/pythonds/graphs/adjGraph.py\":\"#\\n# adjGraph\\n#\\n# Created by Brad Miller on 2005-02-24.\\n# Copyright (c) 2005 Brad Miller, David Ranum, Luther College. All rights reserved.\\n#\\n\\nimport sys\\nimport os\\nimport unittest\\n\\nclass Graph:\\n def __init__(self):\\n self.vertices = {}\\n self.numVertices = 0\\n \\n def addVertex(self,key):\\n self.numVertices = self.numVertices + 1\\n newVertex = Vertex(key)\\n self.vertices[key] = newVertex\\n return newVertex\\n \\n def getVertex(self,n):\\n if n in self.vertices:\\n return self.vertices[n]\\n else:\\n return None\\n\\n def __contains__(self,n):\\n return n in self.vertices\\n \\n def addEdge(self,f,t,cost=0):\\n if f not in self.vertices:\\n nv = self.addVertex(f)\\n if t not in self.vertices:\\n nv = self.addVertex(t)\\n self.vertices[f].addNeighbor(self.vertices[t],cost)\\n \\n def getVertices(self):\\n return list(self.vertices.keys())\\n \\n def __iter__(self):\\n return iter(self.vertices.values())\\n \\nclass Vertex:\\n def __init__(self,num):\\n self.id = num\\n self.connectedTo = {}\\n self.color = 'white'\\n self.dist = sys.maxsize\\n self.pred = None\\n self.disc = 0\\n self.fin = 0\\n\\n # def __lt__(self,o):\\n # return self.id < o.id\\n \\n def addNeighbor(self,nbr,weight=0):\\n self.connectedTo[nbr] = weight\\n \\n def setColor(self,color):\\n self.color = color\\n \\n def setDistance(self,d):\\n self.dist = d\\n\\n def setPred(self,p):\\n self.pred = p\\n\\n def setDiscovery(self,dtime):\\n self.disc = dtime\\n \\n def setFinish(self,ftime):\\n self.fin = ftime\\n \\n def getFinish(self):\\n return self.fin\\n \\n def getDiscovery(self):\\n return self.disc\\n \\n def getPred(self):\\n return self.pred\\n \\n def getDistance(self):\\n return self.dist\\n \\n def getColor(self):\\n return self.color\\n \\n def getConnections(self):\\n return self.connectedTo.keys()\\n \\n def getWeight(self,nbr):\\n return self.connectedTo[nbr]\\n \\n def __str__(self):\\n return str(self.id) + \\\":color \\\" + self.color + \\\":disc \\\" + str(self.disc) + \\\":fin \\\" + str(self.fin) + \\\":dist \\\" + str(self.dist) + \\\":pred \\\\n\\\\t[\\\" + str(self.pred)+ \\\"]\\\\n\\\"\\n \\n def getId(self):\\n return self.id\\n\\nclass adjGraphTests(unittest.TestCase):\\n def setUp(self):\\n self.tGraph = Graph()\\n \\n def testMakeGraph(self):\\n gFile = open(\\\"test.dat\\\")\\n for line in gFile:\\n fVertex, tVertex = line.split('|')\\n fVertex = int(fVertex)\\n tVertex = int(tVertex)\\n self.tGraph.addEdge(fVertex,tVertex)\\n for i in self.tGraph:\\n adj = i.getAdj()\\n for k in adj:\\n print(i, k)\\n\\n \\nif __name__ == '__main__':\\n unittest.main()\\n \\n\",\"src/lib/pythonds/graphs/priorityQueue.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n# \\nimport unittest\\n\\n# this implementation of binary heap takes key value pairs,\\n# we will assume that the keys are all comparable\\n\\nclass PriorityQueue:\\n def __init__(self):\\n self.heapArray = [(0,0)]\\n self.currentSize = 0\\n\\n def buildHeap(self,alist):\\n self.currentSize = len(alist)\\n self.heapArray = [(0,0)]\\n for i in alist:\\n self.heapArray.append(i)\\n i = len(alist) // 2 \\n while (i > 0):\\n self.percDown(i)\\n i = i - 1\\n \\n def percDown(self,i):\\n while (i * 2) <= self.currentSize:\\n mc = self.minChild(i)\\n if self.heapArray[i][0] > self.heapArray[mc][0]:\\n tmp = self.heapArray[i]\\n self.heapArray[i] = self.heapArray[mc]\\n self.heapArray[mc] = tmp\\n i = mc\\n \\n def minChild(self,i):\\n if i*2 > self.currentSize:\\n return -1\\n else:\\n if i*2 + 1 > self.currentSize:\\n return i*2\\n else:\\n if self.heapArray[i*2][0] < self.heapArray[i*2+1][0]:\\n return i*2\\n else:\\n return i*2+1\\n\\n def percUp(self,i):\\n while i // 2 > 0:\\n if self.heapArray[i][0] < self.heapArray[i//2][0]:\\n tmp = self.heapArray[i//2]\\n self.heapArray[i//2] = self.heapArray[i]\\n self.heapArray[i] = tmp\\n i = i//2\\n \\n def add(self,k):\\n self.heapArray.append(k)\\n self.currentSize = self.currentSize + 1\\n self.percUp(self.currentSize)\\n\\n def delMin(self):\\n retval = self.heapArray[1][1]\\n self.heapArray[1] = self.heapArray[self.currentSize]\\n self.currentSize = self.currentSize - 1\\n self.heapArray.pop()\\n self.percDown(1)\\n return retval\\n \\n def isEmpty(self):\\n if self.currentSize == 0:\\n return True\\n else:\\n return False\\n\\n def decreaseKey(self,val,amt):\\n # this is a little wierd, but we need to find the heap thing to decrease by\\n # looking at its value\\n done = False\\n i = 1\\n myKey = 0\\n while not done and i <= self.currentSize:\\n if self.heapArray[i][1] == val:\\n done = True\\n myKey = i\\n else:\\n i = i + 1\\n if myKey > 0:\\n self.heapArray[myKey] = (amt,self.heapArray[myKey][1])\\n self.percUp(myKey)\\n \\n def __contains__(self,vtx):\\n for pair in self.heapArray:\\n if pair[1] == vtx:\\n return True\\n return False\\n \\nclass TestBinHeap(unittest.TestCase):\\n def setUp(self):\\n self.theHeap = PriorityQueue()\\n self.theHeap.add((2,'x'))\\n self.theHeap.add((3,'y'))\\n self.theHeap.add((5,'z'))\\n self.theHeap.add((6,'a'))\\n self.theHeap.add((4,'d'))\\n\\n\\n def testInsert(self):\\n assert self.theHeap.currentSize == 5\\n\\n def testDelmin(self):\\n assert self.theHeap.delMin() == 'x'\\n assert self.theHeap.delMin() == 'y'\\n \\n def testDecKey(self):\\n self.theHeap.decreaseKey('d',1)\\n assert self.theHeap.delMin() == 'd'\\n \\nif __name__ == '__main__':\\n unittest.main()\\n\",\"src/lib/pythonds/trees/__init__.py\":\"\\nfrom .binaryTree import BinaryTree\\nfrom .balance import AVLTree\\nfrom .bst import BinarySearchTree\\nfrom .binheap import BinHeap\\n\\n\\n\",\"src/lib/pythonds/trees/balance.py\":\"#!/bin/env python3.1\\n# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005, 2010\\n# \\n\\nfrom .bst import BinarySearchTree, TreeNode\\n\\nclass AVLTree(BinarySearchTree):\\n '''\\n Author: Brad Miller\\n Date: 1/15/2005\\n Description: Imlement a binary search tree with the following interface\\n functions: \\n __contains__(y) <==> y in x\\n __getitem__(y) <==> x[y]\\n __init__()\\n __len__() <==> len(x)\\n __setitem__(k,v) <==> x[k] = v\\n clear()\\n get(k)\\n has_key(k)\\n items() \\n keys() \\n values()\\n put(k,v)\\n '''\\n\\n\\n def _put(self,key,val,currentNode):\\n if key < currentNode.key:\\n if currentNode.hasLeftChild():\\n self._put(key,val,currentNode.leftChild)\\n else:\\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\\n self.updateBalance(currentNode.leftChild)\\n else:\\n if currentNode.hasRightChild():\\n self._put(key,val,currentNode.rightChild)\\n else:\\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\\n self.updateBalance(currentNode.rightChild) \\n\\n def updateBalance(self,node):\\n if node.balanceFactor > 1 or node.balanceFactor < -1:\\n self.rebalance(node)\\n return\\n if node.parent != None:\\n if node.isLeftChild():\\n node.parent.balanceFactor += 1\\n elif node.isRightChild():\\n node.parent.balanceFactor -= 1\\n\\n if node.parent.balanceFactor != 0:\\n self.updateBalance(node.parent)\\n\\n def rebalance(self,node):\\n if node.balanceFactor < 0:\\n if node.rightChild.balanceFactor > 0:\\n # Do an LR Rotation\\n self.rotateRight(node.rightChild)\\n self.rotateLeft(node)\\n else:\\n # single left\\n self.rotateLeft(node)\\n elif node.balanceFactor > 0:\\n if node.leftChild.balanceFactor < 0:\\n # Do an RL Rotation\\n self.rotateLeft(node.leftChild)\\n self.rotateRight(node)\\n else:\\n # single right\\n self.rotateRight(node)\\n\\n def rotateLeft(self,rotRoot):\\n newRoot = rotRoot.rightChild\\n rotRoot.rightChild = newRoot.leftChild\\n if newRoot.leftChild != None:\\n newRoot.leftChild.parent = rotRoot\\n newRoot.parent = rotRoot.parent\\n if rotRoot.isRoot():\\n self.root = newRoot\\n else:\\n if rotRoot.isLeftChild():\\n rotRoot.parent.leftChild = newRoot\\n else:\\n rotRoot.parent.rightChild = newRoot\\n newRoot.leftChild = rotRoot\\n rotRoot.parent = newRoot\\n rotRoot.balanceFactor = rotRoot.balanceFactor + 1 - min(newRoot.balanceFactor, 0)\\n newRoot.balanceFactor = newRoot.balanceFactor + 1 + max(rotRoot.balanceFactor, 0)\\n\\n\\n def rotateRight(self,rotRoot):\\n newRoot = rotRoot.leftChild\\n rotRoot.leftChild = newRoot.rightChild\\n if newRoot.rightChild != None:\\n newRoot.rightChild.parent = rotRoot\\n newRoot.parent = rotRoot.parent\\n if rotRoot.isRoot():\\n self.root = newRoot\\n else:\\n if rotRoot.isRightChild():\\n rotRoot.parent.rightChild = newRoot\\n else:\\n rotRoot.parent.leftChild = newRoot\\n newRoot.rightChild = rotRoot\\n rotRoot.parent = newRoot\\n rotRoot.balanceFactor = rotRoot.balanceFactor - 1 - max(newRoot.balanceFactor, 0)\\n newRoot.balanceFactor = newRoot.balanceFactor - 1 + min(rotRoot.balanceFactor, 0)\\n \\n\",\"src/lib/pythonds/trees/binaryTree.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n# \\n\\nclass BinaryTree:\\n \\\"\\\"\\\"\\n A recursive implementation of Binary Tree\\n Using links and Nodes approach.\\n \\\"\\\"\\\" \\n def __init__(self,rootObj):\\n self.key = rootObj\\n self.leftChild = None\\n self.rightChild = None\\n\\n def insertLeft(self,newNode):\\n if self.leftChild == None:\\n self.leftChild = BinaryTree(newNode)\\n else:\\n t = BinaryTree(newNode)\\n t.left = self.leftChild\\n self.leftChild = t\\n \\n def insertRight(self,newNode):\\n if self.rightChild == None:\\n self.rightChild = BinaryTree(newNode)\\n else:\\n t = BinaryTree(newNode)\\n t.right = self.rightChild\\n self.rightChild = t\\n\\n def isLeaf(self):\\n return ((not self.leftChild) and (not self.rightChild))\\n\\n def getRightChild(self):\\n return self.rightChild\\n\\n def getLeftChild(self):\\n return self.leftChild\\n\\n def setRootVal(self,obj):\\n self.key = obj\\n\\n def getRootVal(self,):\\n return self.key\\n\\n def inorder(self):\\n if self.leftChild:\\n self.leftChild.inorder()\\n print(self.key)\\n if self.rightChild:\\n self.rightChild.inorder()\\n\\n def postorder(self):\\n if self.leftChild:\\n self.leftChild.postorder()\\n if self.rightChild:\\n self.rightChild.postorder()\\n print(self.key)\\n\\n\\n def preorder(self):\\n print(self.key)\\n if self.leftChild:\\n self.leftChild.preorder()\\n if self.rightChild:\\n self.rightChild.preorder()\\n\\n def printexp(self):\\n if self.leftChild:\\n print('(')\\n self.leftChild.printexp()\\n print(self.key)\\n if self.rightChild:\\n self.rightChild.printexp()\\n print(')')\\n\\n def postordereval(self):\\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if self.leftChild:\\n res1 = self.leftChild.postordereval() #// \\\\label{peleft}\\n if self.rightChild:\\n res2 = self.rightChild.postordereval() #// \\\\label{peright}\\n if res1 and res2:\\n return opers[self.key](res1,res2) #// \\\\label{peeval}\\n else:\\n return self.key\\n\\ndef inorder(tree):\\n if tree != None:\\n inorder(tree.getLeftChild())\\n print(tree.getRootVal())\\n inorder(tree.getRightChild())\\n\\ndef printexp(tree):\\n if tree.leftChild:\\n print('(')\\n printexp(tree.getLeftChild())\\n print(tree.getRootVal())\\n if tree.rightChild:\\n printexp(tree.getRightChild())\\n print(')') \\n\\ndef printexp(tree):\\n sVal = \\\"\\\"\\n if tree:\\n sVal = '(' + printexp(tree.getLeftChild())\\n sVal = sVal + str(tree.getRootVal())\\n sVal = sVal + printexp(tree.getRightChild()) + ')'\\n return sVal\\n\\ndef postordereval(tree):\\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if tree:\\n res1 = postordereval(tree.getLeftChild()) #// \\\\label{peleft}\\n res2 = postordereval(tree.getRightChild()) #// \\\\label{peright}\\n if res1 and res2:\\n return opers[tree.getRootVal()](res1,res2) #// \\\\label{peeval}\\n else:\\n return tree.getRootVal()\\n\\ndef height(tree):\\n if tree == None:\\n return -1\\n else:\\n return 1 + max(height(tree.leftChild),height(tree.rightChild))\\n\\n# t = BinaryTree(7)\\n# t.insertLeft(3)\\n# t.insertRight(9)\\n# inorder(t)\\n# import operator\\n# x = BinaryTree('*')\\n# x.insertLeft('+')\\n# l = x.getLeftChild()\\n# l.insertLeft(4)\\n# l.insertRight(5)\\n# x.insertRight(7)\\n# print(printexp(x))\\n# print(postordereval(x))\\n# print(height(x))\\n\",\"src/lib/pythonds/trees/binheap.py\":\"# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005\\n# \\n\\n# this heap takes key value pairs, we will assume that the keys are integers\\nclass BinHeap:\\n def __init__(self):\\n self.heapList = [0]\\n self.currentSize = 0\\n\\n\\n def buildHeap(self,alist):\\n i = len(alist) // 2\\n self.currentSize = len(alist)\\n self.heapList = [0] + alist[:]\\n print(len(self.heapList), i)\\n while (i > 0):\\n print(self.heapList, i)\\n self.percDown(i)\\n i = i - 1\\n print(self.heapList,i)\\n \\n def percDown(self,i):\\n while (i * 2) <= self.currentSize:\\n mc = self.minChild(i)\\n if self.heapList[i] > self.heapList[mc]:\\n tmp = self.heapList[i]\\n self.heapList[i] = self.heapList[mc]\\n self.heapList[mc] = tmp\\n i = mc\\n \\n def minChild(self,i):\\n if i * 2 + 1 > self.currentSize:\\n return i * 2\\n else:\\n if self.heapList[i * 2] < self.heapList[i * 2 + 1]:\\n return i * 2\\n else:\\n return i * 2 + 1\\n\\n def percUp(self,i):\\n while i // 2 > 0:\\n if self.heapList[i] < self.heapList[i//2]:\\n tmp = self.heapList[i // 2]\\n self.heapList[i // 2] = self.heapList[i]\\n self.heapList[i] = tmp\\n i = i // 2\\n \\n def insert(self,k):\\n self.heapList.append(k)\\n self.currentSize = self.currentSize + 1\\n self.percUp(self.currentSize)\\n\\n def delMin(self):\\n retval = self.heapList[1]\\n self.heapList[1] = self.heapList[self.currentSize]\\n self.currentSize = self.currentSize - 1\\n self.heapList.pop()\\n self.percDown(1)\\n return retval\\n \\n def isEmpty(self):\\n if currentSize == 0:\\n return True\\n else:\\n return False\\n\",\"src/lib/pythonds/trees/bst.py\":\"#!/bin/env python3.1\\n# Bradley N. Miller, David L. Ranum\\n# Introduction to Data Structures and Algorithms in Python\\n# Copyright 2005, 2010\\n# \\n\\nclass BinarySearchTree:\\n '''\\n Author: Brad Miller\\n Date: 1/15/2005\\n Description: Imlement a binary search tree with the following interface\\n functions: \\n __contains__(y) <==> y in x\\n __getitem__(y) <==> x[y]\\n __init__()\\n __len__() <==> len(x)\\n __setitem__(k,v) <==> x[k] = v\\n clear()\\n get(k)\\n items() \\n keys() \\n values()\\n put(k,v)\\n in\\n del <==> \\n '''\\n\\n def __init__(self):\\n self.root = None\\n self.size = 0\\n \\n def put(self,key,val):\\n if self.root:\\n self._put(key,val,self.root)\\n else:\\n self.root = TreeNode(key,val)\\n self.size = self.size + 1\\n\\n def _put(self,key,val,currentNode):\\n if key < currentNode.key:\\n if currentNode.hasLeftChild():\\n self._put(key,val,currentNode.leftChild)\\n else:\\n currentNode.leftChild = TreeNode(key,val,parent=currentNode)\\n else:\\n if currentNode.hasRightChild():\\n self._put(key,val,currentNode.rightChild)\\n else:\\n currentNode.rightChild = TreeNode(key,val,parent=currentNode)\\n \\n def __setitem__(self,k,v):\\n self.put(k,v)\\n\\n def get(self,key):\\n if self.root:\\n res = self._get(key,self.root)\\n if res:\\n return res.payload\\n else:\\n return None\\n else:\\n return None\\n \\n def _get(self,key,currentNode):\\n if not currentNode:\\n return None\\n elif currentNode.key == key:\\n return currentNode\\n elif key < currentNode.key:\\n return self._get(key,currentNode.leftChild)\\n else:\\n return self._get(key,currentNode.rightChild)\\n \\n \\n def __getitem__(self,key):\\n res = self.get(key)\\n if res:\\n return res\\n else:\\n raise KeyError('Error, key not in tree')\\n \\n\\n def __contains__(self,key):\\n if self._get(key,self.root):\\n return True\\n else:\\n return False\\n \\n def length(self):\\n return self.size\\n\\n def __len__(self):\\n return self.size\\n\\n def __iter__(self):\\n return self.root.__iter__()\\n \\n def delete(self,key):\\n if self.size > 1:\\n nodeToRemove = self._get(key,self.root)\\n if nodeToRemove:\\n self.remove(nodeToRemove)\\n self.size = self.size-1\\n else:\\n raise KeyError('Error, key not in tree')\\n elif self.size == 1 and self.root.key == key:\\n self.root = None\\n self.size = self.size - 1\\n else:\\n raise KeyError('Error, key not in tree')\\n\\n def __delitem__(self,key):\\n self.delete(key)\\n \\n def remove(self,currentNode):\\n if currentNode.isLeaf(): #leaf\\n if currentNode == currentNode.parent.leftChild:\\n currentNode.parent.leftChild = None\\n else:\\n currentNode.parent.rightChild = None\\n elif currentNode.hasBothChildren(): #interior\\n succ = currentNode.findSuccessor()\\n succ.spliceOut()\\n currentNode.key = succ.key\\n currentNode.payload = succ.payload\\n else: # this node has one child\\n if currentNode.hasLeftChild():\\n if currentNode.isLeftChild():\\n currentNode.leftChild.parent = currentNode.parent\\n currentNode.parent.leftChild = currentNode.leftChild\\n elif currentNode.isRightChild():\\n currentNode.leftChild.parent = currentNode.parent\\n currentNode.parent.rightChild = currentNode.leftChild\\n else:\\n currentNode.replaceNodeData(currentNode.leftChild.key,\\n currentNode.leftChild.payload,\\n currentNode.leftChild.leftChild,\\n currentNode.leftChild.rightChild)\\n else:\\n if currentNode.isLeftChild():\\n currentNode.rightChild.parent = currentNode.parent\\n currentNode.parent.leftChild = currentNode.rightChild\\n elif currentNode.isRightChild():\\n currentNode.rightChild.parent = currentNode.parent\\n currentNode.parent.rightChild = currentNode.rightChild\\n else:\\n currentNode.replaceNodeData(currentNode.rightChild.key,\\n currentNode.rightChild.payload,\\n currentNode.rightChild.leftChild,\\n currentNode.rightChild.rightChild)\\n\\n def inorder(self):\\n self._inorder(self.root)\\n\\n def _inorder(self,tree):\\n if tree != None:\\n self._inorder(tree.leftChild)\\n print(tree.key)\\n self._inorder(tree.rightChild)\\n\\n def postorder(self):\\n self._postorder(self.root)\\n\\n def _postorder(self, tree):\\n if tree:\\n self._postorder(tree.rightChild)\\n self._postorder(tree.leftChild)\\n print(tree.key) \\n\\n def preorder(self):\\n self._preorder(self,self.root)\\n\\n def _preorder(self,tree):\\n if tree:\\n print(tree.key) \\n self._preorder(tree.leftChild)\\n self._preorder(tree.rightChild)\\n\\n \\nclass TreeNode:\\n def __init__(self,key,val,left=None,right=None,parent=None):\\n self.key = key\\n self.payload = val\\n self.leftChild = left\\n self.rightChild = right\\n self.parent = parent\\n self.balanceFactor = 0\\n \\n def hasLeftChild(self):\\n return self.leftChild\\n\\n def hasRightChild(self):\\n return self.rightChild\\n \\n def isLeftChild(self):\\n return self.parent and self.parent.leftChild == self\\n\\n def isRightChild(self):\\n return self.parent and self.parent.rightChild == self\\n\\n def isRoot(self):\\n return not self.parent\\n\\n def isLeaf(self):\\n return not (self.rightChild or self.leftChild)\\n\\n def hasAnyChildren(self):\\n return self.rightChild or self.leftChild\\n\\n def hasBothChildren(self):\\n return self.rightChild and self.leftChild\\n \\n def replaceNodeData(self,key,value,lc,rc):\\n self.key = key\\n self.payload = value\\n self.leftChild = lc\\n self.rightChild = rc\\n if self.hasLeftChild():\\n self.leftChild.parent = self\\n if self.hasRightChild():\\n self.rightChild.parent = self\\n \\n def findSuccessor(self):\\n succ = None\\n if self.hasRightChild():\\n succ = self.rightChild.findMin()\\n else:\\n if self.parent:\\n if self.isLeftChild():\\n succ = self.parent\\n else:\\n self.parent.rightChild = None\\n succ = self.parent.findSuccessor()\\n self.parent.rightChild = self\\n return succ\\n\\n\\n def spliceOut(self):\\n if self.isLeaf():\\n if self.isLeftChild():\\n self.parent.leftChild = None\\n else:\\n self.parent.rightChild = None\\n elif self.hasAnyChildren():\\n if self.hasLeftChild():\\n if self.isLeftChild():\\n self.parent.leftChild = self.leftChild\\n else:\\n self.parent.rightChild = self.leftChild\\n self.leftChild.parent = self.parent\\n else:\\n if self.isLeftChild():\\n self.parent.leftChild = self.rightChild\\n else:\\n self.parent.rightChild = self.rightChild\\n self.rightChild.parent = self.parent\\n\\n def findMin(self):\\n current = self\\n while current.hasLeftChild():\\n current = current.leftChild\\n return current\\n\\n def __iter__(self):\\n \\\"\\\"\\\"The standard inorder traversal of a binary tree.\\\"\\\"\\\"\\n if self:\\n if self.hasLeftChild():\\n for elem in self.leftChild:\\n yield elem\\n yield self.key\\n if self.hasRightChild():\\n for elem in self.rightChild:\\n yield elem\\n\\n \\n\",\"src/lib/pythonds3/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3 import statement\\n\\\"\\\"\\\"\\n\\nfrom pythonds3.basic import Stack, Queue, Deque\\nfrom pythonds3.graphs import Graph, Vertex\\nfrom pythonds3.searching import HashTable\\nfrom pythonds3.trees import (\\n BinaryTree,\\n AVLTree,\\n BinarySearchTree,\\n BinaryHeap,\\n PriorityQueue,\\n)\\n\\n__all__ = [\\n \\\"Stack\\\",\\n \\\"Queue\\\",\\n \\\"Deque\\\",\\n \\\"Graph\\\",\\n \\\"Vertex\\\",\\n \\\"HashTable\\\",\\n \\\"BinaryTree\\\",\\n \\\"AVLTree\\\",\\n \\\"BinarySearchTree\\\",\\n \\\"BinaryHeap\\\",\\n \\\"BinaryTree\\\",\\n \\\"PriorityQueue\\\",\\n]\\n\",\"src/lib/pythonds3/basic/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.basic import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.basic.stack import Stack\\nfrom pythonds3.basic.queue import Queue\\nfrom pythonds3.basic.deque import Deque\\nfrom pythonds3.basic.linked_list import OrderedList\\nfrom pythonds3.basic.linked_list import UnorderedList\\n\\n__all__ = [\\\"Stack\\\", \\\"Queue\\\", \\\"Deque\\\", \\\"OrderedList\\\", \\\"UnorderedList\\\"]\\n\",\"src/lib/pythonds3/basic/deque.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass Deque:\\n \\\"\\\"\\\"Queue implementation as a list\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create new deque\\\"\\\"\\\"\\n self._items = []\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Check if the deque is empty\\\"\\\"\\\"\\n return not bool(self._items)\\n\\n def add_front(self, item):\\n \\\"\\\"\\\"Add an item to the front of the deque\\\"\\\"\\\"\\n self._items.append(item)\\n\\n def add_rear(self, item):\\n \\\"\\\"\\\"Add an item to the rear of the deque\\\"\\\"\\\"\\n self._items.insert(0, item)\\n\\n def remove_front(self):\\n \\\"\\\"\\\"Remove an item from the front of the deque\\\"\\\"\\\"\\n return self._items.pop()\\n\\n def remove_rear(self):\\n \\\"\\\"\\\"Remove an item from the rear of the deque\\\"\\\"\\\"\\n return self._items.pop(0)\\n\\n def size(self):\\n \\\"\\\"\\\"Get the number of items in the deque\\\"\\\"\\\"\\n return len(self._items)\\n\",\"src/lib/pythonds3/basic/linked_list.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass LinkedListNode:\\n \\\"\\\"\\\"A node of a linked list\\\"\\\"\\\"\\n\\n def __init__(self, node_data):\\n self._data = node_data\\n self._next = None\\n\\n def get_data(self):\\n \\\"\\\"\\\"Get node data\\\"\\\"\\\"\\n return self._data\\n\\n def set_data(self, node_data):\\n \\\"\\\"\\\"Set node data\\\"\\\"\\\"\\n self._data = node_data\\n\\n data = property(get_data, set_data)\\n\\n def get_next(self):\\n \\\"\\\"\\\"Get next node\\\"\\\"\\\"\\n return self._next\\n\\n def set_next(self, node_next):\\n \\\"\\\"\\\"Set next node\\\"\\\"\\\"\\n self._next = node_next\\n\\n next = property(get_next, set_next)\\n\\n def __str__(self):\\n \\\"\\\"\\\"String\\\"\\\"\\\"\\n return str(self._data)\\n\\n\\nclass LinkedList:\\n \\\"\\\"\\\"Linked List class implementation\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create a linked list\\\"\\\"\\\"\\n self._head = None\\n self._count = 0\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Is the list empty\\\"\\\"\\\"\\n return self._head is None\\n\\n def size(self):\\n \\\"\\\"\\\"Size of the list\\\"\\\"\\\"\\n return self._count\\n\\n def __len__(self):\\n \\\"\\\"\\\"Size of the list\\\"\\\"\\\"\\n return self._count\\n\\n def __str__(self):\\n \\\"\\\"\\\"List as a string\\\"\\\"\\\"\\n list_str = \\\"[\\\"\\n current = self._head\\n\\n while current:\\n list_str += str(current)\\n if current.next:\\n list_str += \\\", \\\"\\n current = current.next\\n list_str += \\\"]\\\"\\n return list_str\\n\\n def add(self, value):\\n \\\"\\\"\\\"Add a new node\\\"\\\"\\\"\\n pass\\n\\n def remove(self, value):\\n \\\"\\\"\\\"Remove a node with a specific value\\\"\\\"\\\"\\n pass\\n\\n def search(self, value):\\n \\\"\\\"\\\"Search for a node with a specific value\\\"\\\"\\\"\\n pass\\n\\n\\nclass UnorderedList(LinkedList):\\n \\\"\\\"\\\"Unordered linked list implementation\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create an unordered linked list\\\"\\\"\\\"\\n LinkedList.__init__(self)\\n\\n def add(self, value):\\n \\\"\\\"\\\"Add a new node\\\"\\\"\\\"\\n new_node = LinkedListNode(value)\\n new_node.set_next(self._head)\\n self._head = new_node\\n self._count = self._count + 1\\n\\n def remove(self, value):\\n \\\"\\\"\\\"Remove a node with a specific value\\\"\\\"\\\"\\n current = self._head\\n prev = None\\n\\n while current:\\n if current.data == value:\\n if prev is None:\\n self._head = current.next\\n else:\\n prev.next = current.next\\n self._count = self._count - 1\\n return\\n prev = current\\n current = current.next\\n raise ValueError(\\\"{} is not in the list\\\".format(value))\\n\\n def search(self, value):\\n \\\"\\\"\\\"Search for a node with a specific value\\\"\\\"\\\"\\n current = self._head\\n\\n while current:\\n if current.data == value:\\n return True\\n current = current.next\\n return False\\n\\n\\nclass OrderedList(LinkedList):\\n \\\"\\\"\\\"Ordered linked list implementation\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create an Ordered linked list\\\"\\\"\\\"\\n LinkedList.__init__(self)\\n\\n def add(self, value):\\n \\\"\\\"\\\"Add a new node\\\"\\\"\\\"\\n current = self._head\\n prev = None\\n new_node = LinkedListNode(value)\\n\\n while current and current.data < value:\\n prev = current\\n current = current.next\\n\\n if prev is None:\\n new_node.next = self._head\\n self._head = new_node\\n else:\\n new_node.next = current\\n prev.next = new_node\\n self._count = self._count + 1\\n\\n def remove(self, value):\\n \\\"\\\"\\\"Remove a node with a specific value\\\"\\\"\\\"\\n # This is an exercise\\n pass\\n\\n def search(self, value):\\n \\\"\\\"\\\"Search for a node with a specific value\\\"\\\"\\\"\\n # This is an exercise\\n pass\\n\",\"src/lib/pythonds3/basic/queue.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass Queue:\\n \\\"\\\"\\\"Queue implementation as a list\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create new queue\\\"\\\"\\\"\\n self._items = []\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Check if the queue is empty\\\"\\\"\\\"\\n return not bool(self._items)\\n\\n def enqueue(self, item):\\n \\\"\\\"\\\"Add an item to the queue\\\"\\\"\\\"\\n self._items.insert(0, item)\\n\\n def dequeue(self):\\n \\\"\\\"\\\"Remove an item from the queue\\\"\\\"\\\"\\n return self._items.pop()\\n\\n def size(self):\\n \\\"\\\"\\\"Get the number of items in the queue\\\"\\\"\\\"\\n return len(self._items)\\n\",\"src/lib/pythonds3/basic/stack.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass Stack:\\n \\\"\\\"\\\"Stack implementation as a list\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create new stack\\\"\\\"\\\"\\n self._items = []\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Check if the stack is empty\\\"\\\"\\\"\\n return not bool(self._items)\\n\\n def push(self, item):\\n \\\"\\\"\\\"Add an item to the stack\\\"\\\"\\\"\\n self._items.append(item)\\n\\n def pop(self):\\n \\\"\\\"\\\"Remove an item from the stack\\\"\\\"\\\"\\n return self._items.pop()\\n\\n def peek(self):\\n \\\"\\\"\\\"Get the value of the top item in the stack\\\"\\\"\\\"\\n return self._items[-1]\\n\\n def size(self):\\n \\\"\\\"\\\"Get the number of items in the stack\\\"\\\"\\\"\\n return len(self._items)\\n\",\"src/lib/pythonds3/graphs/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.graphs import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.graphs.adjacency_graph import Graph\\nfrom pythonds3.graphs.adjacency_graph import Vertex\\n\\n__all__ = [\\\"Graph\\\"]\\n\",\"src/lib/pythonds3/graphs/adjacency_graph.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\nimport heapq\\nimport sys\\n\\n\\nclass Vertex:\\n \\\"\\\"\\\"Graph vertex class\\\"\\\"\\\"\\n\\n def __init__(self, key):\\n \\\"\\\"\\\"Create new vertex\\\"\\\"\\\"\\n self._key = key\\n self._neighbors = {}\\n self._color = \\\"white\\\"\\n self._distance = sys.maxsize\\n self._previous = None\\n self._discovery_time = 0\\n self._closing_time = 0\\n\\n def __lt__(self, other):\\n \\\"\\\"\\\"Less than operator required for heapify\\\"\\\"\\\"\\n return self.key < other.key\\n\\n def get_key(self):\\n \\\"\\\"\\\"Get vertex key\\\"\\\"\\\"\\n return self._key\\n\\n key = property(get_key)\\n\\n def get_neighbor(self, other):\\n \\\"\\\"\\\"Get the distance (edge weight) to an adjacent node (neighbor)\\\"\\\"\\\"\\n return self._neighbors.get(other, None)\\n\\n def set_neighbor(self, other, weight=0):\\n \\\"\\\"\\\"Set the distance (add an edge) to an adjacent node (neighbor)\\\"\\\"\\\"\\n self._neighbors[other] = weight\\n\\n def get_neighbors(self):\\n \\\"\\\"\\\"Get all adjacent nodes (neighbors)\\\"\\\"\\\"\\n return self._neighbors.keys()\\n\\n def get_color(self):\\n \\\"\\\"\\\"Get vertex color\\\"\\\"\\\"\\n return self._color\\n\\n def set_color(self, color):\\n \\\"\\\"\\\"Set vertex color\\\"\\\"\\\"\\n self._color = color\\n\\n color = property(get_color, set_color)\\n\\n def get_distance(self):\\n \\\"\\\"\\\"Get distance\\\"\\\"\\\"\\n return self._distance\\n\\n def set_distance(self, distance):\\n \\\"\\\"\\\"Set distance\\\"\\\"\\\"\\n self._distance = distance\\n\\n distance = property(get_distance, set_distance)\\n\\n def get_previous(self):\\n \\\"\\\"\\\"Get previous\\\"\\\"\\\"\\n return self._previous\\n\\n def set_previous(self, previous):\\n \\\"\\\"\\\"Set previous\\\"\\\"\\\"\\n self._previous = previous\\n\\n previous = property(get_previous, set_previous)\\n\\n def get_discovery_time(self):\\n \\\"\\\"\\\"Get discovery time\\\"\\\"\\\"\\n return self._discovery_time\\n\\n def set_discovery_time(self, discovery_time):\\n \\\"\\\"\\\"Set discovery time\\\"\\\"\\\"\\n self._discovery_time = discovery_time\\n\\n discovery_time = property(get_discovery_time, set_discovery_time)\\n\\n def get_closing_time(self):\\n \\\"\\\"\\\"Get closing time\\\"\\\"\\\"\\n return self._closing_time\\n\\n def set_closing_time(self, closing_time):\\n \\\"\\\"\\\"Set closing time\\\"\\\"\\\"\\n self._closing_time = closing_time\\n\\n closing_time = property(get_closing_time, set_closing_time)\\n\\n def __str__(self):\\n return \\\"{:^8}|{:^8}|{:^8}|{:^8}|{:^8}| {}\\\".format(\\n self._key,\\n self._color,\\n self._distance,\\n self._discovery_time,\\n self._closing_time,\\n self._previous,\\n )\\n\\n\\nclass Graph:\\n \\\"\\\"\\\"Graph as an adjacency matrix\\\"\\\"\\\"\\n\\n def __init__(self):\\n self._vertices = {}\\n self._edges = {}\\n self._time = 0\\n\\n def __iter__(self):\\n \\\"\\\"\\\"Iterator\\\"\\\"\\\"\\n return iter(self._vertices.values())\\n\\n def size(self):\\n \\\"\\\"\\\"Graph's size\\\"\\\"\\\"\\n return len(self._vertices)\\n\\n def __len__(self):\\n \\\"\\\"\\\"Graph's size\\\"\\\"\\\"\\n return len(self._vertices)\\n\\n def __contains__(self, key):\\n \\\"\\\"\\\"in operator override\\\"\\\"\\\"\\n return key in self._vertices\\n\\n def get_vertex(self, key):\\n \\\"\\\"\\\"Find the vertex in the graph named vert_key\\\"\\\"\\\"\\n return self._vertices.get(key, None)\\n\\n def set_vertex(self, key):\\n \\\"\\\"\\\"Add an instance of Vertex to the graph\\\"\\\"\\\"\\n self._vertices[key] = Vertex(key)\\n\\n def add_edge(self, from_vertex, to_vertex, weight=0):\\n \\\"\\\"\\\"Add a weighted and directed edge to the graph\\\"\\\"\\\"\\n if from_vertex not in self._vertices:\\n self.set_vertex(from_vertex)\\n if to_vertex not in self._vertices:\\n self.set_vertex(to_vertex)\\n self._vertices[from_vertex].set_neighbor(self._vertices[to_vertex], weight)\\n self._edges[(from_vertex, to_vertex)] = weight\\n\\n def get_vertices(self):\\n \\\"\\\"\\\"Return the list of all vertices in the graph\\\"\\\"\\\"\\n return self._vertices.keys()\\n\\n def get_edges(self):\\n \\\"\\\"\\\"Return the list of all edges in the graph\\\"\\\"\\\"\\n return self._edges.keys()\\n\\n def reset_distances(self, default_distance=sys.maxsize):\\n \\\"\\\"\\\"Reset distances to test Dijkstra's\\\"\\\"\\\"\\n for vertex in self:\\n vertex.distance = default_distance\\n\\n def bfs(self, start):\\n \\\"\\\"\\\"Breadth First Search\\\"\\\"\\\"\\n start.distance = 0\\n start.previous = None\\n vert_queue = [start]\\n while vert_queue:\\n current_vert = vert_queue.pop(0)\\n for neigh in current_vert.get_neighbors():\\n if neigh.color == \\\"white\\\":\\n neigh.color = \\\"gray\\\"\\n neigh.distance = current_vert.distance + 1\\n neigh.previous = current_vert\\n vert_queue.append(neigh)\\n current_vert.color = \\\"black\\\"\\n\\n def dfs(self):\\n \\\"\\\"\\\"Depth First search\\\"\\\"\\\"\\n for vertex in self:\\n if vertex.color == \\\"white\\\":\\n self.dfs_visit(vertex)\\n\\n def dfs_visit(self, start):\\n \\\"\\\"\\\"DFS helper function\\\"\\\"\\\"\\n start.color = \\\"gray\\\"\\n self._time = self._time + 1\\n start.discovery_time = self._time\\n for next_vertex in start.get_neighbors():\\n if next_vertex.color == \\\"white\\\":\\n next_vertex.set_previous(start)\\n self.dfs_visit(next_vertex)\\n start.color = \\\"black\\\"\\n self._time = self._time + 1\\n start.closing_time = self._time\\n\\n def traverse(self, src, dst):\\n \\\"\\\"\\\"Traverse a graph\\\"\\\"\\\"\\n path = []\\n current = self.get_vertex(dst)\\n while current:\\n path.append(current)\\n current = current.previous\\n print(\\n \\\"Path from {} to {} ({}): {}\\\".format(\\n self.get_vertex(src).key,\\n self.get_vertex(dst).key,\\n self.get_vertex(dst).distance,\\n \\\" \\\".join(vertex.key for vertex in reversed(path)),\\n )\\n )\\n\\n def dijkstra(self, start):\\n \\\"\\\"\\\"Dijkstra's shortest path algorithm\\\"\\\"\\\"\\n start.distance = 0\\n not_yet_visited = [[start.distance, start]]\\n heapq.heapify(not_yet_visited)\\n while not_yet_visited:\\n current_vertex = heapq.heappop(not_yet_visited)[1]\\n for next_vertex in current_vertex.get_neighbors():\\n new_distance = current_vertex.distance + current_vertex.get_neighbor(\\n next_vertex\\n )\\n if new_distance < next_vertex.distance:\\n next_vertex.distance = new_distance\\n next_vertex.previous = current_vertex\\n found = False\\n for vertex in not_yet_visited:\\n if vertex[1].key == next_vertex.key:\\n vertex[0] = next_vertex.distance\\n heapq.heapify(not_yet_visited)\\n found = True\\n if not found:\\n heapq.heappush(\\n not_yet_visited, [next_vertex.distance, next_vertex]\\n )\\n\\n def bellman_ford(self, start):\\n \\\"\\\"\\\"Bellman-Ford shortest path algorithm\\\"\\\"\\\"\\n start.distance = 0\\n for _ in range(len(self._vertices)):\\n for edge in self._edges:\\n if (\\n self.get_vertex(edge[0]).distance + self._edges[edge]\\n < self.get_vertex(edge[1]).distance\\n ):\\n self.get_vertex(edge[1]).distance = (\\n self.get_vertex(edge[0]).distance + self._edges[edge]\\n )\\n self.get_vertex(edge[1]).previous = self.get_vertex(edge[0])\\n for edge in self._edges:\\n if (\\n self.get_vertex(edge[0]).distance + self._edges[edge]\\n < self.get_vertex(edge[1]).distance\\n ):\\n raise ValueError(\\\"Graph contains a negative-weight cycle\\\")\\n\\n def prim(self, start):\\n \\\"\\\"\\\"Prim's spanning tree algorithm\\\"\\\"\\\"\\n start.distance = 0\\n not_in_a_tree = [[vertex.distance, vertex] for vertex in self]\\n heapq.heapify(not_in_a_tree)\\n while not_in_a_tree:\\n current_vertex = heapq.heappop(not_in_a_tree)[1]\\n for next_vertex in current_vertex.get_neighbors():\\n new_distance = current_vertex.get_neighbor(next_vertex)\\n if (\\n any(item[1] == next_vertex for item in not_in_a_tree)\\n and new_distance < next_vertex.distance\\n ):\\n next_vertex.previous = current_vertex\\n next_vertex.distance = new_distance\\n for item in not_in_a_tree:\\n if item[1] == next_vertex:\\n item[0] = new_distance\\n heapq.heapify(not_in_a_tree)\\n break\\n\",\"src/lib/pythonds3/intro/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.intro import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.intro.oop import Fraction\\n\\n__all__ = [\\\"Fraction\\\"]\\n\",\"src/lib/pythonds3/intro/oop.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\ndef gcd(number1, number2):\\n \\\"\\\"\\\"Helper function to simplify fractions\\\"\\\"\\\"\\n if not isinstance(number1, int) or not isinstance(number2, int):\\n raise TypeError(\\\"Numerator and denominator must be integers\\\")\\n while number1 % number2:\\n number1, number2 = number2, number1 % number2\\n return number2\\n\\n\\nclass Fraction:\\n \\\"\\\"\\\"Fraction class\\\"\\\"\\\"\\n\\n def __init__(self, new_numer, new_denom):\\n try:\\n common = gcd(new_numer, new_denom)\\n except TypeError:\\n raise\\n self._numer = new_numer // common\\n self._denom = new_denom // common\\n\\n @property\\n def numer(self):\\n \\\"\\\"\\\"Get numerator\\\"\\\"\\\"\\n return self._numer\\n\\n @numer.setter\\n def set_numer(self, new_numer):\\n \\\"\\\"\\\"Set numerator\\\"\\\"\\\"\\n self._numer = new_numer\\n\\n def get_denom(self):\\n \\\"\\\"\\\"Get deniminator\\\"\\\"\\\"\\n return self._denom\\n\\n def set_denom(self, new_denom):\\n \\\"\\\"\\\"Set deniminator\\\"\\\"\\\"\\n self._denom = new_denom\\n\\n # Another way to create an attribute\\n denom = property(get_denom, set_denom)\\n\\n def __str__(self):\\n \\\"\\\"\\\"Get the string value\\\"\\\"\\\"\\n if self._numer > self._denom:\\n return \\\"{} {}/{}\\\".format(\\n self._numer // self._denom, self._numer % self._denom, self._denom\\n )\\n return \\\"{}/{}\\\".format(self._numer, self._denom)\\n\\n def __repr__(self):\\n \\\"\\\"\\\"Fraction representation\\\"\\\"\\\"\\n return \\\"Fraction({}, {})\\\".format(self._numer, self._denom)\\n\\n def __eq__(self, other):\\n \\\"\\\"\\\"Equality comparison\\\"\\\"\\\"\\n return self._numer * other.denom == other.numer * self._denom\\n\\n def __add__(self, other):\\n \\\"\\\"\\\"Add two fractions\\\"\\\"\\\"\\n new_numer = self._numer * other.denom + self._denom * other.numer\\n new_denom = self._denom * other.denom\\n return Fraction(new_numer, new_denom)\\n\",\"src/lib/pythonds3/searching/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.search import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.searching.hash_table import HashTable\\n\\n__all__ = [\\\"HashTable\\\"]\\n\",\"src/lib/pythonds3/searching/hash_table.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass HashTable:\\n \\\"\\\"\\\"Hash Table implementation\\\"\\\"\\\"\\n\\n def __init__(self, size=16):\\n \\\"\\\"\\\"Create a hash table\\\"\\\"\\\"\\n self._size = size\\n self._slots = [None] * self._size\\n self._data = [None] * self._size\\n\\n def __getitem__(self, key):\\n \\\"\\\"\\\"Magic __get__\\\"\\\"\\\"\\n return self.get(key)\\n\\n def __setitem__(self, key, data):\\n \\\"\\\"\\\"Magic __set__\\\"\\\"\\\"\\n self.put(key, data)\\n\\n def __len__(self):\\n \\\"\\\"\\\"Magic __len__\\\"\\\"\\\"\\n return self._size - self._slots.count(None)\\n\\n def __contains__(self, key):\\n \\\"\\\"\\\"Magin in\\\"\\\"\\\"\\n return key in self._slots\\n\\n def _hash_function(self, key, size):\\n \\\"\\\"\\\"Simple hash function\\\"\\\"\\\"\\n return key % size\\n\\n def _rehash(self, old_hash, size, step=1):\\n \\\"\\\"\\\"Simple rehash function\\\"\\\"\\\"\\n return (old_hash + step) % size\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Check if the table is empty\\\"\\\"\\\"\\n return self._size == self._slots.count(None)\\n\\n def size(self):\\n \\\"\\\"\\\"Get number of items in the table\\\"\\\"\\\"\\n return self._size - self._slots.count(None)\\n\\n def put(self, key, data):\\n \\\"\\\"\\\"Add an item to the table\\\"\\\"\\\"\\n hash_value = self._hash_function(key, len(self._slots))\\n\\n if self._slots[hash_value] is None:\\n self._slots[hash_value] = key\\n self._data[hash_value] = data\\n else:\\n if self._slots[hash_value] == key:\\n self._data[hash_value] = data # replace\\n else:\\n j = 0\\n next_slot = self._rehash(hash_value, len(self._slots), j)\\n while (\\n self._slots[next_slot] is not None\\n and self._slots[next_slot] != key\\n and j < self._size\\n ):\\n j = j + 1\\n next_slot = self._rehash(hash_value, len(self._slots), j)\\n\\n if self._slots[next_slot] is None:\\n self._slots[next_slot] = key\\n self._data[next_slot] = data\\n elif j == self._size:\\n raise Exception(\\\"Hash Table is full\\\")\\n else:\\n self._data[next_slot] = data # replace\\n\\n def get(self, key):\\n \\\"\\\"\\\"Get an item from the table\\\"\\\"\\\"\\n start_slot = self._hash_function(key, len(self._slots))\\n position = start_slot\\n j = 0\\n\\n while self._slots[position] is not None and j < self._size:\\n if self._slots[position] == key:\\n return self._data[position]\\n j = j + 1\\n position = self._rehash(start_slot, len(self._slots), j)\\n\\n raise KeyError(\\\"{} is not in the table\\\".format(key))\\n\",\"src/lib/pythonds3/sorting/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.sorting import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.sorting.sorting_algorithms import bubble_sort\\nfrom pythonds3.sorting.sorting_algorithms import select_sort\\nfrom pythonds3.sorting.sorting_algorithms import insert_sort\\nfrom pythonds3.sorting.sorting_algorithms import shell_sort\\nfrom pythonds3.sorting.sorting_algorithms import merge_sort\\nfrom pythonds3.sorting.sorting_algorithms import quick_sort\\nfrom pythonds3.sorting.sorting_algorithms import heap_sort\\n\",\"src/lib/pythonds3/sorting/sorting_algorithms.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\nimport heapq\\n\\n\\ndef bubble_sort(lst):\\n \\\"\\\"\\\"Bubble sort\\\"\\\"\\\"\\n for i in range(len(lst) - 1, 0, -1):\\n exchanges = False\\n for j in range(i):\\n if lst[j] > lst[j + 1]:\\n exchanges = True\\n lst[j], lst[j + 1] = lst[j + 1], lst[j]\\n if not exchanges:\\n break\\n\\n\\ndef select_sort(lst):\\n \\\"\\\"\\\"Selection sort\\\"\\\"\\\"\\n for i, item in enumerate(lst):\\n min_idx = len(lst) - 1\\n for j in range(i, len(lst)):\\n if lst[j] < lst[min_idx]:\\n min_idx = j\\n if min_idx != i:\\n lst[min_idx], lst[i] = lst[i], lst[min_idx]\\n\\n\\ndef insert_sort(lst):\\n \\\"\\\"\\\"Insertion sort\\\"\\\"\\\"\\n for i in range(1, len(lst)):\\n cur_val = lst[i]\\n cur_pos = i\\n\\n while cur_pos > 0 and lst[cur_pos - 1] > cur_val:\\n lst[cur_pos] = lst[cur_pos - 1]\\n cur_pos = cur_pos - 1\\n lst[cur_pos] = cur_val\\n\\n\\ndef shell_sort(lst):\\n \\\"\\\"\\\"Shell sort\\\"\\\"\\\"\\n sublist_count = len(lst) // 3\\n while sublist_count > 0:\\n for pos_start in range(sublist_count):\\n _gap_insert_sort(lst, pos_start, sublist_count)\\n sublist_count = sublist_count // 2\\n\\n\\ndef _gap_insert_sort(lst, start, gap):\\n \\\"\\\"\\\"Shell sort helper function\\\"\\\"\\\"\\n for i in range(start + gap, len(lst), gap):\\n cur_val = lst[i]\\n cur_pos = i\\n while cur_pos >= gap and lst[cur_pos - gap] > cur_val:\\n lst[cur_pos] = lst[cur_pos - gap]\\n cur_pos = cur_pos - gap\\n lst[cur_pos] = cur_val\\n\\n\\ndef merge_sort(lst):\\n \\\"\\\"\\\"Merge sort\\\"\\\"\\\"\\n if len(lst) > 1:\\n mid = len(lst) // 2\\n left_half = lst[:mid]\\n right_half = lst[mid:]\\n\\n merge_sort(left_half)\\n merge_sort(right_half)\\n\\n i, j, k = 0, 0, 0\\n while i < len(left_half) and j < len(right_half):\\n if left_half[i] <= right_half[j]:\\n lst[k] = left_half[i]\\n i = i + 1\\n else:\\n lst[k] = right_half[j]\\n j = j + 1\\n k = k + 1\\n\\n while i < len(left_half):\\n lst[k] = left_half[i]\\n i = i + 1\\n k = k + 1\\n\\n while j < len(right_half):\\n lst[k] = right_half[j]\\n j = j + 1\\n k = k + 1\\n\\n\\ndef quick_sort(lst):\\n \\\"\\\"\\\"Quick sort\\\"\\\"\\\"\\n _quick_sort_help(lst, 0, len(lst) - 1)\\n\\n\\ndef _quick_sort_help(lst, mark_l, mark_r):\\n \\\"\\\"\\\"Quick sort helper\\\"\\\"\\\"\\n if mark_l < mark_r:\\n split = _quick_sort_part(lst, mark_l, mark_r)\\n _quick_sort_help(lst, mark_l, split - 1)\\n _quick_sort_help(lst, split + 1, mark_r)\\n\\n\\ndef _quick_sort_part(lst, mark_l, mark_r):\\n \\\"\\\"\\\"Quick sort partition\\\"\\\"\\\"\\n pivot_val = lst[mark_l]\\n mark_l_cur = mark_l + 1\\n mark_r_cur = mark_r\\n done = False\\n\\n while not done:\\n while mark_l_cur <= mark_r_cur and lst[mark_l_cur] <= pivot_val:\\n mark_l_cur = mark_l_cur + 1\\n while mark_l_cur <= mark_r_cur and lst[mark_r_cur] >= pivot_val:\\n mark_r_cur = mark_r_cur - 1\\n if mark_r_cur < mark_l_cur:\\n done = True\\n else:\\n lst[mark_l_cur], lst[mark_r_cur] = lst[mark_r_cur], lst[mark_l_cur]\\n lst[mark_l], lst[mark_r_cur] = lst[mark_r_cur], lst[mark_l]\\n\\n return mark_r_cur\\n\\n\\ndef heap_sort(lst):\\n \\\"\\\"\\\"Heap sort\\\"\\\"\\\"\\n res = []\\n heapq.heapify(lst)\\n while lst:\\n res.append(heapq.heappop(lst))\\n for i in res:\\n lst.append(i)\\n\",\"src/lib/pythonds3/trees/__init__.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\npythonds3.trees import statement\\n\\\"\\\"\\\"\\nfrom pythonds3.trees.avl_tree import AVLTree\\nfrom pythonds3.trees.binary_search_tree import BinarySearchTree\\nfrom pythonds3.trees.binary_heap import BinaryHeap\\nfrom pythonds3.trees.binary_tree import BinaryTree\\nfrom pythonds3.trees.priority_queue import PriorityQueue\\n\\n__all__ = [\\\"BinaryTree\\\", \\\"BinaryHeap\\\", \\\"BinarySearchTree\\\", \\\"AVLTree\\\", \\\"PriorityQueue\\\"]\\n\",\"src/lib/pythonds3/trees/avl_tree.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005, 2010\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\nfrom pythonds3.trees.binary_search_tree import BinarySearchTree\\nfrom pythonds3.trees.binary_search_tree import BinaryTreeNode\\n\\n\\nclass AVLTreeNode(BinaryTreeNode):\\n \\\"\\\"\\\"AVL Tree Node\\\"\\\"\\\"\\n\\n def __init__(self, key, val, balance_factor, left=None, right=None, parent=None):\\n \\\"\\\"\\\"Create an AVL tree node\\\"\\\"\\\"\\n BinaryTreeNode.__init__(self, key, val, left, right, parent)\\n self._balance_factor = balance_factor\\n\\n def get_balance_factor(self):\\n \\\"\\\"\\\"Get the node balance factor\\\"\\\"\\\"\\n return self._balance_factor\\n\\n def set_balance_factor(self, value):\\n \\\"\\\"\\\"Set the node balance factor\\\"\\\"\\\"\\n self._balance_factor = value\\n\\n balance_factor = property(get_balance_factor, set_balance_factor)\\n\\n\\nclass AVLTree(BinarySearchTree):\\n \\\"\\\"\\\"AVL tree implementation\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create a new AVL tree\\\"\\\"\\\"\\n BinarySearchTree.__init__(self)\\n\\n def put(self, key, value):\\n \\\"\\\"\\\"Add new node\\\"\\\"\\\"\\n if self._root:\\n self._put(key, value, self._root)\\n else:\\n self._root = AVLTreeNode(key, value, 0)\\n self._size = self._size + 1\\n\\n def _put(self, key, value, current_node):\\n \\\"\\\"\\\"Add a new node to the tree (helper function)\\\"\\\"\\\"\\n if key < current_node.key:\\n if current_node.get_child_left():\\n self._put(key, value, current_node.child_left)\\n else:\\n current_node.child_left = AVLTreeNode(\\n key, value, 0, parent=current_node\\n )\\n self.update_balance(current_node.child_left)\\n else:\\n if current_node.get_child_right():\\n self._put(key, value, current_node.child_right)\\n else:\\n current_node.child_right = AVLTreeNode(\\n key, value, 0, parent=current_node\\n )\\n self.update_balance(current_node.child_right)\\n\\n def update_balance(self, node):\\n \\\"\\\"\\\"Update the tree balance\\\"\\\"\\\"\\n if node.balance_factor > 1 or node.balance_factor < -1:\\n self.rebalance(node)\\n return\\n if node.parent:\\n if node.is_child_left():\\n node.parent.balance_factor += 1\\n elif node.is_child_right():\\n node.parent.balance_factor -= 1\\n\\n if node.parent.balance_factor != 0:\\n self.update_balance(node.parent)\\n\\n def rebalance(self, node):\\n \\\"\\\"\\\"Rebalance the tree\\\"\\\"\\\"\\n if node.balance_factor < 0:\\n if node.child_right.balance_factor > 0:\\n # Do an LR Rotation\\n self.rotate_right(node.child_right)\\n self.rotate_left(node)\\n else:\\n # single left\\n self.rotate_left(node)\\n elif node.balance_factor > 0:\\n if node.child_left.balance_factor < 0:\\n # Do an RL Rotation\\n self.rotate_left(node.child_left)\\n self.rotate_right(node)\\n else:\\n # single right\\n self.rotate_right(node)\\n\\n def rotate_left(self, rotation_root):\\n \\\"\\\"\\\"Left rotation\\\"\\\"\\\"\\n new_root = rotation_root.child_right\\n rotation_root.child_right = new_root.child_left\\n if new_root.child_left:\\n new_root.child_left.parent = rotation_root\\n new_root.parent = rotation_root.parent\\n if rotation_root.is_root():\\n self._root = new_root\\n else:\\n if rotation_root.is_child_left():\\n rotation_root.parent.child_left = new_root\\n else:\\n rotation_root.parent.child_right = new_root\\n new_root.child_left = rotation_root\\n rotation_root.parent = new_root\\n rotation_root.balance_factor = (\\n rotation_root.balance_factor + 1 - min(new_root.balance_factor, 0)\\n )\\n new_root.balance_factor = (\\n new_root.balance_factor + 1 + max(rotation_root.balance_factor, 0)\\n )\\n\\n def rotate_right(self, rotation_root):\\n \\\"\\\"\\\"Right rotation\\\"\\\"\\\"\\n new_root = rotation_root.child_left\\n rotation_root.child_left = new_root.child_right\\n if new_root.child_right:\\n new_root.child_right.parent = rotation_root\\n new_root.parent = rotation_root.parent\\n if rotation_root.is_root():\\n self._root = new_root\\n else:\\n if rotation_root.is_child_right():\\n rotation_root.parent.child_right = new_root\\n else:\\n rotation_root.parent.child_left = new_root\\n new_root.child_right = rotation_root\\n rotation_root.parent = new_root\\n rotation_root.balance_factor = (\\n rotation_root.balance_factor - 1 - max(new_root.balance_factor, 0)\\n )\\n new_root.balance_factor = (\\n new_root.balance_factor - 1 + min(rotation_root.balance_factor, 0)\\n )\\n\",\"src/lib/pythonds3/trees/binary_heap.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass BinaryHeap:\\n \\\"\\\"\\\"Minimal Binary Heap\\\"\\\"\\\"\\n\\n def __init__(self):\\n \\\"\\\"\\\"Create a heap\\\"\\\"\\\"\\n self._heap = []\\n\\n def _perc_up(self, cur_idx):\\n \\\"\\\"\\\"Move a node up\\\"\\\"\\\"\\n while (cur_idx - 1) // 2 >= 0:\\n parent_idx = (cur_idx - 1) // 2\\n if self._heap[cur_idx] < self._heap[parent_idx]:\\n self._heap[cur_idx], self._heap[parent_idx] = (\\n self._heap[parent_idx],\\n self._heap[cur_idx],\\n )\\n cur_idx = parent_idx\\n\\n def _perc_down(self, cur_idx):\\n \\\"\\\"\\\"Move a node down\\\"\\\"\\\"\\n while 2 * cur_idx + 1 < len(self._heap):\\n min_child_idx = self._get_min_child(cur_idx)\\n if self._heap[cur_idx] > self._heap[min_child_idx]:\\n self._heap[cur_idx], self._heap[min_child_idx] = (\\n self._heap[min_child_idx],\\n self._heap[cur_idx],\\n )\\n else:\\n return\\n cur_idx = min_child_idx\\n\\n def _get_min_child(self, parent_idx):\\n \\\"\\\"\\\"Get a smaller child\\\"\\\"\\\"\\n if 2 * parent_idx + 2 > len(self._heap) - 1:\\n return 2 * parent_idx + 1\\n if self._heap[2 * parent_idx + 1] < self._heap[2 * parent_idx + 2]:\\n return 2 * parent_idx + 1\\n return 2 * parent_idx + 2\\n\\n def heapify(self, not_a_heap, show_details=False):\\n \\\"\\\"\\\"Build a heap from any list\\\"\\\"\\\"\\n self._heap = not_a_heap[:]\\n cur_idx = len(self._heap) // 2 - 1\\n while cur_idx >= 0:\\n self._perc_down(cur_idx)\\n cur_idx = cur_idx - 1\\n if show_details:\\n print(self._heap)\\n\\n def insert(self, item):\\n \\\"\\\"\\\"Add a new item\\\"\\\"\\\"\\n self._heap.append(item)\\n self._perc_up(len(self._heap) - 1)\\n\\n def delete(self):\\n \\\"\\\"\\\"Remove an item\\\"\\\"\\\"\\n self._heap[0], self._heap[-1] = self._heap[-1], self._heap[0]\\n result = self._heap.pop()\\n self._perc_down(0)\\n return result\\n\\n def is_empty(self):\\n \\\"\\\"\\\"Check if the heap is empty\\\"\\\"\\\"\\n return not bool(self._heap)\\n\\n def __len__(self):\\n \\\"\\\"\\\"Get heap size\\\"\\\"\\\"\\n return len(self._heap)\\n\\n def __str__(self):\\n \\\"\\\"\\\"Heap as a string\\\"\\\"\\\"\\n return str(self._heap)\\n\\n def __contains__(self, item):\\n \\\"\\\"\\\"__contains__in method override\\\"\\\"\\\"\\n return item in self._heap\\n\",\"src/lib/pythonds3/trees/binary_search_tree.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005, 2010\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\n\\nclass BinaryTreeNode:\\n \\\"\\\"\\\"Binary Tree Node class\\\"\\\"\\\"\\n\\n def __init__(self, key, value, left=None, right=None, parent=None):\\n \\\"\\\"\\\"Create new Tree Node\\\"\\\"\\\"\\n self._key = key\\n self._value = value\\n self._child_left = left\\n self._child_right = right\\n self._parent = parent\\n\\n def get_child_left(self):\\n \\\"\\\"\\\"Return the node's left child\\\"\\\"\\\"\\n return self._child_left\\n\\n def set_child_left(self, node):\\n \\\"\\\"\\\"Assign the node's left child\\\"\\\"\\\"\\n self._child_left = node\\n\\n child_left = property(get_child_left, set_child_left)\\n\\n def get_child_right(self):\\n \\\"\\\"\\\"Return the node's right child\\\"\\\"\\\"\\n return self._child_right\\n\\n def set_child_right(self, node):\\n \\\"\\\"\\\"Assign the node's right child\\\"\\\"\\\"\\n self._child_right = node\\n\\n child_right = property(get_child_right, set_child_right)\\n\\n def get_parent(self):\\n \\\"\\\"\\\"Return the node's parent\\\"\\\"\\\"\\n return self._parent\\n\\n def set_parent(self, node):\\n \\\"\\\"\\\"Assign the node's parent\\\"\\\"\\\"\\n self._parent = node\\n\\n parent = property(get_parent, set_parent)\\n\\n def is_child_left(self):\\n \\\"\\\"\\\"Check if the node is a left child\\\"\\\"\\\"\\n return self._parent and self._parent.child_left == self\\n\\n def is_child_right(self):\\n \\\"\\\"\\\"Check if the node is a right child\\\"\\\"\\\"\\n return self._parent and self._parent.child_right == self\\n\\n def is_root(self):\\n \\\"\\\"\\\"Check if the node is a tree root\\\"\\\"\\\"\\n return not self._parent\\n\\n def is_leaf(self):\\n \\\"\\\"\\\"Check if the node is a leaf\\\"\\\"\\\"\\n return not (self._child_right or self._child_left)\\n\\n def has_a_child(self):\\n \\\"\\\"\\\"Check if the node has any child\\\"\\\"\\\"\\n return self._child_right or self._child_left\\n\\n def has_children(self):\\n \\\"\\\"\\\"Check if the node has both children\\\"\\\"\\\"\\n return self._child_right and self._child_left\\n\\n def get_key(self):\\n \\\"\\\"\\\"Get node key\\\"\\\"\\\"\\n return self._key\\n\\n def set_key(self, key):\\n \\\"\\\"\\\"Set node key\\\"\\\"\\\"\\n self._key = key\\n\\n key = property(get_key, set_key)\\n\\n def get_value(self):\\n \\\"\\\"\\\"Get node value\\\"\\\"\\\"\\n return self._value\\n\\n def set_value(self, value):\\n \\\"\\\"\\\"Set node value\\\"\\\"\\\"\\n self._value = value\\n\\n value = property(get_value, set_value)\\n\\n def replace_payload(self, key, value, left, right):\\n \\\"\\\"\\\"Change node payload\\\"\\\"\\\"\\n self._key = key\\n self._value = value\\n self._child_left = left\\n self._child_right = right\\n if self.child_left:\\n self._child_left.parent = self\\n if self.child_right:\\n self._child_right.parent = self\\n\\n def find_successor(self):\\n \\\"\\\"\\\"Find the node's successor\\\"\\\"\\\"\\n successor = None\\n if self._child_right:\\n successor = self._child_right.find_min()\\n else:\\n if self._parent:\\n if self.is_child_left():\\n successor = self._parent\\n else:\\n self._parent.child_right = None\\n successor = self._parent.find_successor()\\n self._parent.child_right = self\\n return successor\\n\\n def find_min(self):\\n \\\"\\\"\\\"Find the smallest node in the right subtree\\\"\\\"\\\"\\n current = self\\n while current.child_left:\\n current = current.child_left\\n return current\\n\\n def splice_out(self):\\n \\\"\\\"\\\"Splice out\\\"\\\"\\\"\\n if self.is_leaf():\\n if self.is_child_left():\\n self._parent.child_left = None\\n else:\\n self._parent.child_right = None\\n elif self.has_a_child():\\n if self.child_left:\\n if self.is_child_left():\\n self._parent.child_left = self._child_left\\n else:\\n self._parent.child_right = self._child_left\\n self._child_left.parent = self._parent\\n else:\\n if self.is_child_left():\\n self._parent.child_left = self._child_right\\n else:\\n self._parent.child_right = self._child_right\\n self._child_right.parent = self._parent\\n\\n def __iter__(self):\\n \\\"\\\"\\\"The standard inorder traversal of a binary tree\\\"\\\"\\\"\\n if self:\\n if self._child_left:\\n for elem in self._child_left:\\n yield elem\\n yield self._key\\n if self._child_right:\\n for elem in self._child_right:\\n yield elem\\n\\n\\nclass BinarySearchTree:\\n \\\"\\\"\\\"Binary search tree implementation\\\"\\\"\\\"\\n\\n def __init__(self):\\n self._root = None\\n self._size = 0\\n\\n def __len__(self):\\n \\\"\\\"\\\"Tree size\\\"\\\"\\\"\\n return self._size\\n\\n def size(self):\\n \\\"\\\"\\\"Tree size\\\"\\\"\\\"\\n return self._size\\n\\n def __iter__(self):\\n \\\"\\\"\\\"Iterator\\\"\\\"\\\"\\n return self._root.__iter__()\\n\\n def __getitem__(self, key):\\n \\\"\\\"\\\"[] getter operator override\\\"\\\"\\\"\\n result = self.get(key)\\n if result:\\n return result\\n raise KeyError(\\\"Error, key not in tree\\\")\\n\\n def get_root(self):\\n \\\"\\\"\\\"Get tree root\\\"\\\"\\\"\\n return self._root\\n\\n def set_root(self, node):\\n \\\"\\\"\\\"Set tree root\\\"\\\"\\\"\\n self._root = node\\n\\n root = property(get_root, set_root)\\n\\n def get(self, key):\\n \\\"\\\"\\\"Retrieve a value by the key\\\"\\\"\\\"\\n if self._root:\\n result = self._get(key, self._root)\\n if result:\\n return result.value\\n return None\\n else:\\n return None\\n\\n def _get(self, key, current_node):\\n \\\"\\\"\\\"Retrieve a value by the key (helper function)\\\"\\\"\\\"\\n if not current_node:\\n return None\\n if current_node.key == key:\\n return current_node\\n elif key < current_node.key:\\n return self._get(key, current_node.child_left)\\n else:\\n return self._get(key, current_node.child_right)\\n\\n def __setitem__(self, key, value):\\n \\\"\\\"\\\"[] setter operator override\\\"\\\"\\\"\\n self.put(key, value)\\n\\n def put(self, key, value):\\n \\\"\\\"\\\"Add new node\\\"\\\"\\\"\\n if self._root:\\n self._put(key, value, self._root)\\n else:\\n self._root = BinaryTreeNode(key, value)\\n self._size = self._size + 1\\n\\n def _put(self, key, value, current_node):\\n \\\"\\\"\\\"Add new node (helper function)\\\"\\\"\\\"\\n if key < current_node.key:\\n if current_node.child_left:\\n self._put(key, value, current_node.child_left)\\n else:\\n current_node.child_left = BinaryTreeNode(\\n key, value, parent=current_node\\n )\\n else:\\n if current_node.child_right:\\n self._put(key, value, current_node.child_right)\\n else:\\n current_node.child_right = BinaryTreeNode(\\n key, value, parent=current_node\\n )\\n\\n def __contains__(self, key):\\n \\\"\\\"\\\"in operator override\\\"\\\"\\\"\\n return bool(self._get(key, self._root))\\n\\n def __delitem__(self, key):\\n \\\"\\\"\\\"del operator override\\\"\\\"\\\"\\n self.delete(key)\\n\\n def delete(self, key):\\n \\\"\\\"\\\"Remove a node by its key\\\"\\\"\\\"\\n if self._size > 1:\\n node_to_remove = self._get(key, self._root)\\n if node_to_remove:\\n self._delete(node_to_remove)\\n self._size = self._size - 1\\n else:\\n raise KeyError(\\\"Error, key not in tree\\\")\\n elif self._size == 1 and self._root.key == key:\\n self._root = None\\n self._size = self._size - 1\\n else:\\n raise KeyError(\\\"Error, key not in tree\\\")\\n\\n def _delete(self, current_node):\\n \\\"\\\"\\\"Remove a node by its key (helper function)\\\"\\\"\\\"\\n if current_node.is_leaf(): # removing a leaf\\n if current_node == current_node.parent.child_left:\\n current_node.parent.child_left = None\\n else:\\n current_node.parent.child_right = None\\n elif current_node.has_children(): # removing a node with two children\\n successor = current_node.find_successor()\\n successor.splice_out()\\n current_node.key = successor.key\\n current_node.value = successor.value\\n else: # removing a node with one child\\n if current_node.get_child_left():\\n if current_node.is_child_left():\\n current_node.child_left.parent = current_node.parent\\n current_node.parent.child_left = current_node.child_left\\n elif current_node.is_child_right():\\n current_node.child_left.parent = current_node.parent\\n current_node.parent.child_right = current_node.child_left\\n else:\\n current_node.replace_payload(\\n current_node.child_left.key,\\n current_node.child_left.value,\\n current_node.child_left.child_left,\\n current_node.child_left.child_right,\\n )\\n else:\\n if current_node.is_child_left():\\n current_node.child_right.parent = current_node.parent\\n current_node.parent.child_left = current_node.child_right\\n elif current_node.is_child_right():\\n current_node.child_right.parent = current_node.parent\\n current_node.parent.child_right = current_node.child_right\\n else:\\n current_node.replace_payload(\\n current_node.child_right.key,\\n current_node.child_right.value,\\n current_node.child_right.child_left,\\n current_node.child_right.child_right,\\n )\\n\\n def inorder(self):\\n \\\"\\\"\\\"In-order tree traversal\\\"\\\"\\\"\\n self._inorder(self._root)\\n\\n def _inorder(self, tree):\\n \\\"\\\"\\\"In-order tree traversal (helper function)\\\"\\\"\\\"\\n if tree:\\n self._inorder(tree.child_left)\\n print(tree.key, end=\\\" \\\")\\n self._inorder(tree.child_right)\\n\\n def postorder(self):\\n \\\"\\\"\\\"Post-order tree traversal\\\"\\\"\\\"\\n self._postorder(self._root)\\n\\n def _postorder(self, tree):\\n \\\"\\\"\\\"Post-order tree traversal (helper function)\\\"\\\"\\\"\\n if tree:\\n self._postorder(tree.child_left)\\n self._postorder(tree.child_right)\\n print(tree.key, end=\\\" \\\")\\n\\n def preorder(self):\\n \\\"\\\"\\\"Pre-order tree traversal\\\"\\\"\\\"\\n self._preorder(self._root)\\n\\n def _preorder(self, tree):\\n \\\"\\\"\\\"Pre-order tree traversal (helper function)\\\"\\\"\\\"\\n if tree:\\n print(tree.key, end=\\\" \\\")\\n self._preorder(tree.child_left)\\n self._preorder(tree.child_right)\\n\\n def clear(self):\\n \\\"\\\"\\\"Remove all nodes\\\"\\\"\\\"\\n while self._root:\\n self.delete(self._root.key)\\n\",\"src/lib/pythonds3/trees/binary_tree.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\nimport operator\\n\\n\\nclass BinaryTree:\\n \\\"\\\"\\\"\\n A recursive implementation of Binary Tree\\n Using links and Nodes approach.\\n\\n Modified to allow for trees to be constructed from other trees\\n rather than always creating a new tree in the insert_feft or insert_right\\n \\\"\\\"\\\"\\n\\n def __init__(self, key):\\n \\\"\\\"\\\"Create new tree\\\"\\\"\\\"\\n self._key = key\\n self._child_left = None\\n self._child_right = None\\n\\n def get_root_val(self):\\n \\\"\\\"\\\"Get root key value\\\"\\\"\\\"\\n return self._key\\n\\n def set_root_val(self, key):\\n \\\"\\\"\\\"Set root key value\\\"\\\"\\\"\\n self._key = key\\n\\n root = property(get_root_val, set_root_val)\\n\\n def get_child_left(self):\\n \\\"\\\"\\\"Get left child\\\"\\\"\\\"\\n return self._child_left\\n\\n def set_child_left(self, node):\\n \\\"\\\"\\\"Set left child\\\"\\\"\\\"\\n self._child_left = node\\n\\n child_left = property(get_child_left, set_child_left)\\n\\n def get_child_right(self):\\n \\\"\\\"\\\"Get right child\\\"\\\"\\\"\\n return self._child_right\\n\\n def set_child_right(self, node):\\n \\\"\\\"\\\"Set right child\\\"\\\"\\\"\\n self._child_right = node\\n\\n child_right = property(get_child_right, set_child_right)\\n\\n def is_leaf(self):\\n \\\"\\\"\\\"Check if a node is leaf\\\"\\\"\\\"\\n return (not self._child_left) and (not self._child_right)\\n\\n def insert_left(self, new_node):\\n \\\"\\\"\\\"Insert left subtree\\\"\\\"\\\"\\n if isinstance(new_node, BinaryTree):\\n new_subtree = new_node\\n else:\\n new_subtree = BinaryTree(new_node)\\n\\n if self._child_left:\\n new_subtree.set_child_left(self._child_left)\\n\\n self._child_left = new_subtree\\n\\n def insert_right(self, new_node):\\n \\\"\\\"\\\"Insert right subtree\\\"\\\"\\\"\\n if isinstance(new_node, BinaryTree):\\n new_subtree = new_node\\n else:\\n new_subtree = BinaryTree(new_node)\\n\\n if self._child_right:\\n new_subtree.set_child_right(self._child_right)\\n self._child_right = new_subtree\\n\\n def preorder(self):\\n \\\"\\\"\\\"Pre-order tree traversal\\\"\\\"\\\"\\n print(self._key, end=\\\" \\\")\\n if self._child_left:\\n self._child_left.preorder()\\n if self._child_right:\\n self._child_right.preorder()\\n\\n def inorder(self):\\n \\\"\\\"\\\"In-order tree traversal\\\"\\\"\\\"\\n if self._child_left:\\n self._child_left.inorder()\\n print(self._key, end=\\\" \\\")\\n if self._child_right:\\n self._child_right.inorder()\\n\\n def postorder(self):\\n \\\"\\\"\\\"Post-order tree traversal\\\"\\\"\\\"\\n if self._child_left:\\n self._child_left.postorder()\\n if self._child_right:\\n self._child_right.postorder()\\n print(self._key, end=\\\" \\\")\\n\\n def print_exp(self):\\n \\\"\\\"\\\"Print an expression\\\"\\\"\\\"\\n if self._child_left:\\n print(\\\"(\\\", end=\\\" \\\")\\n self._child_left.print_exp()\\n print(self._key, end=\\\" \\\")\\n if self._child_right:\\n self._child_right.print_exp()\\n print(\\\")\\\", end=\\\" \\\")\\n\\n def postorder_eval(self):\\n \\\"\\\"\\\"Postorder evaluation\\\"\\\"\\\"\\n operations = {\\n \\\"+\\\": operator.add,\\n \\\"-\\\": operator.sub,\\n \\\"*\\\": operator.mul,\\n \\\"/\\\": operator.truediv,\\n }\\n result_1 = None\\n result_2 = None\\n if self._child_left:\\n result_1 = self._child_left.postorder_eval()\\n if self._child_right:\\n result_2 = self._child_right.postorder_eval()\\n if result_1 and result_2:\\n return operations[self._key](result_1, result_2)\\n return self._key\\n\\n def height(self):\\n \\\"\\\"\\\"Height of a tree\\\"\\\"\\\"\\n if not self._key:\\n return -1\\n if self._child_left:\\n height_left = self._child_left.height()\\n else:\\n height_left = -1\\n\\n if self._child_right:\\n height_right = self._child_right.height()\\n else:\\n height_right = -1\\n\\n return 1 + max(height_left, height_right)\\n\\n def __len__(self):\\n \\\"\\\"\\\"Size of a tree\\\"\\\"\\\"\\n return self.size()\\n\\n def size(self):\\n \\\"\\\"\\\"Count nodes in a tree\\\"\\\"\\\"\\n if not self._key:\\n return 0\\n if self._child_left:\\n children_left = self._child_left.size()\\n else:\\n children_left = 0\\n\\n if self._child_right:\\n children_right = self._child_right.size()\\n else:\\n children_right = 0\\n\\n return 1 + children_left + children_right\\n\",\"src/lib/pythonds3/trees/priority_queue.py\":\"#!/usr/bin/env python3\\n\\\"\\\"\\\"\\nBradley N. Miller, David L. Ranum\\nProblem Solving with Algorithms and Data Structures using Python\\nCopyright 2005\\nUpdated by Roman Yasinovskyy, 2017\\n\\\"\\\"\\\"\\n\\nfrom pythonds3.trees.binary_heap import BinaryHeap\\n\\n\\nclass PriorityQueue(BinaryHeap):\\n \\\"\\\"\\\"\\n This implementation of binary heap takes (key, value) pairs where key signifies priority\\n We will assume that the keys are all comparable.\\n \\\"\\\"\\\"\\n\\n def change_priority(self, new_priority, value):\\n \\\"\\\"\\\"Change the priority\\\"\\\"\\\"\\n key_to_move = 0\\n for i in range(len(self._heap)):\\n if self._heap[i][1] == value:\\n key_to_move = i\\n break\\n if key_to_move > -1:\\n self._heap[key_to_move] = (new_priority, self._heap[key_to_move][1])\\n self._perc_up(key_to_move)\\n\",\"src/lib/pythoned/__init__.py\":\"\",\"src/lib/pythoned/arboles/__init__.py\":\"\\n\\n\\nfrom .avl import ArbolAVL\\nfrom .abb import ArbolBinarioBusqueda\\nfrom .monticuloBinario import MonticuloBinario\\n\\n\\n\",\"src/lib/pythoned/arboles/abb.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n#\\n#abb.py\\n\\nclass ArbolBinarioBusqueda:\\n\\n def __init__(self):\\n self.raiz = None\\n self.tamano = 0\\n\\n def agregar(self,clave,valor):\\n if self.raiz:\\n self._agregar(clave,valor,self.raiz)\\n else:\\n self.raiz = NodoArbol(clave,valor)\\n self.tamano = self.tamano + 1\\n\\n def _agregar(self,clave,valor,nodoActual):\\n if clave < nodoActual.clave:\\n if nodoActual.tieneHijoIzquierdo():\\n self._agregar(clave,valor,nodoActual.hijoIzquierdo)\\n else:\\n nodoActual.hijoIzquierdo = NodoArbol(clave,valor,padre=nodoActual)\\n else:\\n if nodoActual.tieneHijoDerecho():\\n self._agregar(clave,valor,nodoActual.hijoDerecho)\\n else:\\n nodoActual.hijoDerecho = NodoArbol(clave,valor,padre=nodoActual)\\n \\n def __setitem__(self,c,v):\\n self.agregar(c,v)\\n\\n def obtener(self,clave):\\n if self.raiz:\\n res = self._obtener(clave,self.raiz)\\n if res:\\n return res.cargaUtil\\n else:\\n return None\\n else:\\n return None\\n\\n def _obtener(self,clave,nodoActual):\\n \\tif not nodoActual:\\n \\t return None\\n \\telif nodoActual.clave == clave:\\n \\t return nodoActual\\n \\telif clave < nodoActual.clave:\\n \\t return self._obtener(clave,nodoActual.hijoIzquierdo)\\n \\telse:\\n \\t return self._obtener(clave,nodoActual.hijoDerecho) \\n\\n def __getitem__(self,clave):\\n res = self.obtener(clave) \\n if res:\\n return res\\n else:\\n raise KeyError('Error, la clave no está en el árbol')\\n\\n def __contains__(self,clave):\\n \\tif self._obtener(clave,self.raiz):\\n \\t return True\\n \\telse:\\n \\t return False\\n \\n def longitud(self):\\n return self.tamano\\n\\n def __len__(self):\\n return self.tamano\\n\\n def __iter__(self):\\n return self.raiz.__iter__()\\n\\n def eliminar(self,clave):\\n if self.tamano > 1:\\n nodoAEliminar = self._obtener(clave,self.raiz)\\n \\t if nodoAEliminar:\\n \\t self.remover(nodoAEliminar)\\n \\t self.tamano = self.tamano-1\\n \\t else:\\n \\t raise KeyError('Error, la clave no está en el árbol')\\n elif self.tamano == 1 and self.raiz.clave == clave:\\n \\t self.raiz = None\\n \\t self.tamano = self.tamano - 1\\n else:\\n \\t raise KeyError('Error, la clave no está en el árbol')\\n\\n def __delitem__(self,clave):\\n self.eliminar(clave)\\n\\n def remover(self,nodoActual):\\n if nodoActual.esHoja(): #hoja\\n if nodoActual == nodoActual.padre.hijoIzquierdo:\\n nodoActual.padre.hijoIzquierdo = None\\n else:\\n nodoActual.padre.hijoDerecho = None\\n elif nodoActual.tieneAmbosHijos(): #interior\\n suc = nodoActual.encontrarSucesor()\\n suc.empalmar()\\n nodoActual.clave = suc.clave\\n nodoActual.cargaUtil = suc.cargaUtil\\n\\n else: # este nodo tiene un (1) hijo\\n if nodoActual.tieneHijoIzquierdo():\\n if nodoActual.esHijoIzquierdo():\\n nodoActual.hijoIzquierdo.padre = nodoActual.padre\\n nodoActual.padre.hijoIzquierdo = nodoActual.hijoIzquierdo\\n elif nodoActual.esHijoDerecho():\\n nodoActual.hijoIzquierdo.padre = nodoActual.padre\\n nodoActual.padre.hijoDerecho = nodoActual.hijoIzquierdo\\n else:\\n nodoActual.reemplazarDatoDeNodo(nodoActual.hijoIzquierdo.clave, nodoActual.hijoIzquierdo.cargaUtil, nodoActual.hijoIzquierdo.hijoIzquierdo, nodoActual.hijoIzquierdo.hijoDerecho)\\n else:\\n if nodoActual.esHijoIzquierdo():\\n nodoActual.hijoDerecho.padre = nodoActual.padre\\n nodoActual.padre.hijoIzquierdo = nodoActual.hijoDerecho\\n elif nodoActual.esHijoDerecho():\\n nodoActual.hijoDerecho.padre = nodoActual.padre\\n nodoActual.padre.hijoDerecho = nodoActual.hijoDerecho\\n else:\\n nodoActual.reemplazarDatoDeNodo(nodoActual.hijoDerecho.clave, nodoActual.hijoDerecho.cargaUtil, nodoActual.hijoDerecho.hijoIzquierdo, nodoActual.hijoDerecho.hijoDerecho)\\n\\n def inorden(self):\\n self._inorden(self.raiz)\\n\\n def _inorden(self,arbol):\\n if arbol != None:\\n self._inorden(arbol.hijoIzquierdo)\\n print(arbol.clave)\\n self._inorden(arbol.hijoDerecho)\\n\\n def postorden(self):\\n self._postorden(self.raiz)\\n\\n def _postorden(self, arbol):\\n if arbol:\\n self._postorden(arbol.hijoDerecho)\\n self._postorden(arbol.hijoIzquierdo)\\n print(arbol.clave) \\n\\n def preorden(self):\\n self._preorden(self,self.raiz)\\n\\n def _preorden(self,arbol):\\n if arbol:\\n print(arbol.clave) \\n self._preorden(arbol.hijoIzquierdo)\\n self._preorden(arbol.hijoDerecho)\\n\\n\\nclass NodoArbol:\\n def __init__(self,clave,valor,izquierdo=None,derecho=None,padre=None):\\n self.clave = clave\\n self.cargaUtil = valor\\n self.hijoIzquierdo = izquierdo\\n self.hijoDerecho = derecho\\n self.padre = padre\\n self.factorEquilibrio = 0\\n\\n def tieneHijoIzquierdo(self):\\n return self.hijoIzquierdo\\n \\n def tieneHijoDerecho(self):\\n return self.hijoDerecho\\n\\n def esHijoIzquierdo(self):\\n return self.padre and self.padre.hijoIzquierdo == self\\n \\n def esHijoDerecho(self):\\n return self.padre and self.padre.hijoDerecho == self\\n\\n def esRaiz(self):\\n return not self.padre\\n\\n def esHoja(self):\\n return not (self.hijoDerecho or self.hijoIzquierdo)\\n\\n def tieneAlgunHijo(self):\\n return self.hijoDerecho or self.hijoIzquierdo\\n\\n def tieneAmbosHijos(self):\\n return self.hijoDerecho and self.hijoIzquierdo\\n\\n def reemplazarDatoDeNodo(self,clave,valor,hizq,hder):\\n self.clave = clave\\n self.cargaUtil = valor\\n self.hijoIzquierdo = hizq\\n self.hijoDerecho = hder\\n if self.tieneHijoIzquierdo():\\n self.hijoIzquierdo.padre = self\\n if self.tieneHijoDerecho():\\n self.hijoDerecho.padre = self \\n\\n def encontrarSucesor(self):\\n suc = None\\n if self.tieneHijoDerecho():\\n suc = self.hijoDerecho.encontrarMin()\\n else:\\n if self.padre:\\n if self.esHijoIzquierdo():\\n suc = self.padre\\n else:\\n self.padre.hijoDerecho = None\\n suc = self.padre.encontrarSucesor()\\n self.padre.hijoDerecho = self\\n return suc\\n\\n def empalmar(self):\\n if self.esHoja():\\n if self.esHijoIzquierdo():\\n self.padre.hijoIzquierdo = None\\n else:\\n self.padre.hijoDerecho = None\\n elif self.tieneAlgunHijo():\\n if self.tieneHijoIzquierdo():\\n if self.esHijoIzquierdo():\\n self.padre.hijoIzquierdo = self.hijoIzquierdo\\n else:\\n self.padre.hijoDerecho = self.hijoIzquierdo\\n self.hijoIzquierdo.padre = self.padre\\n else:\\n if self.esHijoIzquierdo():\\n self.padre.hijoIzquierdo = self.hijoDerecho\\n else:\\n self.padre.hijoDerecho = self.hijoDerecho\\n self.hijoDerecho.padre = self.padre\\n\\n def encontrarMin(self):\\n actual = self\\n while actual.tieneHijoIzquierdo():\\n actual = actual.hijoIzquierdo\\n return actual\\n\\n def __iter__(self):\\n if self:\\n \\t if self.tieneHijoIzquierdo():\\n \\t for elem in self.hijoIzquierdo:\\n \\t\\t yield elem\\n yield self.clave\\n \\t if self.tieneHijoDerecho():\\n for elem in self.hijoDerecho:\\n \\t\\t yield elem\\n\",\"src/lib/pythoned/arboles/arbolBinario.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n# \\n#arbolBinario.py\\n\\nclass ArbolBinario:\\n def __init__(self,objetoRaiz):\\n self.clave = objetoRaiz\\n self.hijoIzquierdo = None\\n self.hijoDerecho = None\\n \\n def insertarIzquierdo(self,nuevoNodo):\\n if self.hijoIzquierdo == None:\\n self.hijoIzquierdo = ArbolBinario(nuevoNodo)\\n else: \\n t = ArbolBinario(nuevoNodo)\\n t.hijoIzquierdo = self.hijoIzquierdo\\n self.hijoIzquierdo = t\\n\\n def insertarDerecho(self,nuevoNodo):\\n if self.hijoDerecho == None:\\n self.hijoDerecho = ArbolBinario(nuevoNodo)\\n else:\\n t = ArbolBinario(nuevoNodo)\\n t.hijoDerecho = self.hijoDerecho\\n self.hijoDerecho = t\\n\\n def esHoja(self):\\n return ((not self.hijoIzquierdo) and (not self.hijoDerecho))\\n\\n def obtenerHijoDerecho(self):\\n return self.hijoDerecho\\n \\n def obtenerHijoIzquierdo(self):\\n return self.hijoIzquierdo\\n \\n def asignarValorRaiz(self,obj):\\n self.clave = obj\\n\\n def obtenerValorRaiz(self):\\n return self.clave\\n\\n def inorden(self):\\n if self.hijoIzquierdo:\\n self.hijoIzquierdo.inorden()\\n print(self.clave)\\n if self.hijoDerecho:\\n self.hijoDerecho.inorden()\\n\\n def postorden(self):\\n if self.hijoIzquierdo:\\n self.hijoIzquierdo.postorden()\\n if self.hijoDerecho:\\n self.hijoDerecho.postorden()\\n print(self.clave)\\n\\n def preorden(self):\\n print(self.clave)\\n if self.hijoIzquierdo:\\n self.hijoIzquierdo.preorden()\\n if self.hijoDerecho:\\n self.hijoDerecho.preorden()\\n\\n def imprimirExpresion(self):\\n if self.hijoIzquierdo:\\n print('(', end=' ')\\n self.hijoIzquierdo.imprimirExpresion()\\n print(self.clave, end=' ')\\n if self.hijoDerecho:\\n self.hijoDerecho.imprimirExpresion()\\n print(')', end=' ')\\n\\n def evalPostorden(self):\\n opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if self.hijoIzquierdo:\\n res1 = self.hijoIzquierdo.evalPostorden() #// \\\\label{peleft}\\n if self.hijoDerecho:\\n res2 = self.hijoDerecho.evalPostorden() #// \\\\label{peright}\\n if res1 and res2:\\n return opers[self.clave](res1,res2) #// \\\\label{peeval}\\n else:\\n return self.clave\\n\\ndef inorden(arbol):\\n if arbol != None:\\n inorden(arbol.obtenerHijoIzquierdo())\\n print(arbol.obtenerValorRaiz())\\n inorden(arbol.obtenerHijoDerecho())\\n\\ndef imprimirExpresion(arbol):\\n if arbol.hijoIzquierdo:\\n print('(', end=' ')\\n imprimirExpresion(arbol.obtenerHijoIzquierdo())\\n print(arbol.obtenerValorRaiz(), end=' ')\\n if arbol.hijoDerecho:\\n imprimirExpresion(arbol.obtenerHijoDerecho())\\n print(')', end=' ') \\n\\ndef imprimirExpresion(arbol):\\n valorCadena = \\\"\\\"\\n if arbol:\\n valorCadena = '(' + imprimirExpresion(arbol.obtenerHijoIzquierdo())\\n valorCadena = valorCadena + str(arbol.obtenerValorRaiz())\\n valorCadena = valorCadena + imprimirExpresion(arbol.obtenerHijoDerecho())+')'\\n return valorCadena\\n\\ndef evalPostorden(arbol):\\n operadores = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}\\n res1 = None\\n res2 = None\\n if arbol:\\n res1 = evalPostorden(arbol.obtenerHijoIzquierdo()) #// \\\\label{peleft}\\n res2 = evalPostorden(arbol.obtenerHijoDerecho()) #// \\\\label{peright}\\n if res1 and res2:\\n return operadores[arbol.obtenerValorRaiz()](res1,res2) #// \\\\label{peeval}\\n else:\\n return arbol.obtenerValorRaiz()\\n\\ndef altura(arbol):\\n if arbol == None:\\n return -1\\n else:\\n return 1 + max(altura(arbol.hijoIzquierdo),altura(arbol.hijoDerecho))\\n\\nt = ArbolBinario(7)\\nt.insertarIzquierdo(3)\\nt.insertarDerecho(9)\\ninorden(t)\\nimport operator\\nx = ArbolBinario('*')\\nx.insertarIzquierdo('+')\\nl = x.obtenerHijoIzquierdo()\\nl.insertarIzquierdo(4)\\nl.insertarDerecho(5)\\nx.insertarDerecho(7)\\nprint(imprimirExpresion(x))\\nprint(evalPostorden(x))\\nprint(altura(x))\\n\",\"src/lib/pythoned/arboles/avl.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n#\\n#avl.py\\n\\nfrom .abb import ArbolBinarioBusqueda, NodoArbol\\n\\nclass ArbolAVL(ArbolBinarioBusqueda):\\n\\n def _agregar(self,clave,valor,nodoActual):\\n \\tif clave < nodoActual.clave:\\n \\t if nodoActual.tieneHijoIzquierdo():\\n \\t\\tself._agregar(clave,valor,nodoActual.hijoIzquierdo)\\n \\t else:\\n \\t\\tnodoActual.hijoIzquierdo = NodoArbol(clave,valor,padre=nodoActual)\\n \\t\\tself.actualizarEquilibrio(nodoActual.hijoIzquierdo)\\n \\telse:\\n \\t if nodoActual.tieneHijoDerecho():\\n \\t\\tself._agregar(clave,valor,nodoActual.hijoDerecho)\\n \\t else:\\n \\t\\tnodoActual.hijoDerecho = NodoArbol(clave,valor,padre=nodoActual)\\n \\t\\tself.actualizarEquilibrio(nodoActual.hijoDerecho)\\n\\n def actualizarEquilibrio(self,nodo):\\n \\tif nodo.factorEquilibrio > 1 or nodo.factorEquilibrio < -1:\\n \\t self.reequilibrar(nodo) \\n \\t return\\n \\tif nodo.padre != None:\\n \\t if nodo.esHijoIzquierdo():\\n \\t\\t nodo.padre.factorEquilibrio += 1\\n \\t elif nodo.esHijoDerecho():\\n \\t\\t nodo.padre.factorEquilibrio -= 1\\n\\n \\t if nodo.padre.factorEquilibrio != 0:\\n \\t\\t self.actualizarEquilibrio(nodo.padre)\\n\\n def reequilibrar(self,nodo):\\n if nodo.factorEquilibrio < 0:\\n\\t if nodo.hijoDerecho.factorEquilibrio > 0:\\n\\t self.rotarDerecha(nodo.hijoDerecho)\\n\\t self.rotarIzquierda(nodo)\\n\\t else:\\n\\t self.rotarIzquierda(nodo)\\n elif nodo.factorEquilibrio > 0:\\n\\t if nodo.hijoIzquierdo.factorEquilibrio < 0:\\n\\t self.rotarIzquierda(nodo.hijoIzquierdo)\\n\\t self.rotarDerecha(nodo)\\n\\t else:\\n\\t self.rotarDerecha(nodo)\\n \\n def rotarIzquierda(self,rotRaiz):\\n \\tnuevaRaiz = rotRaiz.hijoDerecho\\n \\trotRaiz.hijoDerecho = nuevaRaiz.hijoIzquierdo\\n \\tif nuevaRaiz.hijoIzquierdo != None:\\n \\t nuevaRaiz.hijoIzquierdo.padre = rotRaiz\\n \\tnuevaRaiz.padre = rotRaiz.padre\\n \\tif rotRaiz.esRaiz():\\n \\t self.raiz = nuevaRaiz\\n \\telse:\\n \\t if rotRaiz.esHijoIzquierdo():\\n \\t rotRaiz.padre.hijoIzquierdo = nuevaRaiz\\n \\t else:\\n \\t \\trotRaiz.padre.hijoDerecho = nuevaRaiz\\n \\tnuevaRaiz.hijoIzquierdo = rotRaiz\\n \\trotRaiz.padre = nuevaRaiz\\n \\trotRaiz.factorEquilibrio = rotRaiz.factorEquilibrio + 1 - min(nuevaRaiz.factorEquilibrio, 0)\\n \\tnuevaRaiz.factorEquilibrio = nuevaRaiz.factorEquilibrio + 1 + max(rotRaiz.factorEquilibrio, 0)\\n\\n def rotarDerecha(self,rotRaiz):\\n nuevaRaiz = rotRaiz.hijoIzquierdo\\n rotRaiz.hijoIzquierdo = nuevaRaiz.hijoDerecho\\n if nuevaRaiz.hijoDerecho != None:\\n nuevaRaiz.hijoDerecho.padre = rotRaiz\\n nuevaRaiz.padre = rotRaiz.padre\\n if rotRaiz.esRaiz():\\n self.raiz = nuevaRaiz\\n else:\\n if rotRaiz.esHijoDerecho():\\n rotRaiz.padre.hijoDerecho = nuevaRaiz\\n else:\\n rotRaiz.padre.hijoIzquierdo = nuevaRaiz\\n nuevaRaiz.hijoDerecho = rotRaiz\\n rotRaiz.padre = nuevaRaiz\\n rotRaiz.factorEquilibrio = rotRaiz.factorEquilibrio - 1 - max(nuevaRaiz.factorEquilibrio, 0)\\n nuevaRaiz.factorEquilibrio = nuevaRaiz.factorEquilibrio - 1 + min(rotRaiz.factorEquilibrio, 0) \\n\\n\",\"src/lib/pythoned/arboles/monticuloBinario.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n# \\n#monticuloBinario.py\\n\\nclass MonticuloBinario:\\n def __init__(self):\\n self.listaMonticulo = [0]\\n self.tamanoActual = 0\\n\\n def construirMonticulo(self,unaLista):\\n i = len(unaLista) // 2\\n self.tamanoActual = len(unaLista)\\n self.listaMonticulo = [0] + unaLista[:]\\n print(len(self.listaMonticulo), i)\\n while (i > 0):\\n print(self.listaMonticulo, i)\\n self.infiltAbajo(i)\\n i = i - 1\\n print(self.listaMonticulo,i)\\n \\n def infiltAbajo(self,i):\\n while (i * 2) <= self.tamanoActual:\\n hm = self.hijoMin(i)\\n if self.listaMonticulo[i] > self.listaMonticulo[hm]:\\n tmp = self.listaMonticulo[i]\\n self.listaMonticulo[i] = self.listaMonticulo[hm]\\n self.listaMonticulo[hm] = tmp\\n i = hm\\n \\n def hijoMin(self,i):\\n if i * 2 + 1 > self.tamanoActual:\\n return i * 2\\n else:\\n if self.listaMonticulo[i * 2] < self.listaMonticulo[i * 2 + 1]:\\n return i * 2\\n else:\\n return i * 2 + 1\\n\\n def infiltArriba(self,i):\\n while i // 2 > 0:\\n if self.listaMonticulo[i] < self.listaMonticulo[i//2]:\\n tmp = self.listaMonticulo[i // 2]\\n self.listaMonticulo[i // 2] = self.listaMonticulo[i]\\n self.listaMonticulo[i] = tmp\\n i = i // 2\\n \\n def insertar(self,k):\\n self.listaMonticulo.append(k)\\n self.tamanoActual = self.tamanoActual + 1\\n self.infiltArriba(self.tamanoActual)\\n\\n def eliminarMin(self):\\n valorSacado = self.listaMonticulo[1]\\n self.listaMonticulo[1] = self.listaMonticulo[self.tamanoActual]\\n self.tamanoActual = self.tamanoActual - 1\\n self.listaMonticulo.pop()\\n self.infiltAbajo(1)\\n return valorSacado\\n \\n def estaVacio(self):\\n if tamanoActual == 0:\\n return True\\n else:\\n return False\\n\",\"src/lib/pythoned/basicas/__init__.py\":\"\\n#__all__ = [\\\"pila\\\"]\\n\\n\\nfrom .pila import Pila\\nfrom .cola import Cola\\nfrom .coladoble import ColaDoble\\n\\n\\n\",\"src/lib/pythoned/basicas/cola.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n#\\n#cola.py\\n\\nclass Cola:\\n def __init__(self):\\n self.items = []\\n\\n def estaVacia(self):\\n return self.items == []\\n\\n def agregar(self, item):\\n self.items.insert(0,item)\\n\\n def avanzar(self):\\n return self.items.pop()\\n\\n def tamano(self):\\n return len(self.items)\\n\",\"src/lib/pythoned/basicas/coladoble.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n# \\n#coladoble.py\\n\\nclass ColaDoble:\\n def __init__(self):\\n self.items = []\\n\\n def estaVacia(self):\\n return self.items == []\\n\\n def agregarFrente(self, item):\\n self.items.append(item)\\n\\n def agregarFinal(self, item):\\n self.items.insert(0,item)\\n\\n def removerFrente(self):\\n return self.items.pop()\\n\\n def removerFinal(self):\\n return self.items.pop(0)\\n\\n def tamano(self):\\n return len(self.items)\\n\",\"src/lib/pythoned/basicas/pila.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n# \\n#pila.py\\n\\nclass Pila:\\n def __init__(self):\\n self.items = []\\n\\n def estaVacia(self):\\n return self.items == []\\n\\n def incluir(self, item):\\n self.items.append(item)\\n\\n def extraer(self):\\n return self.items.pop()\\n\\n def inspeccionar(self):\\n return self.items[len(self.items)-1]\\n\\n def tamano(self):\\n return len(self.items)\\n\",\"src/lib/pythoned/grafos/__init__.py\":\"\\n\\nfrom .grafoAdy import Grafo\\nfrom .grafoAdy import Vertice\\nfrom .colaPrioridad import ColaPrioridad\\n\",\"src/lib/pythoned/grafos/colaPrioridad.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n# \\n#colaPrioridad.py\\n\\nclass ColaPrioridad:\\n def __init__(self):\\n self.arregloMonticulo = [(0,0)]\\n self.tamanoActual = 0\\n\\n def construirMonticulo(self,unaLista):\\n self.tamanoActual = len(unaLista)\\n self.arregloMonticulo = [(0,0)]\\n for i in unaLista:\\n self.arregloMonticulo.append(i)\\n i = len(unaLista) // 2 \\n while (i > 0):\\n self.infiltAbajo(i)\\n i = i - 1\\n \\n def infiltAbajo(self,i):\\n while (i * 2) <= self.tamanoActual:\\n hm = self.hijoMin(i)\\n if self.arregloMonticulo[i][0] > self.arregloMonticulo[hm][0]:\\n tmp = self.arregloMonticulo[i]\\n self.arregloMonticulo[i] = self.arregloMonticulo[hm]\\n self.arregloMonticulo[hm] = tmp\\n i = hm\\n \\n def hijoMin(self,i):\\n if i*2 > self.tamanoActual:\\n return -1\\n else:\\n if i*2 + 1 > self.tamanoActual:\\n return i*2\\n else:\\n if self.arregloMonticulo[i*2][0] < self.arregloMonticulo[i*2+1][0]:\\n return i*2\\n else:\\n return i*2+1\\n\\n def infiltArriba(self,i):\\n while i // 2 > 0:\\n if self.arregloMonticulo[i][0] < self.arregloMonticulo[i//2][0]:\\n tmp = self.arregloMonticulo[i//2]\\n self.arregloMonticulo[i//2] = self.arregloMonticulo[i]\\n self.arregloMonticulo[i] = tmp\\n i = i//2\\n \\n def insertar(self,k):\\n self.arregloMonticulo.append(k)\\n self.tamanoActual = self.tamanoActual + 1\\n self.infiltArriba(self.tamanoActual)\\n\\n def eliminarMin(self):\\n valorSacado = self.arregloMonticulo[1][1]\\n self.arregloMonticulo[1] = self.arregloMonticulo[self.tamanoActual]\\n self.tamanoActual = self.tamanoActual - 1\\n self.arregloMonticulo.pop()\\n self.infiltAbajo(1)\\n return valorSacado\\n \\n def estaVacia(self):\\n if self.tamanoActual == 0:\\n return True\\n else:\\n return False\\n\\n def decrementarClave(self,valor,nuevo):\\n hecho = False\\n i = 1\\n miClave = 0\\n while not hecho and i <= self.tamanoActual:\\n if self.arregloMonticulo[i][1] == valor:\\n hecho = True\\n miClave = i\\n else:\\n i = i + 1\\n if miClave > 0:\\n self.arregloMonticulo[miClave] = (nuevo,self.arregloMonticulo[miClave][1])\\n self.infiltArriba(miClave)\\n \\n def __contains__(self,vertice):\\n for pareja in self.arregloMonticulo:\\n if pareja[1] == vertice:\\n return True\\n return False \\n\\n\",\"src/lib/pythoned/grafos/grafoAdy.py\":\"# Bradley N. Miller, David L. Ranum\\n# Solución de problemas con algoritmos y estructuras de datos usando Python\\n# Copyright 2014\\n#\\n#grafoAdy.py\\n\\n\\nimport sys\\n\\nclass Grafo:\\n def __init__(self):\\n self.listaVertices = {}\\n self.numVertices = 0\\n \\n def agregarVertice(self,clave):\\n self.numVertices = self.numVertices + 1\\n nuevoVertice = Vertice(clave)\\n self.listaVertices[clave] = nuevoVertice\\n return nuevoVertice\\n \\n def obtenerVertice(self,n):\\n if n in self.listaVertices:\\n return self.listaVertices[n]\\n else:\\n return None\\n\\n def __contains__(self,n):\\n return n in self.listaVertices\\n \\n def agregarArista(self,de,a,costo=0):\\n if de not in self.listaVertices:\\n nv = self.agregarVertice(de)\\n if a not in self.listaVertices:\\n nv = self.agregarVertice(a)\\n self.listaVertices[de].agregarVecino(self.listaVertices[a],costo)\\n \\n def obtenerVertices(self):\\n return list(self.listaVertices.keys())\\n \\n def __iter__(self):\\n return iter(self.listaVertices.values())\\n \\nclass Vertice:\\n def __init__(self,clave):\\n self.id = clave\\n self.conectadoA = {}\\n self.color = 'blanco'\\n self.dist = sys.maxsize\\n self.predecesor = None\\n self.desc = 0\\n self.fin = 0\\n\\n # def __lt__(self,o):\\n # return self.id < o.id\\n \\n def agregarVecino(self,vecino,ponderacion=0):\\n self.conectadoA[vecino] = ponderacion\\n \\n def asignarColor(self,color):\\n self.color = color\\n \\n def asignarDistancia(self,d):\\n self.dist = d\\n\\n def asignarPredecesor(self,p):\\n self.predecesor = p\\n\\n def asignarDescubrimiento(self,tiempoDescubrimiento):\\n self.desc = tiempoDescubrimiento\\n \\n def asignarFinalizacion(self,tiempoFinalizacion):\\n self.fin = tiempoFinalizacion\\n \\n def obtenerFinalizacion(self):\\n return self.fin\\n \\n def obtenerDescubrimiento(self):\\n return self.desc\\n \\n def obtenerPredecesor(self):\\n return self.predecesor\\n \\n def obtenerDistancia(self):\\n return self.dist\\n \\n def obtenerColor(self):\\n return self.color\\n \\n def obtenerConexiones(self):\\n return self.conectadoA.keys()\\n \\n def obtenerPonderacion(self,vecino):\\n return self.conectadoA[vecino]\\n \\n def __str__(self):\\n return str(self.id) + \\\":color \\\" + self.color + \\\":desc \\\" + str(self.desc) + \\\":fin \\\" + str(self.fin) + \\\":distancia \\\" + str(self.dist) + \\\":predecesor \\\\n\\\\t[\\\" + str(self.predecesor)+ \\\"]\\\\n\\\"\\n \\n def obtenerId(self):\\n return self.id\\n\",\"src/lib/quopri.py\":\"import _sk_fail; _sk_fail._(\\\"quopri\\\")\\n\",\"src/lib/random.py\":\"from _random import *\\nfrom math import floor as _floor, isfinite as _isfinite\\nfrom itertools import accumulate as _accumulate, repeat as _repeat\\nfrom bisect import bisect as _bisect\\n\\ndef choices(population, weights=None, *, cum_weights=None, k=1):\\n '''Return a k sized list of population elements chosen with replacement.\\n\\n If the relative weights or cumulative weights are not specified,\\n the selections are made with equal probability.\\n\\n '''\\n n = len(population)\\n if cum_weights is None:\\n if weights is None:\\n floor = _floor\\n n += 0.0 # convert to float for a small speed improvement\\n return [population[floor(random() * n)] for i in _repeat(None, k)]\\n try:\\n cum_weights = list(_accumulate(weights))\\n except TypeError:\\n if not isinstance(weights, int):\\n raise\\n k = weights\\n raise TypeError(\\n 'The number of choices must be a keyword argument: k=' + k\\n )\\n elif weights is not None:\\n raise TypeError('Cannot specify both weights and cumulative weights')\\n if len(cum_weights) != n:\\n raise ValueError('The number of weights does not match the population')\\n total = cum_weights[-1] + 0.0 # convert to float\\n if total <= 0.0:\\n raise ValueError('Total of weights must be greater than zero')\\n if not _isfinite(total):\\n raise ValueError('Total of weights must be finite')\\n bisect = _bisect\\n hi = n - 1\\n return [population[bisect(cum_weights, random() * total, 0, hi)]\\n for i in _repeat(None, k)]\",\"src/lib/repr.py\":\"import _sk_fail; _sk_fail._(\\\"repr\\\")\\n\",\"src/lib/requests.py\":\"# most restricted version\\n\\\"\\\"\\\"\\nThis solution works in runestone - however it is much more limited.\\nAn error does not occur in the same way in the textbook as it does\\nfor the command line. Since HTTPError is not currently available in\\nRunestone, I had to change the exception.\\nDecode and Encode are not available in Runestone, so there might be\\nissues with reponses.\\nDoes not use the status attribute for urlopen, would be nice to have\\nthat back.\\nDoes not work on regular web pages (like google or the michigan daily) because of cross-site scripting limits.\\n\\\"\\\"\\\"\\nfrom urllib.request import urlopen\\nimport json\\n\\nclass Response:\\n def __init__(self, data, url):\\n self.text = data\\n self.url = url\\n\\n def json(self):\\n try:\\n return json.loads(self.text)\\n except:\\n return {\\\"error\\\": \\\"Response not interpretable as json. Try printing the .text attribute\\\"}\\n\\n def __str__(self):\\n return \\\"\\\".format(self.url)\\n\\n\\nurl_subs = {\\\" \\\": \\\"+\\\",\\n \\\"!\\\": \\\"%21\\\",\\n '\\\"': \\\"%22\\\",\\n \\\"#\\\": \\\"%23\\\",\\n \\\"$\\\": \\\"%24\\\",\\n \\\"'\\\": \\\"%27\\\",\\n \\\"(\\\": \\\"%28\\\",\\n \\\")\\\": \\\"%29\\\",\\n \\\"*\\\": \\\"%2A\\\",\\n \\\"+\\\": \\\"%2B\\\",\\n \\\",\\\": \\\"%2C\\\",\\n \\\"/\\\": \\\"%2F\\\",\\n \\\":\\\": \\\"%3A\\\",\\n \\\";\\\": \\\"%3B\\\",\\n \\\"=\\\": \\\"%3D\\\",\\n \\\"?\\\": \\\"%3F\\\",\\n \\\"@\\\": \\\"%40\\\",\\n \\\"[\\\": \\\"%5B\\\",\\n \\\"]\\\": \\\"%5D\\\",\\n }\\n\\ndef _subst(s, substitutions=url_subs):\\n res = \\\"\\\"\\n for c in str(s):\\n if c in substitutions:\\n res += substitutions[c]\\n else:\\n res += c\\n return res\\n\\n\\ndef requestURL(baseurl, params={}):\\n try:\\n if len(params) == 0:\\n return baseurl\\n complete_url = baseurl + \\\"?\\\"\\n pairs = [\\\"{}={}\\\".format(_subst(k), _subst(params[k])) for k in params]\\n complete_url += \\\"&\\\".join(pairs)\\n return complete_url\\n except:\\n return None\\n\\ndef get(baseurl, params={}):\\n full_url = requestURL(baseurl, params)\\n if not full_url:\\n text_data = \\\"

    invalid request

    \\\"\\n full_url = \\\"Couldn’t generate a valid URL\\\"\\n else:\\n data = urlopen(full_url)\\n text_data = data.read().strip()\\n if len(text_data) == 0:\\n text_data = \\\"Failed to retrieve that URL\\\"\\n return Response(text_data, full_url)\",\"src/lib/requests_with_caching.py\":\"import requests\\nimport json\\n\\nPERMANENT_CACHE_FNAME = \\\"permanent_cache.txt\\\"\\nTEMP_CACHE_FNAME = \\\"this_page_cache.txt\\\"\\n\\ndef _write_to_file(cache, fname):\\n with open(fname, 'w') as outfile:\\n outfile.write(json.dumps(cache, indent=2))\\n\\ndef _read_from_file(fname):\\n try:\\n with open(fname, 'r') as infile:\\n res = infile.read()\\n return json.loads(res)\\n except:\\n return {}\\n\\ndef add_to_cache(cache_file, cache_key, cache_value):\\n temp_cache = _read_from_file(cache_file)\\n temp_cache[cache_key] = cache_value\\n _write_to_file(temp_cache, cache_file)\\n\\ndef clear_cache(cache_file=TEMP_CACHE_FNAME):\\n _write_to_file({}, cache_file)\\n\\ndef make_cache_key(baseurl, params_d, private_keys=[\\\"api_key\\\", \\\"apikey\\\"]):\\n \\\"\\\"\\\"Makes a long string representing the query.\\n Alphabetize the keys from the params dictionary so we get the same order each time.\\n Omit keys with private info.\\\"\\\"\\\"\\n alphabetized_keys = sorted(params_d.keys())\\n res = []\\n for k in alphabetized_keys:\\n if k not in private_keys:\\n res.append(\\\"{}-{}\\\".format(k, params_d[k]))\\n return baseurl + \\\"_\\\".join(res)\\n\\ndef get(baseurl, params={}, private_keys_to_ignore=[\\\"api_key\\\", \\\"apikey\\\"], permanent_cache_file=PERMANENT_CACHE_FNAME, temp_cache_file=TEMP_CACHE_FNAME):\\n full_url = requests.requestURL(baseurl, params)\\n cache_key = make_cache_key(baseurl, params, private_keys_to_ignore)\\n # Load the permanent and page-specific caches from files\\n permanent_cache = _read_from_file(permanent_cache_file)\\n temp_cache = _read_from_file(temp_cache_file)\\n if cache_key in temp_cache:\\n print(\\\"found in page-specific cache\\\")\\n # make a Response object containing text from the change, and the full_url that would have been fetched\\n return requests.Response(temp_cache[cache_key], full_url)\\n elif cache_key in permanent_cache:\\n print(\\\"found in permanent_cache\\\")\\n # make a Response object containing text from the change, and the full_url that would have been fetched\\n return requests.Response(permanent_cache[cache_key], full_url)\\n else:\\n print(\\\"new; adding to cache\\\")\\n # actually request it\\n resp = requests.get(baseurl, params)\\n # save it\\n add_to_cache(temp_cache_file, cache_key, resp.text)\\n return resp\",\"src/lib/rexec.py\":\"import _sk_fail; _sk_fail._(\\\"rexec\\\")\\n\",\"src/lib/rfc822.py\":\"import _sk_fail; _sk_fail._(\\\"rfc822\\\")\\n\",\"src/lib/rlcompleter.py\":\"import _sk_fail; _sk_fail._(\\\"rlcompleter\\\")\\n\",\"src/lib/robotparser.py\":\"import _sk_fail; _sk_fail._(\\\"robotparser\\\")\\n\",\"src/lib/runpy.py\":\"import _sk_fail; _sk_fail._(\\\"runpy\\\")\\n\",\"src/lib/sched.py\":\"import _sk_fail; _sk_fail._(\\\"sched\\\")\\n\",\"src/lib/sets.py\":\"import _sk_fail; _sk_fail._(\\\"sets\\\")\\n\",\"src/lib/sgmllib.py\":\"import _sk_fail; _sk_fail._(\\\"sgmllib\\\")\\n\",\"src/lib/sha.py\":\"import _sk_fail; _sk_fail._(\\\"sha\\\")\\n\",\"src/lib/shelve.py\":\"import _sk_fail; _sk_fail._(\\\"shelve\\\")\\n\",\"src/lib/shlex.py\":\"import _sk_fail; _sk_fail._(\\\"shlex\\\")\\n\",\"src/lib/shutil.py\":\"import _sk_fail; _sk_fail._(\\\"shutil\\\")\\n\",\"src/lib/site.py\":\"import _sk_fail; _sk_fail._(\\\"site\\\")\\n\",\"src/lib/smtpd.py\":\"import _sk_fail; _sk_fail._(\\\"smtpd\\\")\\n\",\"src/lib/smtplib.py\":\"import _sk_fail; _sk_fail._(\\\"smtplib\\\")\\n\",\"src/lib/sndhdr.py\":\"import _sk_fail; _sk_fail._(\\\"sndhdr\\\")\\n\",\"src/lib/socket.py\":\"import _sk_fail; _sk_fail._(\\\"socket\\\")\\n\",\"src/lib/sqlite3/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"sqlite3\\\")\\n\",\"src/lib/sre.py\":\"import _sk_fail; _sk_fail._(\\\"sre\\\")\\n\",\"src/lib/sre_compile.py\":\"import _sk_fail; _sk_fail._(\\\"sre_compile\\\")\\n\",\"src/lib/sre_constants.py\":\"import _sk_fail; _sk_fail._(\\\"sre_constants\\\")\\n\",\"src/lib/sre_parse.py\":\"import _sk_fail; _sk_fail._(\\\"sre_parse\\\")\\n\",\"src/lib/ssl.py\":\"import _sk_fail; _sk_fail._(\\\"ssl\\\")\\n\",\"src/lib/stat.py\":\"import _sk_fail; _sk_fail._(\\\"stat\\\")\\n\",\"src/lib/statistics.py\":\"\\\"\\\"\\\"\\nBasic statistics module.\\n\\nThis module provides functions for calculating statistics of data, including\\naverages, variance, and standard deviation.\\n\\nCalculating averages\\n--------------------\\n\\n================== =============================================\\nFunction Description\\n================== =============================================\\nmean Arithmetic mean (average) of data.\\nharmonic_mean Harmonic mean of data.\\nmedian Median (middle value) of data.\\nmedian_low Low median of data.\\nmedian_high High median of data.\\nmedian_grouped Median, or 50th percentile, of grouped data.\\nmode Mode (most common value) of data.\\n================== =============================================\\n\\nCalculate the arithmetic mean (\\\"the average\\\") of data:\\n\\n>>> mean([-1.0, 2.5, 3.25, 5.75])\\n2.625\\n\\n\\nCalculate the standard median of discrete data:\\n\\n>>> median([2, 3, 4, 5])\\n3.5\\n\\n\\nCalculate the median, or 50th percentile, of data grouped into class intervals\\ncentred on the data values provided. E.g. if your data points are rounded to\\nthe nearest whole number:\\n\\n>>> median_grouped([2, 2, 3, 3, 3, 4]) #doctest: +ELLIPSIS\\n2.8333333333...\\n\\nThis should be interpreted in this way: you have two data points in the class\\ninterval 1.5-2.5, three data points in the class interval 2.5-3.5, and one in\\nthe class interval 3.5-4.5. The median of these data points is 2.8333...\\n\\n\\nCalculating variability or spread\\n---------------------------------\\n\\n================== =============================================\\nFunction Description\\n================== =============================================\\npvariance Population variance of data.\\nvariance Sample variance of data.\\npstdev Population standard deviation of data.\\nstdev Sample standard deviation of data.\\n================== =============================================\\n\\nCalculate the standard deviation of sample data:\\n\\n>>> stdev([2.5, 3.25, 5.5, 11.25, 11.75]) #doctest: +ELLIPSIS\\n4.38961843444...\\n\\nIf you have previously calculated the mean, you can pass it as the optional\\nsecond argument to the four \\\"spread\\\" functions to avoid recalculating it:\\n\\n>>> data = [1, 2, 2, 4, 4, 4, 5, 6]\\n>>> mu = mean(data)\\n>>> pvariance(data, mu)\\n2.5\\n\\n\\nExceptions\\n----------\\n\\nA single exception is defined: StatisticsError is a subclass of ValueError.\\n\\n\\\"\\\"\\\"\\n\\n__all__ = [ 'StatisticsError',\\n 'pstdev', 'pvariance', 'stdev', 'variance',\\n 'median', 'median_low', 'median_high', 'median_grouped',\\n 'mean', 'mode', 'harmonic_mean',\\n ]\\n\\nfrom collections import Counter\\nfrom math import sqrt\\n\\ndef mean(data):\\n return sum(data) / len(data)\\n\\ndef harmonic_mean(data):\\n raise NotImplementedError\\n\\n\\ndef median(data):\\n _data = sorted(data)\\n l = len(_data)\\n if l % 2 == 0:\\n _median = (_data[l//2] + _data[l//2-1]) / 2\\n else:\\n _median = _data[l//2]\\n return _median\\n\\ndef median_low(data):\\n _data = sorted(data)\\n l = len(_data)\\n if l % 2 == 0:\\n _median = _data[l//2-1]\\n else:\\n _median = _data[l//2]\\n return _median\\n\\n\\ndef median_high(data):\\n _data = sorted(data)\\n l = len(_data)\\n if l % 2 == 0:\\n _median = _data[l//2]\\n else:\\n _median = _data[l//2]\\n return _median\\n\\n\\ndef median_grouped(data):\\n return median(data)\\n\\ndef mode(data):\\n counter = Counter(data)\\n max_count = max(counter.values())\\n _mode = [k for k,v in counter.items() if v == max_count]\\n if len(_mode) > 1:\\n raise ValueError(\\\"No Unique Mode, found {} equally common values\\\".format(len(_mode)))\\n else:\\n return _mode[0]\\n\\n\\ndef variance(data):\\n average=mean(data)\\n _variance=0\\n for d in data:\\n _variance += ((average-d)**2)\\n final_variance=_variance/len(data)\\n return final_variance\\n\\ndef pvariance(data):\\n average=mean(data)\\n _variance=0\\n for d in data:\\n _variance += ((average-d)**2)\\n final_variance=_variance/len(data)\\n return final_variance\\n\\ndef variance(data):\\n average=mean(data)\\n _variance=0\\n for d in data:\\n _variance += ((average-d)**2)\\n final_variance=_variance/(len(data) -1)\\n return final_variance\\n\\ndef pstdev(data):\\n return sqrt(pvariance(data))\\n\\ndef stdev(data):\\n return sqrt(variance(data))\\n\\n\",\"src/lib/statvfs.py\":\"import _sk_fail; _sk_fail._(\\\"statvfs\\\")\\n\",\"src/lib/stringold.py\":\"import _sk_fail; _sk_fail._(\\\"stringold\\\")\\n\",\"src/lib/stringprep.py\":\"import _sk_fail; _sk_fail._(\\\"stringprep\\\")\\n\",\"src/lib/struct.py\":\"import _sk_fail; _sk_fail._(\\\"struct\\\")\\n\",\"src/lib/subprocess.py\":\"import _sk_fail; _sk_fail._(\\\"subprocess\\\")\\n\",\"src/lib/sunau.py\":\"import _sk_fail; _sk_fail._(\\\"sunau\\\")\\n\",\"src/lib/sunaudio.py\":\"import _sk_fail; _sk_fail._(\\\"sunaudio\\\")\\n\",\"src/lib/symbol.py\":\"import _sk_fail; _sk_fail._(\\\"symbol\\\")\\n\",\"src/lib/symtable.py\":\"import _sk_fail; _sk_fail._(\\\"symtable\\\")\\n\",\"src/lib/tabnanny.py\":\"import _sk_fail; _sk_fail._(\\\"tabnanny\\\")\\n\",\"src/lib/tarfile.py\":\"import _sk_fail; _sk_fail._(\\\"tarfile\\\")\\n\",\"src/lib/telnetlib.py\":\"import _sk_fail; _sk_fail._(\\\"telnetlib\\\")\\n\",\"src/lib/tempfile.py\":\"import _sk_fail; _sk_fail._(\\\"tempfile\\\")\\n\",\"src/lib/test/__init__.py\":\"__author__ = 'bmiller'\\n\\ndef testEqual(actual, expected, places=5):\\n if isinstance(expected,int):\\n if actual == expected:\\n print('Pass')\\n return True\\n elif isinstance(expected,float):\\n if abs(actual-expected) < 10**(-places):\\n print('Pass')\\n return True\\n else:\\n if actual == expected:\\n print('Pass')\\n return True\\n print('Test Failed: expected ' + str(expected) + ' but got ' + str(actual))\\n return False\\n\\ndef testNotEqual(actual, expected):\\n pass\\n\\n\",\"src/lib/test/ann_module.py\":\"\\n\\n\\\"\\\"\\\"\\nThe module for testing variable annotations.\\nEmpty lines above are for good reason (testing for correct line numbers)\\n\\\"\\\"\\\"\\n\\n# from typing import Optional\\n# from functools import wraps\\n\\n__annotations__[1] = 2\\n\\nclass C:\\n\\n x = 5; #y: Optional['C'] = None\\n\\n# from typing import Tuple\\nx: int = 5; y: str = x;# f: Tuple[int, int]\\n\\nclass M(type):\\n\\n __annotations__['123'] = 123\\n o: type = object\\n\\n(pars): bool = True\\n\\nclass D(C):\\n j: str = 'hi'; k: str= 'bye'\\n\\n# from types import new_class\\n# h_class = new_class('H', (C,))\\n# j_class = new_class('J')\\n\\nclass F():\\n z: int = 5\\n def __init__(self, x):\\n pass\\n\\nclass Y(F):\\n def __init__(self):\\n super(F, self).__init__(123)\\n\\nclass Meta(type):\\n def __new__(meta, name, bases, namespace):\\n return super().__new__(meta, name, bases, namespace)\\n\\nclass S(metaclass = Meta):\\n x: str = 'something'\\n y: str = 'something else'\\n\\n# def foo(x: int = 10):\\n# def bar(y: List[str]):\\n# x: str = 'yes'\\n# bar()\\n\\n# def dec(func):\\n# @wraps(func)\\n# def wrapper(*args, **kwargs):\\n# return func(*args, **kwargs)\\n# return wrapper\\n\",\"src/lib/test/ann_module2.py\":\"\\\"\\\"\\\"\\nSome correct syntax for variable annotation here.\\nMore examples are in test_grammar and test_parser.\\n\\\"\\\"\\\"\\n\\n# from typing import no_type_check, ClassVar\\n\\ni: int = 1\\nj: int\\nx: float = i/10\\n\\ndef f():\\n # class C: ...\\n class C: pass\\n return C()\\n\\nf().new_attr: object = object()\\n\\nclass C:\\n def __init__(self, x: int) -> None:\\n self.x = x\\n\\nc = C(5)\\nc.new_attr: int = 10\\n\\n__annotations__ = {}\\n\\n\\n# @no_type_check\\n# class NTC:\\n# def meth(self, param: complex) -> None:\\n# ...\\n\\n# class CV:\\n# var: ClassVar['CV']\\n\\n# CV.var = CV()\\n\",\"src/lib/test/ann_module3.py\":\"\\\"\\\"\\\"\\nCorrect syntax for variable annotation that should fail at runtime\\nin a certain manner. More examples are in test_grammar and test_parser.\\n\\\"\\\"\\\"\\n\\ndef f_bad_ann():\\n __annotations__[1] = 2\\n\\nclass C_OK:\\n def __init__(self, x: int) -> None:\\n self.x: no_such_name = x # This one is OK as proposed by Guido\\n\\nclass D_bad_ann:\\n def __init__(self, x: int) -> None:\\n sfel.y: int = 0\\n\\ndef g_bad_ann():\\n no_such_name.attr: int = 0\\n\",\"src/lib/test/bad_getattr.py\":\"x = 1\\n\\n__getattr__ = \\\"Surprise!\\\"\\n__dir__ = \\\"Surprise again!\\\"\\n\",\"src/lib/test/bad_getattr2.py\":\"def __getattr__():\\n \\\"Bad one\\\"\\n\\nx = 1\\n\\ndef __dir__(bad_sig):\\n return []\\n\",\"src/lib/test/bad_getattr3.py\":\"def __getattr__(name):\\n global __getattr__\\n if name != 'delgetattr':\\n raise AttributeError\\n del __getattr__\\n raise AttributeError\\n\",\"src/lib/test/decimaltestdata/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"decimaltestdata\\\")\\n\",\"src/lib/test/good_getattr.py\":\"x = 1\\n\\ndef __dir__():\\n return ['a', 'b', 'c']\\n\\ndef __getattr__(name):\\n if name == \\\"yolo\\\":\\n raise AttributeError(\\\"Deprecated, use whatever instead\\\")\\n return f\\\"There is {name}\\\"\\n\\ny = 2\\n\",\"src/lib/test/test_support.py\":\"\\\"\\\"\\\"Supporting definitions for the Python regression tests.\\\"\\\"\\\"\\n\\nif __name__ != 'test.test_support':\\n raise ImportError('test_support must be imported from the test package')\\n\\nimport unittest\\n\\n\\n# def run_unittest(*classes):\\n# \\\"\\\"\\\"Run tests from unittest.TestCase-derived classes.\\\"\\\"\\\"\\n# valid_types = (unittest.TestSuite, unittest.TestCase)\\n# suite = unittest.TestSuite()\\n# for cls in classes:\\n# if isinstance(cls, str):\\n# if cls in sys.modules:\\n# suite.addTest(unittest.findTestCases(sys.modules[cls]))\\n# else:\\n# raise ValueError(\\\"str arguments must be keys in sys.modules\\\")\\n# elif isinstance(cls, valid_types):\\n# suite.addTest(cls)\\n# else:\\n# suite.addTest(unittest.makeSuite(cls))\\n# _run_suite(suite)\\n\\ndef run_unittest(*classes):\\n \\\"\\\"\\\"Run tests from unittest.TestCase-derived classes.\\\"\\\"\\\"\\n for cls in classes:\\n print cls\\n if issubclass(cls, unittest.TestCase):\\n cls().main()\\n else:\\n print \\\"Don't know what to do with \\\", cls\\n\",\"src/lib/textwrap.py\":\"\\\"\\\"\\\"Text wrapping and filling.\\n\\\"\\\"\\\"\\n\\n# Copyright (C) 1999-2001 Gregory P. Ward.\\n# Copyright (C) 2002, 2003 Python Software Foundation.\\n# Written by Greg Ward \\n\\nimport re, string\\n\\n__all__ = ['TextWrapper', 'wrap', 'fill', 'dedent', 'indent', 'shorten']\\n\\n# Hardcode the recognized whitespace characters to the US-ASCII\\n# whitespace characters. The main reason for doing this is that\\n# some Unicode spaces (like \\\\u00a0) are non-breaking whitespaces.\\n_whitespace = '\\\\t\\\\n\\\\x0b\\\\x0c\\\\r '\\n\\nclass TextWrapper:\\n \\\"\\\"\\\"\\n Object for wrapping/filling text. The public interface consists of\\n the wrap() and fill() methods; the other methods are just there for\\n subclasses to override in order to tweak the default behaviour.\\n If you want to completely replace the main wrapping algorithm,\\n you'll probably have to override _wrap_chunks().\\n Several instance attributes control various aspects of wrapping:\\n width (default: 70)\\n the maximum width of wrapped lines (unless break_long_words\\n is false)\\n initial_indent (default: \\\"\\\")\\n string that will be prepended to the first line of wrapped\\n output. Counts towards the line's width.\\n subsequent_indent (default: \\\"\\\")\\n string that will be prepended to all lines save the first\\n of wrapped output; also counts towards each line's width.\\n expand_tabs (default: true)\\n Expand tabs in input text to spaces before further processing.\\n Each tab will become 0 .. 'tabsize' spaces, depending on its position\\n in its line. If false, each tab is treated as a single character.\\n tabsize (default: 8)\\n Expand tabs in input text to 0 .. 'tabsize' spaces, unless\\n 'expand_tabs' is false.\\n replace_whitespace (default: true)\\n Replace all whitespace characters in the input text by spaces\\n after tab expansion. Note that if expand_tabs is false and\\n replace_whitespace is true, every tab will be converted to a\\n single space!\\n fix_sentence_endings (default: false)\\n Ensure that sentence-ending punctuation is always followed\\n by two spaces. Off by default because the algorithm is\\n (unavoidably) imperfect.\\n break_long_words (default: true)\\n Break words longer than 'width'. If false, those words will not\\n be broken, and some lines might be longer than 'width'.\\n break_on_hyphens (default: true)\\n Allow breaking hyphenated words. If true, wrapping will occur\\n preferably on whitespaces and right after hyphens part of\\n compound words.\\n drop_whitespace (default: true)\\n Drop leading and trailing whitespace from lines.\\n max_lines (default: None)\\n Truncate wrapped lines.\\n placeholder (default: ' [...]')\\n Append to the last line of truncated text.\\n \\\"\\\"\\\"\\n\\n unicode_whitespace_trans = {}\\n # uspace = ord(' ')\\n uspace = ' '\\n for x in _whitespace:\\n # unicode_whitespace_trans[ord(x)] = uspace\\n unicode_whitespace_trans[x] = uspace\\n\\n # This funky little regex is just the trick for splitting\\n # text up into word-wrappable chunks. E.g.\\n # \\\"Hello there -- you goof-ball, use the -b option!\\\"\\n # splits into\\n # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option!\\n # (after stripping out empty strings).\\n wordsep_re = re.compile(\\n r'(\\\\s+|' # any whitespace\\n r'[^\\\\s\\\\w]*\\\\w+[^0-9\\\\W]-(?=\\\\w+[^0-9\\\\W]))') # hyphenated words\\n em_dash = re.compile(r'(\\\\s+|' # any whitespace\\n r'[^\\\\s\\\\w]*\\\\w+[^0-9\\\\W]-(?=\\\\w+[^0-9\\\\W])|' # hyphenated words\\n r'(?!^)-{2,}(?=\\\\w))') # em-dash\\n\\n \\n # This less funky little regex just split on recognized spaces. E.g.\\n # \\\"Hello there -- you goof-ball, use the -b option!\\\"\\n # splits into\\n # Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/\\n wordsep_simple_re = re.compile(r'(\\\\s+)')\\n\\n\\n # XXX this is not locale- or charset-aware -- string.lowercase\\n # is US-ASCII only (and therefore English-only)\\n sentence_end_re = re.compile(r'[a-z]' # lowercase letter\\n r'[\\\\.\\\\!\\\\?]' # sentence-ending punct.\\n r'[\\\\\\\"\\\\']?' # optional end-of-quote\\n r'\\\\Z') # end of chunk\\n sentence_end_re = r'[a-z][\\\\.\\\\!\\\\?][\\\\\\\"\\\\']?'\\n\\n def __init__(self,\\n width=70,\\n initial_indent=\\\"\\\",\\n subsequent_indent=\\\"\\\",\\n expand_tabs=True,\\n replace_whitespace=True,\\n fix_sentence_endings=False,\\n break_long_words=True,\\n drop_whitespace=True,\\n break_on_hyphens=True,\\n tabsize=8,\\n max_lines=None,\\n placeholder=' [...]'):\\n self.width = width\\n self.initial_indent = initial_indent\\n self.subsequent_indent = subsequent_indent\\n self.expand_tabs = expand_tabs\\n self.replace_whitespace = replace_whitespace\\n self.fix_sentence_endings = fix_sentence_endings\\n self.break_long_words = break_long_words\\n self.drop_whitespace = drop_whitespace\\n self.break_on_hyphens = break_on_hyphens\\n self.tabsize = tabsize\\n self.max_lines = max_lines\\n self.placeholder = placeholder\\n\\n\\n # -- Private methods -----------------------------------------------\\n # (possibly useful for subclasses to override)\\n\\n def _munge_whitespace(self, text):\\n \\\"\\\"\\\"_munge_whitespace(text : string) -> string\\n Munge whitespace in text: expand tabs and convert all other\\n whitespace characters to spaces. Eg. \\\" foo\\\\\\\\tbar\\\\\\\\n\\\\\\\\nbaz\\\"\\n becomes \\\" foo bar baz\\\".\\n \\\"\\\"\\\"\\n if self.expand_tabs:\\n text = text.expandtabs(self.tabsize)\\n if self.replace_whitespace:\\n for key, val in self.unicode_whitespace_trans.items():\\n text = text.replace(key, val)\\n return text\\n\\n\\n def _split(self, text):\\n \\\"\\\"\\\"_split(text : string) -> [string]\\n Split the text to wrap into indivisible chunks. Chunks are\\n not quite the same as words; see _wrap_chunks() for full\\n details. As an example, the text\\n Look, goof-ball -- use the -b option!\\n breaks into the following chunks:\\n 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',\\n 'use', ' ', 'the', ' ', '-b', ' ', 'option!'\\n if break_on_hyphens is True, or in:\\n 'Look,', ' ', 'goof-ball', ' ', '--', ' ',\\n 'use', ' ', 'the', ' ', '-b', ' ', option!'\\n otherwise.\\n \\\"\\\"\\\"\\n if self.break_on_hyphens is True:\\n chunks = self.wordsep_re.split(text)\\n if \\\"--\\\" in text:\\n chunks = [item \\n for sublist in [self.em_dash.split(chunk) for chunk in chunks] \\n for item in sublist]\\n else:\\n chunks = self.wordsep_simple_re.split(text)\\n chunks = [c for c in chunks if c]\\n return chunks\\n\\n def _fix_sentence_endings(self, chunks):\\n \\\"\\\"\\\"_fix_sentence_endings(chunks : [string])\\n Correct for sentence endings buried in 'chunks'. Eg. when the\\n original text contains \\\"... foo.\\\\\\\\nBar ...\\\", munge_whitespace()\\n and split() will convert that to [..., \\\"foo.\\\", \\\" \\\", \\\"Bar\\\", ...]\\n which has one too few spaces; this method simply changes the one\\n space to two.\\n \\\"\\\"\\\"\\n i = 0\\n # patsearch = self.sentence_end_re.search\\n while i < len(chunks)-1:\\n if chunks[i+1] == \\\" \\\" and re.search(self.sentence_end_re, chunks[i]) and chunks[i][-1] in \\\".!?\\\\\\\"\\\\'\\\":\\n chunks[i+1] = \\\" \\\"\\n i += 2\\n else:\\n i += 1\\n\\n def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):\\n \\\"\\\"\\\"_handle_long_word(chunks : [string],\\n cur_line : [string],\\n cur_len : int, width : int)\\n Handle a chunk of text (most likely a word, not whitespace) that\\n is too long to fit in any line.\\n \\\"\\\"\\\"\\n # Figure out when indent is larger than the specified width, and make\\n # sure at least one character is stripped off on every pass\\n if width < 1:\\n space_left = 1\\n else:\\n space_left = width - cur_len\\n\\n # If we're allowed to break long words, then do so: put as much\\n # of the next chunk onto the current line as will fit.\\n if self.break_long_words:\\n cur_line.append(reversed_chunks[-1][:space_left])\\n reversed_chunks[-1] = reversed_chunks[-1][space_left:]\\n\\n # Otherwise, we have to preserve the long word intact. Only add\\n # it to the current line if there's nothing already there --\\n # that minimizes how much we violate the width constraint.\\n elif not cur_line:\\n cur_line.append(reversed_chunks.pop())\\n\\n # If we're not allowed to break long words, and there's already\\n # text on the current line, do nothing. Next time through the\\n # main loop of _wrap_chunks(), we'll wind up here again, but\\n # cur_len will be zero, so the next line will be entirely\\n # devoted to the long word that we can't handle right now.\\n\\n def _wrap_chunks(self, chunks):\\n \\\"\\\"\\\"_wrap_chunks(chunks : [string]) -> [string]\\n Wrap a sequence of text chunks and return a list of lines of\\n length 'self.width' or less. (If 'break_long_words' is false,\\n some lines may be longer than this.) Chunks correspond roughly\\n to words and the whitespace between them: each chunk is\\n indivisible (modulo 'break_long_words'), but a line break can\\n come between any two chunks. Chunks should not have internal\\n whitespace; ie. a chunk is either all whitespace or a \\\"word\\\".\\n Whitespace chunks will be removed from the beginning and end of\\n lines, but apart from that whitespace is preserved.\\n \\\"\\\"\\\"\\n lines = []\\n if self.width <= 0:\\n raise ValueError(\\\"invalid width %r (must be > 0)\\\" % self.width)\\n if self.max_lines is not None:\\n if self.max_lines > 1:\\n indent = self.subsequent_indent\\n else:\\n indent = self.initial_indent\\n if len(indent) + len(self.placeholder.lstrip()) > self.width:\\n raise ValueError(\\\"placeholder too large for max width\\\")\\n\\n # Arrange in reverse order so items can be efficiently popped\\n # from a stack of chucks.\\n chunks.reverse()\\n\\n while chunks:\\n\\n # Start the list of chunks that will make up the current line.\\n # cur_len is just the length of all the chunks in cur_line.\\n cur_line = []\\n cur_len = 0\\n\\n # Figure out which static string will prefix this line.\\n if lines:\\n indent = self.subsequent_indent\\n else:\\n indent = self.initial_indent\\n\\n # Maximum width for this line.\\n width = self.width - len(indent)\\n\\n # First chunk on line is whitespace -- drop it, unless this\\n # is the very beginning of the text (ie. no lines started yet).\\n if self.drop_whitespace and chunks[-1].strip() == '' and lines:\\n del chunks[-1]\\n\\n while chunks:\\n l = len(chunks[-1])\\n\\n # Can at least squeeze this chunk onto the current line.\\n if cur_len + l <= width:\\n cur_line.append(chunks.pop())\\n cur_len += l\\n\\n # Nope, this line is full.\\n else:\\n break\\n\\n # The current line is full, and the next chunk is too big to\\n # fit on *any* line (not just this one).\\n if chunks and len(chunks[-1]) > width:\\n self._handle_long_word(chunks, cur_line, cur_len, width)\\n cur_len = sum(map(len, cur_line))\\n\\n # If the last chunk on this line is all whitespace, drop it.\\n if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':\\n cur_len -= len(cur_line[-1])\\n del cur_line[-1]\\n\\n if cur_line:\\n if (self.max_lines is None or\\n len(lines) + 1 < self.max_lines or\\n (not chunks or\\n self.drop_whitespace and\\n len(chunks) == 1 and\\n not chunks[0].strip()) and cur_len <= width):\\n # Convert current line back to a string and store it in\\n # list of all lines (return value).\\n lines.append(indent + ''.join(cur_line))\\n else:\\n while cur_line:\\n if (cur_line[-1].strip() and\\n cur_len + len(self.placeholder) <= width):\\n cur_line.append(self.placeholder)\\n lines.append(indent + ''.join(cur_line))\\n break\\n cur_len -= len(cur_line[-1])\\n del cur_line[-1]\\n else:\\n if lines:\\n prev_line = lines[-1].rstrip()\\n if (len(prev_line) + len(self.placeholder) <=\\n self.width):\\n lines[-1] = prev_line + self.placeholder\\n break\\n lines.append(indent + self.placeholder.lstrip())\\n break\\n\\n return lines\\n\\n def _split_chunks(self, text):\\n text = self._munge_whitespace(text)\\n return self._split(text)\\n\\n # -- Public interface ----------------------------------------------\\n\\n def wrap(self, text):\\n \\\"\\\"\\\"wrap(text : string) -> [string]\\n Reformat the single paragraph in 'text' so it fits in lines of\\n no more than 'self.width' columns, and return a list of wrapped\\n lines. Tabs in 'text' are expanded with string.expandtabs(),\\n and all other whitespace characters (including newline) are\\n converted to space.\\n \\\"\\\"\\\"\\n chunks = self._split_chunks(text)\\n if self.fix_sentence_endings:\\n self._fix_sentence_endings(chunks)\\n return self._wrap_chunks(chunks)\\n\\n def fill(self, text):\\n \\\"\\\"\\\"fill(text : string) -> string\\n Reformat the single paragraph in 'text' to fit in lines of no\\n more than 'self.width' columns, and return a new string\\n containing the entire wrapped paragraph.\\n \\\"\\\"\\\"\\n return \\\"\\\\n\\\".join(self.wrap(text))\\n\\n\\n# -- Convenience interface ---------------------------------------------\\n\\ndef wrap(text, width=70, **kwargs):\\n \\\"\\\"\\\"Wrap a single paragraph of text, returning a list of wrapped lines.\\n Reformat the single paragraph in 'text' so it fits in lines of no\\n more than 'width' columns, and return a list of wrapped lines. By\\n default, tabs in 'text' are expanded with string.expandtabs(), and\\n all other whitespace characters (including newline) are converted to\\n space. See TextWrapper class for available keyword args to customize\\n wrapping behaviour.\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, **kwargs)\\n return w.wrap(text)\\n\\ndef fill(text, width=70, **kwargs):\\n \\\"\\\"\\\"Fill a single paragraph of text, returning a new string.\\n Reformat the single paragraph in 'text' to fit in lines of no more\\n than 'width' columns, and return a new string containing the entire\\n wrapped paragraph. As with wrap(), tabs are expanded and other\\n whitespace characters converted to space. See TextWrapper class for\\n available keyword args to customize wrapping behaviour.\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, **kwargs)\\n return w.fill(text)\\n\\ndef shorten(text, width, **kwargs):\\n \\\"\\\"\\\"Collapse and truncate the given text to fit in the given width.\\n The text first has its whitespace collapsed. If it then fits in\\n the *width*, it is returned as is. Otherwise, as many words\\n as possible are joined and then the placeholder is appended::\\n >>> textwrap.shorten(\\\"Hello world!\\\", width=12)\\n 'Hello world!'\\n >>> textwrap.shorten(\\\"Hello world!\\\", width=11)\\n 'Hello [...]'\\n \\\"\\\"\\\"\\n w = TextWrapper(width=width, max_lines=1, **kwargs)\\n return w.fill(' '.join(text.strip().split()))\\n\\n\\n# -- Loosely related functionality -------------------------------------\\n\\n# _whitespace_only_re = re.compile('^[ \\\\t]+$', re.MULTILINE)\\n# _leading_whitespace_re = re.compile('(^[ \\\\t]*)(?:[^ \\\\t\\\\n])', re.MULTILINE)\\n\\ndef dedent(text):\\n \\\"\\\"\\\"Remove any common leading whitespace from every line in `text`.\\n This can be used to make triple-quoted strings line up with the left\\n edge of the display, while still presenting them in the source code\\n in indented form.\\n Note that tabs and spaces are both treated as whitespace, but they\\n are not equal: the lines \\\" hello\\\" and \\\"\\\\\\\\thello\\\" are\\n considered to have no common leading whitespace.\\n Entirely blank lines are normalized to a newline character.\\n \\\"\\\"\\\"\\n # Look for the longest leading string of spaces and tabs common to\\n # all lines.\\n margin = None\\n\\n indents = re.findall(r'(^[ \\\\t]*)(?:[^ \\\\t\\\\n])',text, re.MULTILINE)\\n for indent in indents:\\n if margin is None:\\n margin = indent\\n\\n # Current line more deeply indented than previous winner:\\n # no change (previous winner is still on top).\\n elif indent.startswith(margin):\\n pass\\n\\n # Current line consistent with and no deeper than previous winner:\\n # it's the new winner.\\n elif margin.startswith(indent):\\n margin = indent\\n\\n # Find the largest common whitespace between current line and previous\\n # winner.\\n else:\\n for i, (x, y) in enumerate(zip(margin, indent)):\\n if x != y:\\n margin = margin[:i]\\n break\\n # sanity check (testing/debugging only)\\n if 0 and margin:\\n for line in text.split(\\\"\\\\n\\\"):\\n assert not line or line.startswith(margin), \\\\\\n \\\"line = %r, margin = %r\\\" % (line, margin)\\n\\n if margin:\\n lines = [line[len(margin):] \\n if line.strip()\\n else line.strip() \\n for line in text.split(\\\"\\\\n\\\")]\\n text = \\\"\\\\n\\\".join(lines)\\n return text\\n\\n\\ndef indent(text, prefix, predicate=None):\\n \\\"\\\"\\\"Adds 'prefix' to the beginning of selected lines in 'text'.\\n If 'predicate' is provided, 'prefix' will only be added to the lines\\n where 'predicate(line)' is True. If 'predicate' is not provided,\\n it will default to adding 'prefix' to all non-empty lines that do not\\n consist solely of whitespace characters.\\n \\\"\\\"\\\"\\n if predicate is None:\\n def predicate(line):\\n return line.strip()\\n\\n def prefixed_lines():\\n for line in text.splitlines(True):\\n yield (prefix + line if predicate(line) else line)\\n return ''.join(prefixed_lines())\\n\\n\\nif __name__ == \\\"__main__\\\":\\n #print dedent(\\\"\\\\tfoo\\\\n\\\\tbar\\\")\\n #print dedent(\\\" \\\\thello there\\\\n \\\\t how are you?\\\")\\n print(dedent(\\\"Hello there.\\\\n This is indented.\\\"))\",\"src/lib/this.py\":\"\\nprint(\\\"\\\"\\\"\\nThe Zen of Python, by Tim Peters\\n\\nBeautiful is better than ugly.\\nExplicit is better than implicit.\\nSimple is better than complex.\\nComplex is better than complicated.\\nFlat is better than nested.\\nSparse is better than dense.\\nReadability counts.\\nSpecial cases aren't special enough to break the rules.\\nAlthough practicality beats purity.\\nErrors should never pass silently.\\nUnless explicitly silenced.\\nIn the face of ambiguity, refuse the temptation to guess.\\nThere should be one-- and preferably only one --obvious way to do it.\\nAlthough that way may not be obvious at first unless you're Dutch.\\nNow is better than never.\\nAlthough never is often better than *right* now.\\nIf the implementation is hard to explain, it's a bad idea.\\nIf the implementation is easy to explain, it may be a good idea.\\nNamespaces are one honking great idea -- let's do more of those!\\n\\\"\\\"\\\"\\n )\\n\",\"src/lib/threading.py\":\"import _sk_fail; _sk_fail._(\\\"threading\\\")\\n\",\"src/lib/timeit.py\":\"import _sk_fail; _sk_fail._(\\\"timeit\\\")\\n\",\"src/lib/toaiff.py\":\"import _sk_fail; _sk_fail._(\\\"toaiff\\\")\\n\",\"src/lib/trace.py\":\"import _sk_fail; _sk_fail._(\\\"trace\\\")\\n\",\"src/lib/traceback.py\":\"import _sk_fail; _sk_fail._(\\\"traceback\\\")\\n\",\"src/lib/tty.py\":\"import _sk_fail; _sk_fail._(\\\"tty\\\")\\n\",\"src/lib/types.py\":\"\\\"\\\"\\\"\\nThis file was modified from CPython.\\nCopyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,\\n2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved\\n\\\"\\\"\\\"\\n\\\"\\\"\\\"Define names for all type symbols known in the standard interpreter.\\nTypes that are part of optional modules (e.g. array) are not listed.\\n\\\"\\\"\\\"\\nimport sys\\n\\n# Iterators in Python aren't a matter of type but of protocol. A large\\n# and changing number of builtin types implement *some* flavor of\\n# iterator. Don't check the type! Use hasattr to check for both\\n# \\\"__iter__\\\" and \\\"next\\\" attributes instead.\\nMappingProxyType = type(type.__dict__)\\nWrapperDescriptorType = type(object.__init__)\\nMethodWrapperType = type(object().__str__)\\nMethodDescriptorType = type(str.join)\\nClassMethodDescriptorType = type(dict.__dict__['fromkeys'])\\n\\nNoneType = type(None)\\nTypeType = type\\nObjectType = object\\nIntType = int\\ntry:\\n LongType = long\\nexcept: pass\\nFloatType = float\\nBooleanType = bool\\ntry:\\n ComplexType = complex\\nexcept NameError:\\n pass\\nStringType = str\\n\\n# StringTypes is already outdated. Instead of writing \\\"type(x) in\\n# types.StringTypes\\\", you should use \\\"isinstance(x, basestring)\\\". But\\n# we keep around for compatibility with Python 2.2.\\ntry:\\n UnicodeType = unicode\\n StringTypes = (StringType, UnicodeType)\\nexcept NameError:\\n StringTypes = (StringType,)\\n\\nBufferType = buffer\\n\\nTupleType = tuple\\nListType = list\\nDictType = DictionaryType = dict\\n\\ndef _f(): pass\\nFunctionType = type(_f)\\nLambdaType = type(lambda: None) # Same as FunctionType\\n#CodeType = type(_f.func_code)\\n\\ndef _g():\\n yield 1\\nGeneratorType = type(_g())\\n\\nclass _C:\\n def _m(self): pass\\nClassType = type(_C)\\nUnboundMethodType = type(_C._m) # Same as MethodType\\n_x = _C()\\nInstanceType = type(_x)\\nMethodType = type(_x._m)\\nBuiltinFunctionType = type(len)\\nBuiltinMethodType = type([].append) # Same as BuiltinFunctionType\\n\\nModuleType = type(sys)\\nFileType = file\\ntry:\\n XRangeType = xrange\\nexcept NameError:\\n pass\\n\\n# try:\\n# raise TypeError\\n# except TypeError:\\n# tb = sys.exc_info()[2]\\n# TracebackType = type(tb)\\n# FrameType = type(tb.tb_frame)\\n# del tb\\n\\nSliceType = slice\\nEllipsisType = type(Ellipsis)\\n\\n# DictProxyType = type(TypeType.__dict__)\\nNotImplementedType = type(NotImplemented)\\n\\n# For Jython, the following two types are identical\\n# GetSetDescriptorType = type(FunctionType.func_code)\\n# MemberDescriptorType = type(FunctionType.func_globals)\\n\\ndel sys, _f, _g, _C, _x # Not for export\\n__all__ = list(n for n in globals() if n[:1] != '_')\\n\\nGenericAlias = type(type[int])\",\"src/lib/unittest/__init__.py\":\"__author__ = 'bmiller'\\n'''\\nThis is the start of something that behaves like\\nthe unittest module from cpython.\\n\\n'''\\nimport re\\n\\nclass _AssertRaisesContext(object):\\n \\\"\\\"\\\"A context manager used to implement TestCase.assertRaises* methods.\\\"\\\"\\\"\\n def __init__(self, expected, test_case, expected_regex=None):\\n self.test_case = test_case\\n self.expected = expected\\n self.exception = None\\n if expected_regex is not None:\\n expected_regex = re.compile(expected_regex)\\n self.expected_regex = expected_regex\\n\\n def _is_subtype(self, expected, basetype):\\n if isinstance(expected, tuple):\\n return all(self._is_subtype(e, basetype) for e in expected)\\n return isinstance(expected, type) and issubclass(expected, basetype)\\n\\n def handle(self, name, args, kwargs):\\n \\\"\\\"\\\"\\n If args is empty, assertRaises is being used as a\\n context manager, so return self.\\n If args is not empty, call a callable passing positional and keyword\\n arguments.\\n \\\"\\\"\\\"\\n try:\\n if not self._is_subtype(self.expected, BaseException):\\n raise TypeError('%s() arg 1 must be an exception type or tuple of exception types'.format(name))\\n if not args:\\n return self\\n\\n callable_obj = args[0]\\n args = args[1:]\\n with self:\\n callable_obj(*args, **kwargs) \\n\\n finally:\\n # bpo-23890: manually break a reference cycle\\n self = None\\n\\n def __enter__(self):\\n return self\\n\\n def __exit__(self, exc_type, exc_value, tb):\\n res = True\\n feedback = \\\"\\\"\\n self.exception = exc_value\\n try:\\n act_exc = exc_type.__name__\\n except AttributeError:\\n act_exc = str(exc_type)\\n try:\\n exp_exc = self.expected.__name__\\n except AttributeError:\\n exp_exc = str(self.expected)\\n\\n if exc_type is None:\\n res = False\\n feedback = \\\"{} not raised\\\".format(exp_exc)\\n elif not issubclass(exc_type, self.expected):\\n res = False\\n feedback = \\\"Expected {} but got {}\\\".format(exp_exc, act_exc)\\n\\n elif self.expected_regex is not None:\\n expected_regex = self.expected_regex\\n if not expected_regex.search(str(exc_value)):\\n res = False\\n feedback = '\\\"{}\\\" does not match \\\"{}\\\"'.format(expected_regex.pattern, str(exc_value))\\n\\n self.test_case.appendResult(res, act_exc, exp_exc, feedback)\\n\\n return True\\n\\n\\nclass TestCase(object):\\n def __init__(self):\\n self.numPassed = 0\\n self.numFailed = 0\\n self.assertPassed = 0\\n self.assertFailed = 0\\n self.verbosity = 1\\n self.tlist = []\\n testNames = {}\\n for name in dir(self):\\n if name[:4] == 'test' and name not in testNames:\\n self.tlist.append(getattr(self,name))\\n testNames[name]=True\\n\\n def setUp(self):\\n pass\\n\\n def tearDown(self):\\n pass\\n \\n def cleanName(self,funcName):\\n return funcName.__func__.__name__\\n\\n def main(self):\\n\\n for func in self.tlist:\\n if self.verbosity > 1:\\n print('Running %s' % self.cleanName(func))\\n try:\\n self.setUp()\\n self.assertPassed = 0\\n self.assertFailed = 0\\n func()\\n self.tearDown()\\n if self.assertFailed == 0:\\n self.numPassed += 1\\n else:\\n self.numFailed += 1\\n print('Tests failed in %s ' % self.cleanName(func))\\n except Exception as e:\\n self.assertFailed += 1\\n self.numFailed += 1\\n print('Test threw exception in %s (%s)' % (self.cleanName(func), e))\\n self.showSummary()\\n\\n def assertEqual(self, actual, expected, feedback=\\\"\\\"):\\n res = actual==expected\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to equal %s\\\" % (str(actual),str(expected))\\n self.appendResult(res, actual ,expected, feedback)\\n\\n def assertNotEqual(self, actual, expected, feedback=\\\"\\\"):\\n res = actual != expected\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not equal %s\\\" % (str(actual),str(expected))\\n self.appendResult(res, actual, expected, feedback)\\n\\n def assertTrue(self,x, feedback=\\\"\\\"):\\n res = bool(x) is True\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be True\\\" % (str(x))\\n self.appendResult(res, x, True, feedback)\\n\\n def assertFalse(self,x, feedback=\\\"\\\"):\\n res = not bool(x)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be False\\\" % (str(x))\\n self.appendResult(res, x, False, feedback)\\n\\n def assertIs(self,a,b, feedback=\\\"\\\"):\\n res = a is b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be the same object as %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsNot(self,a,b, feedback=\\\"\\\"):\\n res = a is not b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be the same object as %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsNone(self,x, feedback=\\\"\\\"):\\n res = x is None\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be None\\\" % (str(x))\\n self.appendResult(res, x, None, feedback)\\n\\n def assertIsNotNone(self,x, feedback=\\\"\\\"):\\n res = x is not None\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be None\\\" % (str(x))\\n self.appendResult(res, x, None, feedback)\\n\\n def assertIn(self, a, b, feedback=\\\"\\\"):\\n res = a in b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be in %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotIn(self, a, b, feedback=\\\"\\\"):\\n res = a not in b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be in %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertIsInstance(self,a,b, feedback=\\\"\\\"):\\n res = isinstance(a,b)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be an instance of %s\\\" % (str(a), str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotIsInstance(self,a,b, feedback=\\\"\\\"):\\n res = not isinstance(a,b)\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not be an instance of %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertRegex(self, text, expected_regex, feedback=\\\"\\\"):\\n \\\"\\\"\\\"Fail the test unless the text matches the regular expression.\\\"\\\"\\\"\\n if isinstance(expected_regex, (str, )): #bytes\\n assert expected_regex, \\\"expected_regex must not be empty.\\\"\\n expected_regex = re.compile(expected_regex)\\n if not expected_regex.search(text):\\n res = False\\n if feedback == \\\"\\\":\\n feedback = \\\"Regex didn't match: %r not found in %r\\\" % (\\n repr(expected_regex), text)\\n else:\\n res = True\\n self.appendResult(res, text, expected_regex, feedback)\\n\\n def assertNotRegex(self, text, unexpected_regex, feedback=\\\"\\\"):\\n \\\"\\\"\\\"Fail the test if the text matches the regular expression.\\\"\\\"\\\"\\n if isinstance(unexpected_regex, (str, )): # bytes\\n unexpected_regex = re.compile(unexpected_regex)\\n match = unexpected_regex.search(text)\\n if match:\\n feedback = 'Regex matched: %r matches %r in %r' % (\\n text[match.start() : match.end()],\\n repr(unexpected_regex),\\n text)\\n # _formatMessage ensures the longMessage option is respected\\n self.appendResult(not bool(match), text, unexpected_regex, feedback)\\n\\n def assertAlmostEqual(self, a, b, places=7, feedback=\\\"\\\", delta=None):\\n\\n if delta is not None:\\n res = abs(a-b) <= delta\\n else:\\n if places is None:\\n places = 7\\n res = round(a-b, places) == 0\\n \\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to equal %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertNotAlmostEqual(self, a, b, places=7, feedback=\\\"\\\", delta=None):\\n\\n if delta is not None:\\n res = not (a == b) and abs(a - b) > delta\\n else:\\n if places is None:\\n places = 7\\n\\n res = round(a-b, places) != 0\\n\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to not equal %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertGreater(self,a,b, feedback=\\\"\\\"):\\n res = a > b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be greater than %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertGreaterEqual(self,a,b, feedback=\\\"\\\"):\\n res = a >= b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be >= %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertLess(self, a, b, feedback=\\\"\\\"):\\n res = a < b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be less than %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def assertLessEqual(self,a,b, feedback=\\\"\\\"):\\n res = a <= b\\n if not res and feedback == \\\"\\\":\\n feedback = \\\"Expected %s to be <= %s\\\" % (str(a),str(b))\\n self.appendResult(res, a, b, feedback)\\n\\n def appendResult(self,res,actual,expected,feedback):\\n if res:\\n msg = 'Pass'\\n self.assertPassed += 1\\n else:\\n msg = 'Fail: ' + feedback\\n print(msg)\\n self.assertFailed += 1\\n\\n def assertRaises(self, expected_exception, *args, **kwargs):\\n context = _AssertRaisesContext(expected_exception, self)\\n try:\\n return context.handle('assertRaises', args, kwargs)\\n finally:\\n # bpo-23890: manually break a reference cycle\\n context = None\\n\\n def assertRaisesRegex(self, expected_exception, expected_regex,\\n *args, **kwargs):\\n context = _AssertRaisesContext(expected_exception, self, expected_regex)\\n return context.handle('assertRaisesRegex', args, kwargs)\\n\\n def fail(self, msg=None):\\n if msg is None:\\n msg = 'Fail'\\n else:\\n msg = 'Fail: ' + msg\\n print(msg)\\n self.assertFailed += 1\\n\\n def showSummary(self):\\n # don't divde by zero\\n # pct = self.numPassed / (self.numPassed+self.numFailed) * 100\\n print(\\\"Ran %d tests, passed: %d failed: %d\\\\n\\\" % (self.numPassed+self.numFailed,\\n self.numPassed, self.numFailed))\\n\\n\\n\\ndef main(verbosity=1):\\n glob = globals() # globals() still needs work\\n for name in glob:\\n if type(glob[name]) == type and issubclass(glob[name], TestCase):\\n try:\\n tc = glob[name]()\\n tc.verbosity = verbosity\\n tc.main()\\n except:\\n print(\\\"Uncaught Error in: \\\", name)\\n\",\"src/lib/unittest/gui.py\":\"import document\\nfrom unittest import TestCase\\nfrom urllib.request import urlopen\\nfrom time import sleep\\n\\n\\nclass TestCaseGui(TestCase):\\n def __init__(self):\\n TestCase.__init__(self)\\n self.closestDiv = document.currentDiv()\\n self.divid = document.currentGradingContainer()\\n self.mydiv = document.getElementById(self.divid)\\n # If there is no div then create a dummy to avoid errors when running\\n # grading \\\"off screen\\\"\\n if self.mydiv is None:\\n self.mydiv = document.createElement(\\\"div\\\")\\n self.mydiv.id = self.divid + \\\"_offscreen_unit_results\\\"\\n self.mydiv.style.display = \\\"none\\\"\\n body = document.getElementsByTagName(\\\"body\\\")[0]\\n body.appendChild(self.mydiv)\\n self.unit_results_divid = self.divid + \\\"_offscreen_unit_results\\\"\\n\\n res = document.getElementById(self.divid + \\\"_unit_results\\\")\\n if res:\\n self.resdiv = res\\n res.innerHTML = \\\"\\\"\\n self.unit_results_divid = self.divid + \\\"_unit_results\\\"\\n else:\\n self.resdiv = document.createElement(\\\"div\\\")\\n self.resdiv.id = self.divid + \\\"_unit_results\\\"\\n self.resdiv.classList.add(\\\"unittest-results\\\")\\n self.mydiv.appendChild(self.resdiv)\\n self.unit_results_divid = self.divid + \\\"_unit_results\\\"\\n\\n def main(self):\\n t = document.createElement(\\\"table\\\")\\n self.resTable = t\\n x = self.resdiv.closest(\\\".timedComponent\\\")\\n if x:\\n self.is_timed = True\\n else:\\n self.is_timed = False\\n self.resdiv.appendChild(self.resTable)\\n if self.is_timed:\\n self.resdiv.style.display = \\\"none\\\"\\n\\n headers = [\\\"Result\\\", \\\"Actual Value\\\", \\\"Expected Value\\\", \\\"Notes\\\"]\\n row = document.createElement(\\\"tr\\\")\\n for item in headers:\\n head = document.createElement(\\\"th\\\")\\n head.classList.add(\\\"ac-feedback\\\")\\n head.innerHTML = item\\n head.style.textAlign = \\\"center\\\"\\n row.appendChild(head)\\n self.resTable.appendChild(row)\\n\\n for func in self.tlist:\\n try:\\n self.setUp()\\n func()\\n self.tearDown()\\n except Exception as e:\\n self.appendResult(\\\"Error\\\", None, None, str(e).split(\\\"on line\\\")[0])\\n self.numFailed += 1\\n self.showSummary()\\n\\n def getOutput(self):\\n sleep(0.2)\\n # self.divid will be the gradingWrapper when in grading mode\\n if self.closestDiv != self.divid:\\n output = document.querySelector(\\n \\\"#{} #{}_stdout\\\".format(self.divid, self.closestDiv)\\n )\\n else:\\n output = document.getElementById(self.divid + \\\"_stdout\\\")\\n return output.innerText\\n\\n def getEditorText(self):\\n return document.getCurrentEditorValue()\\n\\n def appendResult(self, res, actual, expected, param):\\n trimActual = False\\n if len(str(actual)) > 15:\\n trimActual = True\\n actualType = type(actual)\\n trimExpected = False\\n if len(str(expected)) > 15:\\n trimExpected = True\\n expectedType = type(expected)\\n row = document.createElement(\\\"tr\\\")\\n err = False\\n if res == \\\"Error\\\":\\n err = True\\n msg = \\\"Error: %s\\\" % param\\n errorData = document.createElement(\\\"td\\\")\\n errorData.classList.add(\\\"ac-feedback\\\")\\n errorData.innerHTML = \\\"ERROR\\\"\\n errorData.style.backgroundColor = \\\"#de8e96\\\"\\n errorData.style.textAlign = \\\"center\\\"\\n row.appendChild(errorData)\\n elif res:\\n passed = document.createElement(\\\"td\\\")\\n passed.classList.add(\\\"ac-feedback\\\")\\n passed.innerHTML = \\\"Pass\\\"\\n passed.style.backgroundColor = \\\"#83d382\\\"\\n passed.style.textAlign = \\\"center\\\"\\n row.appendChild(passed)\\n self.numPassed += 1\\n else:\\n fail = document.createElement(\\\"td\\\")\\n fail.classList.add(\\\"ac-feedback\\\")\\n fail.innerHTML = \\\"Fail\\\"\\n fail.style.backgroundColor = \\\"#de8e96\\\"\\n fail.style.textAlign = \\\"center\\\"\\n row.appendChild(fail)\\n self.numFailed += 1\\n\\n act = document.createElement(\\\"td\\\")\\n act.classList.add(\\\"ac-feedback\\\")\\n if trimActual:\\n actHTML = str(actual)[:5] + \\\"...\\\" + str(actual)[-5:]\\n if actualType == str:\\n actHTML = repr(actHTML)\\n act.innerHTML = actHTML\\n else:\\n act.innerHTML = repr(actual)\\n act.style.textAlign = \\\"center\\\"\\n row.appendChild(act)\\n\\n expect = document.createElement(\\\"td\\\")\\n expect.classList.add(\\\"ac-feedback\\\")\\n\\n if trimExpected:\\n expectedHTML = str(expected)[:5] + \\\"...\\\" + str(expected)[-5:]\\n if expectedType == str:\\n expectedHTML = repr(expectedHTML)\\n expect.innerHTML = expectedHTML\\n else:\\n expect.innerHTML = repr(expected)\\n expect.style.textAlign = \\\"center\\\"\\n row.appendChild(expect)\\n inp = document.createElement(\\\"td\\\")\\n inp.classList.add(\\\"ac-feedback\\\")\\n\\n if err:\\n inp.innerHTML = msg\\n else:\\n inp.innerHTML = param\\n inp.style.textAlign = \\\"center\\\"\\n row.appendChild(inp)\\n\\n def foo(evt):\\n document.popup(expandmsg)\\n\\n if trimActual or trimExpected:\\n expandbutton = document.createElement(\\\"button\\\")\\n expandbutton.innerHTML = \\\"Expand Differences\\\"\\n expandmsg = \\\"Actual: \\\" + str(actual) + \\\"\\\\nExpected: \\\" + str(expected)\\n expandbutton.value = expandmsg\\n expandbutton.type = \\\"button\\\"\\n expandbutton.addEventListener(\\\"click\\\", foo)\\n expandbutton.classList.add(\\\"btn\\\", \\\"btn-info\\\")\\n row.appendChild(expandbutton)\\n\\n self.resTable.appendChild(row)\\n\\n def showSummary(self):\\n pct = float(self.numPassed) / (self.numPassed + self.numFailed) * 100\\n pctcorrect = (\\n \\\"percent:\\\"\\n + str(pct)\\n + \\\":passed:\\\"\\n + str(self.numPassed)\\n + \\\":failed:\\\"\\n + str(self.numFailed)\\n )\\n pTag = document.createElement(\\\"p\\\")\\n if not self.is_timed:\\n pTag.innerHTML = \\\"You passed: \\\" + str(pct) + \\\"% of the tests\\\"\\n self.resdiv.appendChild(pTag)\\n try:\\n jseval(\\n \\\"window.componentMap['{}'].pct_correct = {}\\\".format(\\n self.closestDiv, pct\\n )\\n )\\n jseval(\\n \\\"window.componentMap['{}'].unit_results = '{}'\\\".format(\\n self.closestDiv, pctcorrect\\n )\\n )\\n jseval(\\n \\\"window.componentMap['{}'].unit_results_divid = '{}'\\\".format(\\n self.closestDiv, self.mydiv.getAttribute(\\\"id\\\")\\n )\\n )\\n\\n except:\\n print(\\n \\\"failed to find object to record unittest results in {}! {}\\\".format(\\n self.closestDiv, pctcorrect\\n )\\n )\\n\",\"src/lib/urllib2.py\":\"import _sk_fail; _sk_fail._(\\\"urllib2\\\")\\n\",\"src/lib/urlparse.py\":\"import _sk_fail; _sk_fail._(\\\"urlparse\\\")\\n\",\"src/lib/user.py\":\"import _sk_fail; _sk_fail._(\\\"user\\\")\\n\",\"src/lib/uu.py\":\"import _sk_fail; _sk_fail._(\\\"uu\\\")\\n\",\"src/lib/warnings.py\":\"import _sk_fail; _sk_fail._(\\\"warnings\\\")\\n\",\"src/lib/wave.py\":\"import _sk_fail; _sk_fail._(\\\"wave\\\")\\n\",\"src/lib/weakref.py\":\"import _sk_fail; _sk_fail._(\\\"weakref\\\")\\n\",\"src/lib/whichdb.py\":\"import _sk_fail; _sk_fail._(\\\"whichdb\\\")\\n\",\"src/lib/wsgiref/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"wsgiref\\\")\\n\",\"src/lib/xdrlib.py\":\"import _sk_fail; _sk_fail._(\\\"xdrlib\\\")\\n\",\"src/lib/xml/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"xml\\\")\\n\",\"src/lib/xml/dom/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"dom\\\")\\n\",\"src/lib/xml/etree/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"etree\\\")\\n\",\"src/lib/xml/parsers/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"parsers\\\")\\n\",\"src/lib/xml/sax/__init__.py\":\"import _sk_fail; _sk_fail._(\\\"sax\\\")\\n\",\"src/lib/xmllib.py\":\"import _sk_fail; _sk_fail._(\\\"xmllib\\\")\\n\",\"src/lib/xmlrpclib.py\":\"import _sk_fail; _sk_fail._(\\\"xmlrpclib\\\")\\n\",\"src/lib/zipfile.py\":\"import _sk_fail; _sk_fail._(\\\"zipfile\\\")\\n\",\"src/builtin/sys.js\":\"var $builtinmodule=function(i){var t,n={},e=[],u=Sk.getSysArgv();for(t=0;tnew Sk.builtin.str(\\\"utf-8\\\"))),n.getExecutionLimit=new Sk.builtin.func((function(){return null===Sk.execLimit?Sk.builtin.none.none$:new Sk.builtin.int_(Sk.execLimit)})),n.setExecutionLimit=new Sk.builtin.func((function(i){if(null===Sk.execLimit)throw new Sk.builtin.NotImplementedError(\\\"Execution limiting is not enabled\\\");void 0!==i&&(Sk.execLimit=Sk.builtin.asnum$(i))})),n.resetTimeout=new Sk.builtin.func((function(){Sk.execStart=new Date})),n.getYieldLimit=new Sk.builtin.func((function(){return null===Sk.yieldLimit?Sk.builtin.none.none$:new Sk.builtin.int_(Sk.yieldLimit)})),n.setYieldLimit=new Sk.builtin.func((function(i){if(null===Sk.yieldLimit)throw new Sk.builtin.NotImplementedError(\\\"Yielding is not enabled\\\");void 0!==i&&(Sk.yieldLimit=Sk.builtin.asnum$(i))})),n.debug=new Sk.builtin.func((function(){return Sk.builtin.none.none$}));const s=Sk.builtin.make_structseq(\\\"sys\\\",\\\"float_info\\\",{max:\\\"DBL_MAX -- maximum representable finite float\\\",max_exp:\\\"DBL_MAX_EXP -- maximum int e such that radix**(e-1) is representable\\\",max_10_exp:\\\"DBL_MAX_10_EXP -- maximum int e such that 10**e is representable\\\",min:\\\"DBL_MIN -- Minimum positive normalized float\\\",min_exp:\\\"DBL_MIN_EXP -- minimum int e such that radix**(e-1) is a normalized float\\\",min_10_exp:\\\"DBL_MIN_10_EXP -- minimum int e such that 10**e is a normalized\\\",dig:\\\"DBL_DIG -- digits\\\",mant_dig:\\\"DBL_MANT_DIG -- mantissa digits\\\",epsilon:\\\"DBL_EPSILON -- Difference between 1 and the next representable float\\\",radix:\\\"FLT_RADIX -- radix of exponent\\\",rounds:\\\"FLT_ROUNDS -- rounding mode\\\"});n.float_info=new s([Number.MAX_VALUE,Math.floor(Math.log2(Number.MAX_VALUE)),Math.floor(Math.log10(Number.MAX_VALUE)),Number.MIN_VALUE,Math.ceil(Math.log2(Number.MIN_VALUE)),Math.ceil(Math.log10(Number.MIN_VALUE)),15,Math.log2(Number.MAX_SAFE_INTEGER),Number.EPSILON,2,1].map((i=>Sk.ffi.remapToPy(i))));const o=Sk.builtin.make_structseq(\\\"sys\\\",\\\"int_info\\\",{bits_per_digit:\\\"size of a digit in bits\\\",sizeof_digit:\\\"size in bytes of the C type used to represent a digit\\\"});n.int_info=new o([30,4].map((i=>Sk.ffi.remapToPy(i))));const l=Sk.builtin.make_structseq(\\\"sys\\\",\\\"hash_info\\\",{width:\\\"width of the type used for hashing, in bits\\\",modulus:\\\"prime number giving the modulus on which the hash function is based\\\",inf:\\\"value to be used for hash of a positive infinity\\\",nan:\\\"value to be used for hash of a nan\\\",imag:\\\"multiplier used for the imaginary part of a complex number\\\",algorithm:\\\"name of the algorithm for hashing of str, bytes and memoryviews\\\",hash_bits:\\\"internal output size of hash algorithm\\\",seed_bits:\\\"seed size of hash algorithm\\\",cutoff:\\\"small string optimization cutoff\\\"});return n.hash_info=new l([32,536870911,314159,0,1000003,\\\"siphash24\\\",32,128,0].map((i=>Sk.ffi.remapToPy(i)))),n.__stdout__=new Sk.builtin.file(new Sk.builtin.str(\\\"/dev/stdout\\\"),new Sk.builtin.str(\\\"w\\\")),n.__stdin__=new Sk.builtin.file(new Sk.builtin.str(\\\"/dev/stdin\\\"),new Sk.builtin.str(\\\"r\\\")),n.__stderr__=new Sk.builtin.file(new Sk.builtin.str(\\\"/dev/stderr\\\"),new Sk.builtin.str(\\\"w\\\")),n.stdout=n.__stdout__,n.stdin=n.__stdin__,n.stderr=n.__stderr__,n};\",\"src/lib/JoBase.js\":\"const $builtinmodule=()=>{Sk.misceval.print_(\\\"Welcome to JoBase\\\\n\\\");const e=Sk.JoBase,o={},t=[],r=[],n=e.getContext(\\\"webgl\\\"),a=n.createProgram(),c=n.createBuffer(),i=n.createShader(n.VERTEX_SHADER),s=n.createShader(n.FRAGMENT_SHADER),str=e=>new Sk.builtin.str(e),def=e=>new Sk.builtin.func(e),float=e=>new Sk.builtin.float_(e),int=e=>new Sk.builtin.int_(e),bool=e=>new Sk.builtin.bool(e),tuple=e=>new Sk.builtin.tuple(e),number=e=>{if(Sk.builtin.checkNumber(e))return e.v;throw new Sk.builtin.TypeError(\\\"must be real number, not \\\"+e.tp$name)},string=e=>{if(Sk.builtin.checkString(e))return e.v;throw new Sk.builtin.TypeError(\\\"must be str, not \\\"+e.tp$name)},property=(...e)=>call(Sk.builtins.property,...e),build=(...e)=>Sk.misceval.buildClass(o,...e),call=(...e)=>Sk.misceval.callsimOrSuspend(...e),is=(...e)=>Sk.builtin.isinstance(...e).v,wait=e=>Sk.misceval.promiseToSuspension(new Promise(e)),object=e=>{throw new Sk.builtin.TypeError(\\\"must be Shape or cursor, not \\\"+e.tp$name)},path=e=>str(\\\"https://jobase.org/Browser/JoBase/\\\"+e),width=()=>e.width/devicePixelRatio,height=()=>e.height/devicePixelRatio,x=()=>o.cursor.$x-width()/2,y=()=>height()/2-o.cursor.$y,blank=()=>{},mouseEnter=()=>o.cursor.$enter=!0,mouseLeave=()=>o.cursor.$leave=!0,mouseDown=()=>{o.cursor.$press=!0,o.cursor.$hold=!0},mouseUp=()=>{o.cursor.$release=!0,o.cursor.$hold=!1},mouseMove=t=>{const r=e.getBoundingClientRect();o.cursor.$x=t.clientX-r.left,o.cursor.$y=t.clientY-r.top,o.cursor.$move=!0},keyDown=e=>{const t=Object.keys(o.key.$data).find((t=>o.key.$data[t].code==e.code)),r=o.key.$data[t];e.repeat?(o.key.$repeat=!0,r&&(r.repeat=!0)):(o.key.$press=!0,r&&(r.press=!0)&&(r.hold=!0))},keyUp=e=>{const t=Object.keys(o.key.$data).find((t=>o.key.$data[t].code==e.code)),r=o.key.$data[t];o.key.$release=!0,r&&(r.release=!0)&&(r.hold=!1)},collidePolyPoint=(e,o)=>e.reduce(((e,t,r,n)=>{const a=n[r+1==n.length?0:r+1];return o[0]<(a[0]-t[0])*(o[1]-t[1])/(a[1]-t[1])+t[0]&&(t[1]>o[1]&&a[1]o[1])?!e:e}),!1),getRectPoly=e=>{const o=e.$anchor[0]+e.$size[0]*e.$scale[0]/2,t=e.$anchor[1]+e.$size[1]*e.$scale[1]/2;return((e,o,t)=>{const r=Math.cos(o*Math.PI/180),n=Math.sin(o*Math.PI/180);return e.map((e=>[e[0]*r-e[1]*n+t[0],e[0]*n+e[1]*r+t[1]]))})([[-o,t],[o,t],[o,-t],[-o,-t]],e.$angle,e.$pos)},createImage=e=>{const o=n.createTexture();return n.bindTexture(n.TEXTURE_2D,o),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),o},renderText=e=>{const o=document.createElement(\\\"canvas\\\"),t=o.getContext(\\\"2d\\\"),a=e.$fontSize+\\\"px _\\\"+r.indexOf(e.$font);t.font=a;const c=t.measureText(e.$content),i=c.actualBoundingBoxRight-c.actualBoundingBoxLeft,s=t.measureText(\\\"Sy\\\"),d=s.actualBoundingBoxDescent+s.actualBoundingBoxAscent;e.$size[0]=o.width=i,e.$size[1]=o.height=d,t.font=a,t.fillStyle=\\\"#fff\\\",t.fillText(e.$content,0,s.actualBoundingBoxAscent),n.deleteTexture(e.$texture),e.$texture=createImage(o)},loadFont=e=>new Promise(((o,t)=>{if(r.includes(e))return o();new FontFace(\\\"_\\\"+r.length,`url(${e})`).load().then((t=>{document.fonts.add(t),r.push(e),o()})).catch((()=>{return t((o=`failed to load font: \\\"${e}\\\"`,new Sk.builtin.FileNotFoundError(o)));var o}))})),drawShape=(e,o,t,r,c,i)=>{const s=o[0]*e.$scale[0],d=o[1]*e.$scale[1],l=e.$anchor[0],u=e.$anchor[1],$=e.$pos[0],p=e.$pos[1],m=Math.sin(e.$angle*Math.PI/180),f=Math.cos(e.$angle*Math.PI/180);var h,_;h=[s*f,s*m,0,0,d*-m,d*f,0,0,0,0,1,0,l*f+u*-m+$,l*m+u*f+p,0,1],_=e.$color,n.uniform4fv(n.getUniformLocation(a,\\\"color\\\"),new Float32Array(_)),n.uniformMatrix4fv(n.getUniformLocation(a,\\\"object\\\"),!1,new Float32Array(h)),n.bindBuffer(n.ARRAY_BUFFER,t),n.uniform1i(n.getUniformLocation(a,\\\"image\\\"),c),n.drawArrays(r,0,i)},d=def(((e,t)=>{if(is(e,o.Rectangle)){if(is(t,o.Rectangle))return bool((r=getRectPoly(e),n=getRectPoly(t),collidePolyPoint(r,n[0])||collidePolyPoint(n,r[0])||r.find(((e,o,t)=>((e,o,t)=>e.find(((e,r,n)=>((e,o,t,r)=>{const n=(r[1]-t[1])*(o[0]-e[0])-(r[0]-t[0])*(o[1]-e[1]),a=((r[0]-t[0])*(e[1]-t[1])-(r[1]-t[1])*(e[0]-t[0]))/n,c=((o[0]-e[0])*(e[1]-t[1])-(o[1]-e[1])*(e[0]-t[0]))/n;return a>=0&&a<=1&&c>=0&&c<=1})(o,t,e,n[r+1==n.length?0:r+1]))))(n,e,t[o+1==t.length?0:o+1])))));if(t==o.cursor)return bool(collidePolyPoint(getRectPoly(e),[x(),y()]));object(t)}var r,n;if(e==o.cursor){if(is(t,o.Rectangle))return bool(collidePolyPoint(getRectPoly(t),[x(),y()]));if(t==o.cursor)return Sk.builtins.bool.true$;object(t)}object(e)})),l={set:(e,o)=>{if(e.ob$type==l.class)o.forEach(((o,t,r)=>r[t]=tr[t]=t{const r=call(l.class);return r.$parent=e,r.$get=o,r.$data=t.map((e=>({name:e[0],set:e[1]}))),r},class:build(((e,o)=>{o.__getattr__=def(((e,o)=>{const t=e.$data.findIndex((e=>e.name==o.v));if(-1!=t)return float(e.$get()[t])})),o.__setattr__=def(((e,o,t)=>{const r=e.$data.find((e=>e.name==o.v));r&&r.set(e.$parent,t)})),o.__str__=def((e=>str(`(${e.$get().join(\\\", \\\")})`))),o.__repr__=def((e=>str(`[${e.$get().join(\\\", \\\")}]`)))}),\\\"Vector\\\")},u={new:(e,o,t,r,n)=>{e.$color=l.set(n,[0,0,0,1]),e.$pos=[number(o),number(t)],e.$angle=number(r),e.$anchor=[0,0],e.$scale=[1,1]},class:build(((e,t)=>{t.collides_with=d,t.look_at=def(((e,t)=>{const set=(o,t)=>{const r=Math.atan2(t-e.$pos[1],o-e.$pos[0]);e.$angle=180*r/Math.PI};t==o.cursor?set(x(),y()):is(t,u.class)?set(...t.$pos):object(t)})),t.move_toward=def(((e,t,r)=>{const n=number(r)??1,set=(o,t)=>{const r=o-e.$pos[0],a=t-e.$pos[1];Math.hypot(r,a)e.$pos[0]=number(o),y=(e,o)=>e.$pos[1]=number(o);t.x=property(def((e=>float(e.$pos[0]))),def(x)),t.y=property(def((e=>float(e.$pos[1]))),def(y)),t.pos=t.position=property(def((e=>l.new(e,(()=>e.$pos),[\\\"x\\\",x],[\\\"y\\\",y]))),def(((e,o)=>l.set(o,e.$pos)))),t.top=property(def((e=>float(e.$top()))),def(((e,o)=>e.$pos[1]+=o-e.$top()))),t.left=property(def((e=>float(e.$left()))),def(((e,o)=>e.$pos[0]+=o-e.$left()))),t.bottom=property(def((e=>float(e.$bottom()))),def(((e,o)=>e.$pos[1]+=o-e.$bottom()))),t.right=property(def((e=>float(e.$right()))),def(((e,o)=>e.$pos[0]+=o-e.$right())));const scaleX=(e,o)=>e.$scale[0]=number(o),scaleY=(e,o)=>e.$scale[1]=number(o);t.scale=property(def((e=>l.new(e,(()=>e.$scale),[\\\"x\\\",scaleX],[\\\"y\\\",scaleY]))),def(((e,o)=>l.set(o,e.$scale))));const anchorX=(e,o)=>e.$anchor[0]=number(o),anchorY=(e,o)=>e.$anchor[1]=number(o);t.anchor=property(def((e=>l.new(e,(()=>e.$anchor),[\\\"x\\\",anchorX],[\\\"y\\\",anchorY]))),def(((e,o)=>l.set(o,e.$anchor)))),t.angle=property(def((e=>float(e.$angle))),def(((e,o)=>e.$angle=number(o))));const red=(e,o)=>e.$color[0]=number(o),green=(e,o)=>e.$color[1]=number(o),blue=(e,o)=>e.$color[2]=number(o),alpha=(e,o)=>e.$color[3]=number(o);t.red=property(def((e=>float(e.$color[0]))),def(red)),t.green=property(def((e=>float(e.$color[1]))),def(green)),t.blue=property(def((e=>float(e.$color[2]))),def(blue)),t.blue=property(def((e=>float(e.$color[3]))),def(alpha)),t.color=property(def((e=>l.new(e,(()=>e.$color),[\\\"red\\\",red],[\\\"green\\\",green],[\\\"blue\\\",blue],[\\\"alpha\\\",alpha]))),def(((e,o)=>l.set(o,e.$color))))}),\\\"Shape\\\")};return o.MAN=path(\\\"images/man.png\\\"),o.COIN=path(\\\"images/coin.png\\\"),o.ENEMY=path(\\\"images/enemy.png\\\"),o.DEFAULT=path(\\\"fonts/default.ttf\\\"),o.CODE=path(\\\"fonts/code.ttf\\\"),o.PENCIL=path(\\\"fonts/pencil.ttf\\\"),o.SERIF=path(\\\"fonts/serif.ttf\\\"),o.HANDWRITING=path(\\\"fonts/handwriting.ttf\\\"),o.TYPEWRITER=path(\\\"fonts/typewriter.ttf\\\"),o.JOINED=path(\\\"fonts/joined.ttf\\\"),o.window=call(build(((e,o)=>{const init=(e,o,t,r,a)=>{e.$caption=string(o),e.$color=l.set(a,[1,1,1]),n.clearColor(...e.$color,1)};init.$defaults=[str(\\\"JoBase\\\"),null,null,tuple()],init.co_varnames=[\\\"self\\\",\\\"caption\\\",\\\"width\\\",\\\"height\\\",\\\"color\\\"],o.__init__=def(init),o.close=def((e=>e.$close=!0)),o.maximize=def(blank),o.minimize=def(blank),o.focus=def(blank),o.caption=property(def((e=>str(e.$caption))),def(((e,o)=>e.$caption=string(o))));const red=(e,o)=>{e.$color[0]=number(o),n.clearColor(...e.$color,1)},green=(e,o)=>{e.$color[1]=number(o),n.clearColor(...e.$color,1)},blue=(e,o)=>{e.$color[2]=number(o),n.clearColor(...e.$color,1)};o.red=property(def((e=>float(e.$color[0]))),def(red)),o.green=property(def((e=>float(e.$color[1]))),def(green)),o.blue=property(def((e=>float(e.$color[2]))),def(blue)),o.color=property(def((e=>l.new(e,(()=>e.$color),[\\\"red\\\",red],[\\\"green\\\",green],[\\\"blue\\\",blue]))),def(((e,o)=>n.clearColor(...l.set(o,e.$color),1)))),o.width=property(def((()=>float(width())))),o.height=property(def((()=>float(height())))),o.size=property(def((e=>l.new(e,(()=>[width(),height()]),[\\\"x\\\",blank],[\\\"y\\\",blank]))),def(((e,o)=>l.set(o,new Array(2))))),o.top=property(def((()=>float(height()/2)))),o.bottom=property(def((()=>float(height()/-2)))),o.left=property(def((()=>float(width()/-2)))),o.right=property(def((()=>float(width()/2)))),o.resize=property(def((e=>bool(e.$resize))))}),\\\"Window\\\")),o.cursor=call(build(((e,o)=>{o.x=property(def((()=>float(x())))),o.y=property(def((()=>float(y())))),o.pos=o.position=property(def((e=>l.new(e,(()=>[x(),y()]),[\\\"x\\\",blank],[\\\"y\\\",blank]))),def(((e,o)=>l.set(o,new Array(2))))),o.move=property(def((e=>bool(e.$move)))),o.enter=property(def((e=>bool(e.$enter)))),o.leave=property(def((e=>bool(e.$leave)))),o.press=property(def((e=>bool(e.$press)))),o.release=property(def((e=>bool(e.$release)))),o.hold=property(def((e=>bool(e.$hold))))}),\\\"Cursor\\\")),o.cursor.$x=0,o.cursor.$y=0,o.key=call(build(((e,o)=>{o.__getattr__=def(((e,o)=>{const t=e.$data[o.v];if(t)return t.hold||t.release?(r=[str(\\\"press\\\"),bool(t.press),str(\\\"release\\\"),bool(t.release),str(\\\"repeat\\\"),bool(t.repeat)],new Sk.builtin.dict(r)):Sk.builtin.bool.false$;var r})),o.hold=property(def((e=>{for(const o in e.$data)if(e.$data[o].hold)return Sk.builtin.bool.true$;return Sk.builtin.bool.false$}))),o.press=property(def((e=>bool(e.$press)))),o.release=property(def((e=>bool(e.$release)))),o.repeat=property(def((e=>bool(e.$repeat))))}),\\\"Key\\\")),o.key.$data={space:{code:\\\"Space\\\"},apostrophe:{code:\\\"Quote\\\"},comma:{code:\\\"Comma\\\"},minus:{code:\\\"Minus\\\"},period:{code:\\\"Period\\\"},slash:{code:\\\"Slash\\\"},_0:{code:\\\"Digit0\\\"},_1:{code:\\\"Digit1\\\"},_2:{code:\\\"Digit2\\\"},_3:{code:\\\"Digit3\\\"},_4:{code:\\\"Digit4\\\"},_5:{code:\\\"Digit5\\\"},_6:{code:\\\"Digit6\\\"},_7:{code:\\\"Digit7\\\"},_8:{code:\\\"Digit8\\\"},_9:{code:\\\"Digit9\\\"},semicolon:{code:\\\"Semicolon\\\"},equal:{code:\\\"Equal\\\"},a:{code:\\\"KeyA\\\"},b:{code:\\\"KeyB\\\"},c:{code:\\\"KeyC\\\"},d:{code:\\\"KeyD\\\"},e:{code:\\\"KeyE\\\"},f:{code:\\\"KeyF\\\"},g:{code:\\\"KeyG\\\"},h:{code:\\\"KeyH\\\"},i:{code:\\\"KeyI\\\"},j:{code:\\\"KeyJ\\\"},k:{code:\\\"KeyK\\\"},l:{code:\\\"KeyL\\\"},m:{code:\\\"KeyM\\\"},n:{code:\\\"KeyN\\\"},o:{code:\\\"KeyO\\\"},p:{code:\\\"KeyP\\\"},q:{code:\\\"KeyQ\\\"},r:{code:\\\"KeyR\\\"},s:{code:\\\"KeyS\\\"},t:{code:\\\"KeyT\\\"},u:{code:\\\"KeyU\\\"},v:{code:\\\"KeyV\\\"},w:{code:\\\"KeyW\\\"},x:{code:\\\"KeyX\\\"},y:{code:\\\"KeyY\\\"},z:{code:\\\"KeyZ\\\"},left_bracket:{code:\\\"BracketLeft\\\"},backslash:{code:\\\"Backslash\\\"},right_bracket:{code:\\\"BracketRight\\\"},backquote:{code:\\\"Backquote\\\"},escape:{code:\\\"Escape\\\"},enter:{code:\\\"Enter\\\"},tab:{code:\\\"Tab\\\"},backspace:{code:\\\"Backspace\\\"},insert:{code:\\\"Insert\\\"},delete:{code:\\\"Delete\\\"},right:{code:\\\"ArrowRight\\\"},left:{code:\\\"ArrowLeft\\\"},down:{code:\\\"ArrowDown\\\"},up:{code:\\\"ArrowUp\\\"},page_up:{code:\\\"PageUp\\\"},page_down:{code:\\\"PageDown\\\"},home:{code:\\\"Home\\\"},end:{code:\\\"End\\\"},caps_lock:{code:\\\"CapsLock\\\"},scroll_lock:{code:\\\"ScrollLock\\\"},num_lock:{code:\\\"NumLock\\\"},print_screen:{code:\\\"PrintScreen\\\"},pause:{code:\\\"Pause\\\"},f1:{code:\\\"F1\\\"},f2:{code:\\\"F2\\\"},f3:{code:\\\"F3\\\"},f4:{code:\\\"F4\\\"},f5:{code:\\\"F5\\\"},f6:{code:\\\"F6\\\"},f7:{code:\\\"F7\\\"},f8:{code:\\\"F8\\\"},f9:{code:\\\"F9\\\"},f10:{code:\\\"F10\\\"},f11:{code:\\\"F11\\\"},f12:{code:\\\"F12\\\"},f13:{code:\\\"F13\\\"},f14:{code:\\\"F14\\\"},f15:{code:\\\"F15\\\"},f16:{code:\\\"F16\\\"},f17:{code:\\\"F17\\\"},f18:{code:\\\"F18\\\"},f19:{code:\\\"F19\\\"},f20:{code:\\\"F20\\\"},f21:{code:\\\"F21\\\"},f22:{code:\\\"F22\\\"},f23:{code:\\\"F23\\\"},f24:{code:\\\"F24\\\"},f25:{code:\\\"F25\\\"},pad_0:{code:\\\"Numpad0\\\"},pad_1:{code:\\\"Numpad1\\\"},pad_2:{code:\\\"Numpad2\\\"},pad_3:{code:\\\"Numpad3\\\"},pad_4:{code:\\\"Numpad4\\\"},pad_5:{code:\\\"Numpad5\\\"},pad_6:{code:\\\"Numpad6\\\"},pad_7:{code:\\\"Numpad7\\\"},pad_8:{code:\\\"Numpad8\\\"},pad_9:{code:\\\"Numpad9\\\"},decimal:{code:\\\"NumpadDecimal\\\"},divide:{code:\\\"NumpadDivide\\\"},multiply:{code:\\\"NumpadMultiply\\\"},subtract:{code:\\\"NumpadSubtract\\\"},add:{code:\\\"NumpadAdd\\\"},enter:{code:\\\"NumpadEnter\\\"},equal:{code:\\\"NumpadEqual\\\"},left_shift:{code:\\\"ShiftLeft\\\"},left_ctrl:{code:\\\"ControlLeft\\\"},left_alt:{code:\\\"AltLeft\\\"},left_super:{code:\\\"SuperLeft\\\"},right_shift:{code:\\\"ShiftRight\\\"},right_ctrl:{code:\\\"ControlRight\\\"},right_alt:{code:\\\"AltRight\\\"},right_super:{code:\\\"SuperRight\\\"},menu:{code:\\\"Menu\\\"}},o.camera=call(build(((e,o)=>{const init=(e,o,t)=>{e.$pos=[number(o),number(t)]};init.$defaults=[int(),int()],init.co_varnames=[\\\"self\\\",\\\"x\\\",\\\"y\\\"],o.__init__=def(init);const x=(e,o)=>e.$pos[0]=number(o),y=(e,o)=>e.$pos[1]=number(o);o.x=property(def((e=>float(e.$pos[0]))),def(x)),o.y=property(def((e=>float(e.$pos[1]))),def(y)),o.pos=o.position=property(def((e=>l.new(e,(()=>e.$pos),[\\\"x\\\",x],[\\\"y\\\",y]))),def(((e,o)=>l.set(o,e.$pos))))}),\\\"Camera\\\")),o.Rectangle=build(((e,o)=>{const init=(e,o,t,r,n,a,c)=>{u.new(e,o,t,a,c),e.$size=[number(r),number(n)],e.$top=()=>{return(o=getRectPoly(e)).reduce(((e,o)=>o[1]>e?o[1]:e),o[0][1]);var o},e.$left=()=>{return(o=getRectPoly(e)).reduce(((e,o)=>o[0]{return(o=getRectPoly(e)).reduce(((e,o)=>o[1]{return(o=getRectPoly(e)).reduce(((e,o)=>o[0]>e?o[0]:e),o[0][0]);var o}};init.$defaults=[int(),int(),int(50),int(50),int(),tuple()],init.co_varnames=[\\\"self\\\",\\\"x\\\",\\\"y\\\",\\\"width\\\",\\\"height\\\",\\\"angle\\\",\\\"color\\\"],o.__init__=def(init),o.draw=def((e=>drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!1,4)));const width=(e,o)=>e.$size[0]=number(o),height=(e,o)=>e.$size[1]=number(o);o.width=property(def((e=>float(e.$size[0]))),def(width)),o.height=property(def((e=>float(e.$size[1]))),def(height)),o.size=property(def((e=>l.new(e,(()=>e.$size),[\\\"width\\\",width],[\\\"height\\\",height]))),def(((e,o)=>l.set(o,e.$size))))}),\\\"Rectangle\\\",[u.class]),o.Image=build(((e,r)=>{const init=(e,r,n,a,c,i,s,d)=>wait(((u,$)=>{call(o.Rectangle.prototype.__init__,e,n,a,i,s,c);const p=t.find((e=>e.name==string(r))),set=o=>{e.$texture=o.source,e.$size[0]||=o.width,e.$size[1]||=o.height};if(e.$color=l.set(d,[1,1,1,1]),p)return set(p),u();const m=new Image;m.crossOrigin=\\\"anonymous\\\",m.src=string(r),m.onerror=()=>$(new Sk.builtin.FileNotFoundError(`failed to load image: \\\"${string(r)}\\\"`)),m.onload=()=>{const e={name:string(r),width:m.width,height:m.height,source:createImage(m)};t.push(e),set(e),u()}}));init.$defaults=[o.MAN,int(),int(),int(),int(),int(),tuple()],init.co_varnames=[\\\"self\\\",\\\"name\\\",\\\"x\\\",\\\"y\\\",\\\"angle\\\",\\\"width\\\",\\\"height\\\",\\\"color\\\"],r.__init__=def(init),r.draw=def((e=>{n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,e.$texture),drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!0,4)}))}),\\\"Image\\\",[o.Rectangle]),o.Text=build(((e,t)=>{const init=(e,t,r,n,a,c,i,s)=>wait(((d,l)=>{call(o.Rectangle.prototype.__init__,e,r,n,int(),int(),c,i),e.$font=string(s),e.$fontSize=number(a),e.$content=string(t),loadFont(e.$font).then((()=>{renderText(e),d()})).catch(l)}));init.$defaults=[str(\\\"Text\\\"),int(),int(),int(50),int(),tuple(),o.DEFAULT],init.co_varnames=[\\\"self\\\",\\\"content\\\",\\\"x\\\",\\\"y\\\",\\\"font_size\\\",\\\"angle\\\",\\\"color\\\",\\\"font\\\"],t.__init__=def(init),t.draw=def((e=>{n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,e.$texture),drawShape(e,e.$size,c,n.TRIANGLE_STRIP,!0,4)})),t.content=property(def((e=>str(e.$content))),def(((e,o)=>{e.$content=string(o),renderText(e)}))),t.font=property(def((e=>str(e.$font))),def(((e,o)=>wait(((t,r)=>{loadFont(e.$font=string(o)).then((()=>{renderText(e),t()})).catch(r)}))))),t.font_size=property(def((e=>float(e.$font_size))),def(((e,o)=>{e.$font_size=number(o),renderText(e)})))}),\\\"Text\\\",[o.Rectangle]),o.random=def(((e,o)=>{const t=Math.min(number(e),number(o));return float(Math.random()*(Math.max(number(e),number(o))-t)+t)})),o.run=def((()=>wait(((r,i)=>{const update=()=>{const final=o=>{n.deleteBuffer(c),n.deleteProgram(a),t.forEach((e=>n.deleteTexture(e.source))),d.disconnect(),e.removeEventListener(\\\"mouseenter\\\",mouseEnter),e.removeEventListener(\\\"mouseleave\\\",mouseLeave),e.removeEventListener(\\\"mousedown\\\",mouseDown),e.removeEventListener(\\\"mouseup\\\",mouseUp),e.removeEventListener(\\\"mousemove\\\",mouseMove),e.removeEventListener(\\\"keydown\\\",keyDown),e.removeEventListener(\\\"keyup\\\",keyUp),cancelAnimationFrame(s.frame),o?i(o):r()};if(o.window.$close||Date.now()-Sk.execStart>Sk.execLimit)return final();const l=o.camera.$pos[0],u=o.camera.$pos[1],$=new Float32Array([2/width(),0,0,0,0,2/height(),0,0,0,0,-2,0,2*-l/width(),2*-u/height(),-1,1]);n.uniformMatrix4fv(n.getUniformLocation(a,\\\"camera\\\"),!1,$),n.clear(n.COLOR_BUFFER_BIT);try{s.main.$d.loop&&call(s.main.$d.loop)}catch(p){final(p)}o.window.$resize=!1,o.cursor.$move=!1,o.cursor.$enter=!1,o.cursor.$leave=!1,o.cursor.$press=!1,o.cursor.$release=!1,o.key.$press=!1,o.key.$release=!1,o.key.$repeat=!1;for(const e in o.key.$data)o.key.$data[e].press=!1,o.key.$data[e].release=!1,o.key.$data[e].repeat=!1},loop=()=>{s.frame=requestAnimationFrame(loop),update()},s={main:Sk.importModule(\\\"__main__\\\",!1,!0),frame:requestAnimationFrame(loop)},d=new MutationObserver((()=>{n.viewport(0,0,e.width,e.height),o.window.$resize=!0,update()}));d.observe(e,{attributes:!0})})))),e.addEventListener(\\\"mouseenter\\\",mouseEnter),e.addEventListener(\\\"mouseleave\\\",mouseLeave),e.addEventListener(\\\"mousedown\\\",mouseDown),e.addEventListener(\\\"mouseup\\\",mouseUp),e.addEventListener(\\\"mousemove\\\",mouseMove),e.addEventListener(\\\"keydown\\\",keyDown),e.addEventListener(\\\"keyup\\\",keyUp),e.tabIndex=0,e.focus(),n.shaderSource(i,\\\"\\\\n attribute vec2 vertex;\\\\n attribute vec2 coordinate;\\\\n varying vec2 position;\\\\n \\\\n uniform mat4 camera;\\\\n uniform mat4 object;\\\\n \\\\n void main(void) {\\\\n gl_Position = camera * object * vec4(vertex, 0, 1);\\\\n position = coordinate;\\\\n }\\\"),n.shaderSource(s,\\\"\\\\n precision mediump float;\\\\n varying vec2 position;\\\\n\\\\n uniform vec4 color;\\\\n uniform sampler2D sampler;\\\\n uniform int image;\\\\n\\\\n void main(void) {\\\\n if (image == 1) gl_FragColor = texture2D(sampler, position) * color;\\\\n else gl_FragColor = color;\\\\n }\\\"),n.compileShader(i),n.compileShader(s),n.attachShader(a,i),n.attachShader(a,s),n.linkProgram(a),n.useProgram(a),n.uniform1i(n.getUniformLocation(a,\\\"sampler\\\"),0),n.deleteShader(i),n.deleteShader(s),n.bindBuffer(n.ARRAY_BUFFER,c),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-.5,.5,0,0,.5,.5,1,0,-.5,-.5,0,1,.5,-.5,1,1]),n.STATIC_DRAW),n.vertexAttribPointer(n.getAttribLocation(a,\\\"vertex\\\"),2,n.FLOAT,!1,16,0),n.vertexAttribPointer(n.getAttribLocation(a,\\\"coordinate\\\"),2,n.FLOAT,!1,16,8),n.enableVertexAttribArray(0),n.enableVertexAttribArray(1),n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),n.pixelStorei(n.UNPACK_ALIGNMENT,1),o};\",\"src/lib/_random.js\":\"var MersenneTwister=function(n){null==n&&(n=(new Date).getTime()),this.N=624,this.M=397,this.MATRIX_A=2567483615,this.UPPER_MASK=2147483648,this.LOWER_MASK=2147483647,this.mt=new Array(this.N),this.mti=this.N+1,this.init_genrand(n)};MersenneTwister.prototype.init_genrand=function(n){for(this.mt[0]=n>>>0,this.mti=1;this.mti>>30,this.mt[this.mti]=(1812433253*((4294901760&n)>>>16)<<16)+1812433253*(65535&n)+this.mti,this.mt[this.mti]>>>=0},MersenneTwister.prototype.init_by_array=function(n,t){var i,e,r;for(this.init_genrand(19650218),i=1,e=0,r=this.N>t?this.N:t;r;r--){var u=this.mt[i-1]^this.mt[i-1]>>>30;this.mt[i]=(this.mt[i]^(1664525*((4294901760&u)>>>16)<<16)+1664525*(65535&u))+n[e]+e,this.mt[i]>>>=0,e++,++i>=this.N&&(this.mt[0]=this.mt[this.N-1],i=1),e>=t&&(e=0)}for(r=this.N-1;r;r--){u=this.mt[i-1]^this.mt[i-1]>>>30;this.mt[i]=(this.mt[i]^(1566083941*((4294901760&u)>>>16)<<16)+1566083941*(65535&u))-i,this.mt[i]>>>=0,++i>=this.N&&(this.mt[0]=this.mt[this.N-1],i=1)}this.mt[0]=2147483648},MersenneTwister.prototype.genrand_int32=function(){var n,t=new Array(0,this.MATRIX_A);if(this.mti>=this.N){var i;for(this.mti==this.N+1&&this.init_genrand(5489),i=0;i>>1^t[1&n];for(;i>>1^t[1&n];n=this.mt[this.N-1]&this.UPPER_MASK|this.mt[0]&this.LOWER_MASK,this.mt[this.N-1]=this.mt[this.M-1]^n>>>1^t[1&n],this.mti=0}return n=this.mt[this.mti++],n^=n>>>11,n^=n<<7&2636928640,n^=n<<15&4022730752,(n^=n>>>18)>>>0},MersenneTwister.prototype.genrand_int31=function(){return this.genrand_int32()>>>1},MersenneTwister.prototype.genrand_real1=function(){return this.genrand_int32()*(1/4294967295)},MersenneTwister.prototype.random=function(){return this.genrand_int32()*(1/4294967296)},MersenneTwister.prototype.genrand_real3=function(){return(this.genrand_int32()+.5)*(1/4294967296)},MersenneTwister.prototype.genrand_res53=function(){return(67108864*(this.genrand_int32()>>>5)+(this.genrand_int32()>>>6))*(1/9007199254740992)};var $builtinmodule=function(n){var t={},i=new MersenneTwister,e=void 0;t.seed=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen(\\\"seed\\\",arguments.length,0,1),n=Sk.builtin.asnum$(n),i=arguments.length>0?new MersenneTwister(n):new MersenneTwister,Sk.builtin.none.none$})),t.random=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"random\\\",arguments.length,0,0),new Sk.builtin.float_(i.genrand_res53())}));var toInt=function(n){return 0|n},randrange=function(n,t,e){var r,u,s;if(!Sk.builtin.checkInt(n))throw new Sk.builtin.ValueError(\\\"non-integer first argument for randrange()\\\");if(void 0===t)return s=toInt(i.genrand_res53()*n),new Sk.builtin.int_(s);if(!Sk.builtin.checkInt(t))throw new Sk.builtin.ValueError(\\\"non-integer stop for randrange()\\\");if(void 0===e&&(e=1),r=t-n,1==e&&r>0)return s=n+toInt(i.genrand_res53()*r),new Sk.builtin.int_(s);if(1==e)throw new Sk.builtin.ValueError(\\\"empty range for randrange() (\\\"+n+\\\", \\\"+t+\\\", \\\"+r+\\\")\\\");if(!Sk.builtin.checkInt(e))throw new Sk.builtin.ValueError(\\\"non-integer step for randrange()\\\");if(e>0)u=toInt((r+e-1)/e);else{if(!(e<0))throw new Sk.builtin.ValueError(\\\"zero step for randrange()\\\");u=toInt((r+e+1)/e)}if(u<=0)throw new Sk.builtin.ValueError(\\\"empty range for randrange()\\\");return s=n+e*toInt(i.genrand_res53()*u),new Sk.builtin.int_(s)};t.randint=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen(\\\"randint\\\",arguments.length,2,2),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),randrange(n,t+1)})),t.randrange=new Sk.builtin.func((function(n,t,i){return Sk.builtin.pyCheckArgsLen(\\\"randrange\\\",arguments.length,1,3),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),i=Sk.builtin.asnum$(i),randrange(n,t,i)})),t.uniform=new Sk.builtin.func((function(n,t){Sk.builtin.pyCheckArgsLen(\\\"uniform\\\",arguments.length,2,2),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t);const e=n+i.genrand_res53()*(t-n);return new Sk.builtin.float_(e)})),t.triangular=new Sk.builtin.func((function(n,t,e){var r,u,s;return Sk.builtin.pyCheckArgsLen(\\\"triangular\\\",arguments.length,2,3),Sk.builtin.pyCheckType(\\\"low\\\",\\\"number\\\",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType(\\\"high\\\",\\\"number\\\",Sk.builtin.checkNumber(t)),(n=Sk.builtin.asnum$(n))>(t=Sk.builtin.asnum$(t))&&(s=n,n=t,t=s),void 0===e||e===Sk.builtin.none.none$?e=(t-n)/2:(Sk.builtin.pyCheckType(\\\"mode\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e)),u=(r=i.genrand_res53())<(e-n)/(t-n)?n+Math.sqrt(r*(t-n)*(e-n)):t-Math.sqrt((1-r)*(t-n)*(t-e)),new Sk.builtin.float_(u)}));var normalSample=function(n,t){var r,u,s,h,l;return void 0!==e?(l=e,e=void 0):(r=i.genrand_res53(),u=i.genrand_res53(),s=Math.sqrt(-2*Math.log(r)),h=2*Math.PI*u,l=s*Math.cos(h),e=s*Math.sin(h)),n+t*l};return t.gauss=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen(\\\"gauss\\\",arguments.length,2,2),Sk.builtin.pyCheckType(\\\"mu\\\",\\\"number\\\",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType(\\\"sigma\\\",\\\"number\\\",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),new Sk.builtin.float_(normalSample(n,t))})),t.normalvariate=t.gauss,t.lognormvariate=new Sk.builtin.func((function(n,t){return Sk.builtin.pyCheckArgsLen(\\\"lognormvariate\\\",arguments.length,2,2),Sk.builtin.pyCheckType(\\\"mu\\\",\\\"number\\\",Sk.builtin.checkNumber(n)),Sk.builtin.pyCheckType(\\\"sigma\\\",\\\"number\\\",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(n),t=Sk.builtin.asnum$(t),new Sk.builtin.float_(Math.exp(normalSample(n,t)))})),t.expovariate=new Sk.builtin.func((function(n){Sk.builtin.pyCheckArgsLen(\\\"expovariate\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"lambd\\\",\\\"number\\\",Sk.builtin.checkNumber(n)),n=Sk.builtin.asnum$(n);var t=i.genrand_res53();return new Sk.builtin.float_(-Math.log(t)/n)})),t.choice=new Sk.builtin.func((function(n){if(Sk.builtin.pyCheckArgsLen(\\\"choice\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"seq\\\",\\\"sequence\\\",Sk.builtin.checkSequence(n)),void 0!==n.sq$length){var t=new Sk.builtin.int_(toInt(i.genrand_res53()*n.sq$length()));return n.mp$subscript(t)}throw new Sk.builtin.TypeError(\\\"object has no length\\\")})),t.shuffle=new Sk.builtin.func((function(n){if(Sk.builtin.pyCheckArgsLen(\\\"shuffle\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"x\\\",\\\"sequence\\\",Sk.builtin.checkSequence(n)),n.constructor===Sk.builtin.list){const u=n.v;for(var t=u.length-1;t>0;t-=1){var e=u[r=toInt(i.genrand_res53()*(t+1))];u[r]=u[t],u[t]=e}}else{if(void 0===n.sq$length)throw new Sk.builtin.TypeError(\\\"object has no length\\\");if(void 0===n.mp$ass_subscript)throw new Sk.builtin.TypeError(\\\"object is immutable\\\");for(t=n.sq$length()-1;t>0;t-=1){var r=new Sk.builtin.int_(toInt(i.genrand_res53()*(t+1)));t=new Sk.builtin.int_(t);e=n.mp$subscript(r);n.mp$ass_subscript(r,n.mp$subscript(t)),n.mp$ass_subscript(t,e)}}return Sk.builtin.none.none$})),t.sample=new Sk.builtin.func((function(n,t){var e,r,u,s,h;for(Sk.builtin.pyCheckArgsLen(\\\"sample\\\",arguments.length,2,2),Sk.builtin.pyCheckType(\\\"population\\\",\\\"iterable\\\",Sk.builtin.checkIterable(n)),Sk.builtin.pyCheckType(\\\"k\\\",\\\"integer\\\",Sk.builtin.checkInt(t)),t=Sk.builtin.asnum$(t),h=[],e=0,s=(u=Sk.abstr.iter(n)).tp$iternext();void 0!==s;e++,s=u.tp$iternext())r=Math.floor(i.genrand_res53()*(e+1)),e(z=e.$d,O)),(e=>{O=e.$d}));return S(L,(()=>{function _strftime(e){return t=>e.$strftime(t).toString().toLowerCase()}function _strftime_timetuple(e,t){return O.strftime.tp$call([new i(e),t]).toString().toLowerCase()}const l=new i(\\\"fromordinal\\\");function _struct_time(t){return O.struct_time.tp$call([new s(t.map((t=>new e(t))))])}function _localized_month(){const e=[()=>\\\"\\\"];for(let t=0;t<12;t++){const i=new k(2001,t+1,1);e.push(_strftime(i))}return e}function _localized_day(){const e=[];for(let t=0;t<7;t++){const i=new k(2001,1,t+1);e.push(_strftime(i))}return e}const S={__name__:new i(\\\"_strptime\\\")},k=z.date,L=z.timedelta,E=z.timezone;function _getlang(){return[t,t]}class LocaleTime{constructor(){this.lang=_getlang(),this.__calc_weekday(),this.__calc_month(),this.__calc_am_pm(),this.__calc_timezone(),this.__calc_date_time()}__calc_weekday(){this.a_weekday=_localized_day().map((e=>e(\\\"%a\\\"))),this.f_weekday=_localized_day().map((e=>e(\\\"%A\\\")))}__calc_month(){this.a_month=_localized_month().map((e=>e(\\\"%b\\\"))),this.f_month=_localized_month().map((e=>e(\\\"%B\\\")))}__calc_am_pm(){const e=[];[1,22].forEach((t=>{const i=_strftime_timetuple(\\\"%p\\\",_struct_time([1999,3,17,t,44,55,2,76,0]));e.push(i)})),this.am_pm=e}__calc_date_time(){const e=_struct_time([1999,3,17,22,44,55,2,76,0]),i=[t,t,t];i[0]=_strftime_timetuple(\\\"%c\\\",e),i[1]=_strftime_timetuple(\\\"%x\\\",e),i[2]=_strftime_timetuple(\\\"%X\\\",e);const s=[[\\\"%\\\",\\\"%%\\\"],[this.f_weekday[2],\\\"%A\\\"],[this.f_month[3],\\\"%B\\\"],[this.a_weekday[2],\\\"%a\\\"],[this.a_month[3],\\\"%b\\\"],[this.am_pm[1],\\\"%p\\\"],[\\\"1999\\\",\\\"%Y\\\"],[\\\"99\\\",\\\"%y\\\"],[\\\"22\\\",\\\"%H\\\"],[\\\"44\\\",\\\"%M\\\"],[\\\"55\\\",\\\"%S\\\"],[\\\"76\\\",\\\"%j\\\"],[\\\"17\\\",\\\"%d\\\"],[\\\"03\\\",\\\"%m\\\"],[\\\"3\\\",\\\"%m\\\"],[\\\"2\\\",\\\"%w\\\"],[\\\"10\\\",\\\"%I\\\"]];s.push(...this.timezone.flat().map((e=>[e,\\\"%Z\\\"]))),[[0,\\\"%c\\\"],[1,\\\"%x\\\"],[2,\\\"%X\\\"]].forEach((([e,t])=>{let n=i[e];s.forEach((([e,t])=>{e&&(n=n.replace(e,t))}));let a;a=_strftime_timetuple(t,_struct_time([1999,1,3,1,1,1,6,3,0])).includes(\\\"00\\\")?\\\"%W\\\":\\\"%U\\\",i[e]=n.replace(\\\"11\\\",a)})),this.LC_date_time=i[0],this.LC_date=i[1],this.LC_time=i[2]}__calc_timezone(){try{O.tzset.tp$call([])}catch{}this.tzname=O.tzname.v.map((e=>e.toString())),this.daylight=w(O.daylight);const e=[this.tzname[0].toLowerCase(),\\\"utc\\\",\\\"gmt\\\"];let t;t=this.daylight?[this.tzname[1].toLowerCase()]:[],this.timezone=[e,t]}}class TimeRE{constructor(e=null){this.locale_time=e||new LocaleTime,Object.assign(this,{d:\\\"(?3[0-1]|[1-2]\\\\\\\\d|0[1-9]|[1-9]| [1-9])\\\",f:\\\"(?[0-9]{1,6})\\\",H:\\\"(?2[0-3]|[0-1]\\\\\\\\d|\\\\\\\\d)\\\",I:\\\"(?1[0-2]|0[1-9]|[1-9])\\\",G:\\\"(?\\\\\\\\d\\\\\\\\d\\\\\\\\d\\\\\\\\d)\\\",j:\\\"(?36[0-6]|3[0-5]\\\\\\\\d|[1-2]\\\\\\\\d\\\\\\\\d|0[1-9]\\\\\\\\d|00[1-9]|[1-9]\\\\\\\\d|0[1-9]|[1-9])\\\",m:\\\"(?1[0-2]|0[1-9]|[1-9])\\\",M:\\\"(?[0-5]\\\\\\\\d|\\\\\\\\d)\\\",S:\\\"(?6[0-1]|[0-5]\\\\\\\\d|\\\\\\\\d)\\\",U:\\\"(?5[0-3]|[0-4]\\\\\\\\d|\\\\\\\\d)\\\",w:\\\"(?[0-6])\\\",u:\\\"(?[1-7])\\\",V:\\\"(?5[0-3]|0[1-9]|[1-4]\\\\\\\\d|\\\\\\\\d)\\\",y:\\\"(?\\\\\\\\d\\\\\\\\d)\\\",Y:\\\"(?\\\\\\\\d\\\\\\\\d\\\\\\\\d\\\\\\\\d)\\\",z:\\\"(?[+-]\\\\\\\\d\\\\\\\\d:?[0-5]\\\\\\\\d(:?[0-5]\\\\\\\\d(\\\\\\\\.\\\\\\\\d{1,6})?)?|Z)\\\",A:this.__seqToRE(this.locale_time.f_weekday,\\\"A\\\"),a:this.__seqToRE(this.locale_time.a_weekday,\\\"a\\\"),B:this.__seqToRE(this.locale_time.f_month.slice(1),\\\"B\\\"),b:this.__seqToRE(this.locale_time.a_month.slice(1),\\\"b\\\"),p:this.__seqToRE(this.locale_time.am_pm,\\\"p\\\"),Z:this.__seqToRE(this.locale_time.timezone.flat(),\\\"Z\\\"),\\\"%\\\":\\\"%\\\"}),this.W=this.U.replace(\\\"U\\\",\\\"W\\\"),this.x=this.pattern(this.locale_time.LC_date),this.X=this.pattern(this.locale_time.LC_time),this.c=this.pattern(this.locale_time.LC_date_time)}__seqToRE(e,t){if((e=e.slice(0).sort(((e,t)=>t.length-e.length))).every((e=>\\\"\\\"===e)))return\\\"\\\";return`(?<${t}>${e.map((e=>e)).join(\\\"|\\\")})`}pattern(e){let t=\\\"\\\";for(e=(e=e.replace(b,\\\"\\\\\\\\$1\\\")).replace(v,\\\"\\\\\\\\s+\\\");e.includes(\\\"%\\\");){const i=e.indexOf(\\\"%\\\")+1,s=this[e[i]];if(void 0===s)throw new h(e[i]);t=`${t}${e.slice(0,i-1)}${s}`,e=e.slice(i+1)}return t+e}compile(e){return new RegExp(\\\"^\\\"+this.pattern(e),\\\"i\\\")}}let C=new TimeRE;const T=5;let A={};function _strptime(i,s=\\\"%a %b %d %H:%M:%S %Y\\\"){function _checkString(e,t){if(\\\"string\\\"!=typeof e&&!u(e))throw new m(`strptime() argument ${t} must be a str, not '${o(e)}'`)}_checkString(i,0),_checkString(s,1),i=i.toString(),s=s.toString();let n,_=C.locale_time;if(Object.keys(A).length>T&&(A={}),n=A[s],void 0===n)try{n=C.compile(s)}catch(V){if(V instanceof h){let e=V.args.v[0];throw\\\"\\\\\\\\\\\"==e&&(e=\\\"%\\\"),new d(`'${e}' is a bad directive in format '${s}'`)}if(V instanceof f)throw new d(\\\"stray %% in format '\\\"+s+\\\"'\\\");throw V}const c=i.match(n);if(null===c)throw new d(`time data '${i}' does not match format '${s}'`);if(i.length!==c[0].length)throw new d(`unconverted data remains: ${i.slice(c[0].length)}`);let w=t,p=t,g=1,$=1,y=0,S=0,b=0,v=0,z=-1,L=t,E=0,I=t,M=t,H=t,Y=t,j=t,U=c.groups||{};if(Object.keys(U).forEach((e=>{if(void 0!==U[e])if(\\\"y\\\"===e)p=_as_integer(U.y),p+=p<=68?2e3:1900;else if(\\\"Y\\\"===e)p=_as_integer(U.Y);else if(\\\"G\\\"===e)w=_as_integer(U.G);else if(\\\"m\\\"===e)g=_as_integer(U.m);else if(\\\"B\\\"===e)g=_.f_month.indexOf(U.B.toLowerCase());else if(\\\"b\\\"===e)g=_.a_month.indexOf(U.b.toLowerCase());else if(\\\"d\\\"===e)$=_as_integer(U.d);else if(\\\"H\\\"===e)y=_as_integer(U.H);else if(\\\"H\\\"===e)y=_as_integer(U.H);else if(\\\"I\\\"===e){y=_as_integer(U.I);const e=(U.p||\\\"\\\").toLowerCase();[\\\"\\\",_.am_pm[0]].includes(e)?12===y&&(y=0):e===_.am_pm[1]&&12!==y&&(y+=12)}else if(\\\"M\\\"===e)S=_as_integer(U.M);else if(\\\"S\\\"===e)b=_as_integer(U.S);else if(\\\"f\\\"===e){let e=U.f;e+=\\\"0\\\".repeat(6-e.length),v=_as_integer(e)}else if(\\\"A\\\"===e)Y=_.f_weekday.indexOf(U.A.toLowerCase());else if(\\\"a\\\"===e)Y=_.a_weekday.indexOf(U.a.toLowerCase());else if(\\\"w\\\"===e)Y=_as_integer(U.w),0===Y?Y=6:Y-=1;else if(\\\"u\\\"===e)Y=_as_integer(U.u),Y-=1;else if(\\\"j\\\"===e)j=_as_integer(U.j);else if([\\\"U\\\",\\\"W\\\"].includes(e))M=_as_integer(U[e]),H=\\\"U\\\"===e?6:0;else if(\\\"V\\\"===e)I=_as_integer(U.V);else if(\\\"z\\\"===e){let e=U.z;if(\\\"Z\\\"===e)L=0;else{if(\\\":\\\"===e[3]&&(e=e.slice(0,3)+e.slice(4),e.length>5)){if(\\\":\\\"!==e[5]){const e=`Inconsistent use of : in ${U.z}`;throw new d(e)}e=e.slice(0,5)+e.slice(6)}const t=_as_integer(e.slice(1,3)),i=_as_integer(e.slice(3,5)),s=_as_integer(e.slice(5,7)||0);L=3600*t+60*i+s;const n=e.slice(8),a=\\\"0\\\".repeat(6-n.length);E=_as_integer(n+a),e.startsWith(\\\"-\\\")&&(L=-L,E=-E)}}else if(\\\"Z\\\"===e){let e=U.Z.toLowerCase(),t=0;for(let i of _.timezone){if(i.includes(e)){const i=O.tzname.v;if(r(i[0],i[1],\\\"Eq\\\")&&a(O.daylight)&&![\\\"utc\\\",\\\"gmt\\\"].includes(e))break;z=t}t++}}})),p===t&&w!==t){if(I===t||Y===t)throw new d(\\\"ISO year directive '%G' must be used with the ISO week directive '%V' and a weekday directive ('%A','%a', '%w', or '%u').\\\");if(j!==t)throw new d(\\\"Day of the year directive '%j' is not compatible with ISO year directive '%G'.Use '%Y' instead.\\\")}else if(M===t&&I!==t)throw new d(Y===t?\\\"ISO week directive '%V' must be used with the ISO year directive '%G' and a weekday directive ('%A', '%a', '%w', or '%u').\\\":\\\"ISO week directive '%V' is incompatible with the year directive '%Y'. Use the ISO year '%G' instead.\\\");let x=!1;if(p===t&&2===g&&29===$?(p=1904,x=!0):p===t&&(p=1900),j===t&&Y!==t){if(M!==t){j=function _calc_julian_from_U_or_W(e,t,i,s){let n=(new k(e,1,1).$toOrdinal()+6)%7;return s||(n=(n+1)%7,i=(i+1)%7),0===t?1+i-n:(7-n)%7+7*(t-1)+1+i}(p,M,Y,0===H)}else w!==t&&I!==t&&([p,j]=function _calc_julian_from_V(e,t,i){let s=7*t+i-((new k(e,1,4).$toOrdinal()%7||7)+3);return s<1&&(s+=new k(e,1,1).$toOrdinal(),s-=new k(e-=1,1,1).$toOrdinal()),[e,s]}(w,I,Y+1));if(j!==t&&j<=0){p-=1;const e=function _is_leap(e){return e%4==0&&(e%100!=0||e%400==0)}(p)?366:365;j+=e}}if(j===t)j=new k(p,g,$).$toOrdinal()-new k(p,1,1).$toOrdinal()+1;else{const t=function _fromordinal(t){return k.tp$getattr(l).tp$call([new e(t)])}(j-1+new k(p,1,1).$toOrdinal());p=t.$year,g=t.$month,$=t.$day}Y===t&&(Y=(new k(p,g,$).$toOrdinal()+6)%7);const R=U.Z||t;return x&&(p=1900),[[p,g,$,y,S,b,Y,j,z,R,L],v,E]}return _(\\\"_strptime\\\",S,{_strptime_time:{$meth:function _strptime_time(t,i=\\\"%a %b %d %H:%M:%S %Y\\\"){let n=_strptime(t,i)[0].slice(0,11);return n=n.map(((t,i)=>i<9?new e(t):p(t))),O.struct_time.tp$call([new s(n)])},$flags:{NamedArgs:[\\\"data_string\\\",\\\"format\\\"],Defaults:[\\\"%a %b %d %H:%M:%S %Y\\\"]}},_strptime_datetime:{$meth:function _strptime_datetime(s,r,l=\\\"%a %b %d %H:%M:%S %Y\\\"){const[o,_,c]=_strptime(r,l),[m,d]=o.slice(-2),h=o.slice(0,6);let f,u;return h.push(_),h.map((t=>new e(t))),d!==t&&(f=new L(0,d,c),u=a(m)?new E(f,new i(m)):new E(f),h.push(u)),n(s,h)},$flags:{NamedArgs:[\\\"cls\\\",\\\"data_string\\\",\\\"format\\\"],Defaults:[\\\"%a %b %d %H:%M:%S %Y\\\"]}},_strptime:{$meth(i,n){const a=_strptime(i,n);return a[0]=new s(a[0].map((i=>i===t?i:new e(i)))),a[1]=new e(a[1]),a[2]=new e(a[2]),new s(a)},$flags:{NamedArgs:[\\\"data_string\\\",\\\"format\\\"],Defaults:[\\\"%a %b %d %H:%M:%S %Y\\\"]}},_getlang:{$meth:()=>p(_getlang()),$flags:{NoArgs:!0}}}),S.LocaleTime=c(\\\"_strptime.LocaleTime\\\",{constructor:function(){this.v=new LocaleTime},slots:{tp$getattr(e,t){return this.v.hasOwnProperty(e.toString())?p(this.v[e.toString()]):$.call(this,e,t)},tp$setattr(e,t){if(!this.v.hasOwnProperty(e.toString()))return y.call(this,e,t);this.v[e.toString()]=g(t)}}}),S}))}\",\"src/lib/altair/vega_caller.js\":\"var $builtinmodule=function(e){var n={__file__:\\\"/src/lib/vega_caller.js\\\"};return n.__package__=Sk.builtin.none.none$,n.render_graph=new Sk.builtin.func((function(e){Sk.builtin.pyCheckArgs(\\\"render_graph\\\",arguments,1,1);let n=\\\"#\\\"+Sk.divid+\\\"_graphics\\\";try{vegaEmbed(n,Sk.ffi.remapToJs(e),{actions:!0})}catch(i){throw new Sk.builtin.Exception(\\\"Error in graph specification unable to render the graph\\\\n\\\"+i.message)}})),n};\",\"src/lib/array.js\":\"function $builtinmodule(e){var n={},t=[\\\"c\\\",\\\"b\\\",\\\"B\\\",\\\"u\\\",\\\"h\\\",\\\"H\\\",\\\"i\\\",\\\"I\\\",\\\"l\\\",\\\"L\\\",\\\"f\\\",\\\"d\\\"];return n.__name__=new Sk.builtin.str(\\\"array\\\"),n.array=Sk.misceval.buildClass(n,(function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){if(Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,2,3),-1==t.indexOf(Sk.ffi.remapToJs(n)))throw new Sk.builtin.ValueError(\\\"bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)\\\");if(i&&!Sk.builtin.checkIterable(i))throw new Sk.builtin.TypeError(\\\"iteration over non-sequence\\\");if(e.$d.mp$ass_subscript(new Sk.builtin.str(\\\"typecode\\\"),n),e.$d.mp$ass_subscript(new Sk.builtin.str(\\\"__module__\\\"),new Sk.builtin.str(\\\"array\\\")),e.typecode=n,void 0===i)e.internalIterable=new Sk.builtin.list;else if(i instanceof Sk.builtin.list)e.internalIterable=i;else{e.internalIterable=new Sk.builtin.list;for(let n=Sk.abstr.iter(i),t=n.tp$iternext();void 0!==t;t=n.tp$iternext())Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,t])}})),n.__repr__=new Sk.builtin.func((function(e){var n=Sk.ffi.remapToJs(e.typecode),t=\\\"\\\";return Sk.ffi.remapToJs(e.internalIterable).length&&(t=\\\"c\\\"==Sk.ffi.remapToJs(e.typecode)?\\\", '\\\"+Sk.ffi.remapToJs(e.internalIterable).join(\\\"\\\")+\\\"'\\\":\\\", \\\"+Sk.ffi.remapToJs(Sk.misceval.callsimArray(e.internalIterable.__repr__,[e.internalIterable]))),new Sk.builtin.str(\\\"array('\\\"+n+\\\"'\\\"+t+\\\")\\\")})),n.__str__=n.__repr__,n.__getattribute__=new Sk.builtin.func((function(e,n){return e.tp$getattr(n)})),n.append=new Sk.builtin.func((function(e,n){return Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,n]),Sk.builtin.none.none$})),n.extend=new Sk.builtin.func((function(e,n){if(Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,2,2),!Sk.builtin.checkIterable(n))throw new Sk.builtin.TypeError(\\\"iteration over non-sequence\\\");for(let t=Sk.abstr.iter(n),i=t.tp$iternext();void 0!==i;i=t.tp$iternext())Sk.misceval.callsimArray(e.internalIterable.append,[e.internalIterable,i])}))}),\\\"array\\\",[]),n}\",\"src/lib/calendar.js\":\"function $builtinmodule(e){const t={},{misceval:{chain:n},importModule:r}=Sk,importOrSuspend=e=>r(e,!1,!0);return n(importOrSuspend(\\\"datetime\\\"),(e=>(t.datetime=e,importOrSuspend(\\\"itertools\\\"))),(e=>(t.iterRepeat=e.$d.repeat,t.iterChain=e.$d.chain,calendarModule(t))))}function calendarModule(e){const{abstr:{setUpModuleMethods:t,numberBinOp:n,iter:r,objectGetItem:o},builtin:{bool:s,bool:{true$:m,false$:d},func:l,int_:i,list:c,none:{none$:f},str:h,slice:w,tuple:y,range:u,max:_,min:g,property:k,print:p,enumerate:$,ValueError:b},ffi:{remapToPy:M},misceval:{isTrue:T,iterator:C,arrayFromIterable:O,buildClass:L,richCompareBool:x,asIndexOrThrow:F,objectRepr:I,callsimArray:A},global:v,global:{strftime:E}}=Sk,S=new i(0),H=new i(1),D=new i(2),N=new i(3),R=new i(6),j=new i(7),J=new i(9),P=new i(12),Y=new i(13),U=new i(24),z=new i(60),le=(e,t)=>x(e,t,\\\"LtE\\\"),eq=(e,t)=>x(e,t,\\\"Eq\\\"),mod=(e,t)=>n(e,t,\\\"Mod\\\"),add=(e,t)=>n(e,t,\\\"Add\\\"),sub=(e,t)=>n(e,t,\\\"Sub\\\"),mul=(e,t)=>n(e,t,\\\"Mult\\\"),inc=e=>add(e,H),dec=e=>sub(e,H),mod7=e=>mod(e,j),getA=(e,t)=>e.tp$getattr(new h(t)),callA=(e,t,...n)=>A(e.tp$getattr(new h(t)),n);function*iterJs(e){const t=r(e);let n;for(;n=t.tp$iternext();)yield n}function iterFn(e,t){return e=r(e),new C((()=>{const n=e.tp$iternext();return n&&t(n)}),!0)}function makePyMethod(e,t,{args:n,name:r,doc:o,defaults:s}){t.co_varnames=[\\\"self\\\",...n||[]],t.co_docstring=o?new h(o):f,s&&(t.$defaults=s),t.co_name=new h(r),t.co_qualname=new h(e+\\\".\\\"+r);const m=new l(t);return m.$module=Q.__name__,m}const{datetime:B,iterRepeat:W,iterChain:q}=e;let{MINYEAR:G,MAXYEAR:X,date:V}=B.$d;const K=getA(h,\\\"center\\\"),pyCenter=(e,t)=>A(K,[e,t]),pyRStrip=e=>new h(e.toString().trimRight());G=G.valueOf(),X=X.valueOf();const Q={__name__:new h(\\\"calendar\\\"),__all__:M([\\\"IllegalMonthError\\\",\\\"IllegalWeekdayError\\\",\\\"setfirstweekday\\\",\\\"firstweekday\\\",\\\"isleap\\\",\\\"leapdays\\\",\\\"weekday\\\",\\\"monthrange\\\",\\\"monthcalendar\\\",\\\"prmonth\\\",\\\"month\\\",\\\"prcal\\\",\\\"calendar\\\",\\\"timegm\\\",\\\"month_name\\\",\\\"month_abbr\\\",\\\"day_name\\\",\\\"day_abbr\\\",\\\"Calendar\\\",\\\"TextCalendar\\\",\\\"HTMLCalendar\\\",\\\"LocaleTextCalendar\\\",\\\"LocaleHTMLCalendar\\\",\\\"weekheader\\\"])};function makeErr(e,t){return L(Q,((e,n)=>{n.__init__=new l((function __init__(e,t){e.$attr=t})),n.__str__=new l((function __str__(e){return new h(t.replace(\\\"$\\\",I(e.$attr)))}))}),e,[b])}const Z=makeErr(\\\"IllegalMonthError\\\",\\\"bad month $; must be 1-12\\\"),ee=makeErr(\\\"IllegalWeekdayError\\\",\\\"bad weekday number $; must be 0 (Monday) to 6 (Sunday)\\\"),te=1,ae=2,ne=[0,31,28,31,30,31,30,31,31,30,31,30,31];function mkLocalizedCls(e,t){t.__init__=new l((function __init__(e,t){e.format=t})),t.__getitem__=new l((function __getitem__(t,n){const r=o(e,n);if(n instanceof w){const e=[];for(const n of r.valueOf())e.push(A(n,[t.format]));return new c(e)}return A(r,[t.format])}));const n=new i(e.valueOf().length);t.__len__=new l((function __len__(e){return n}))}const re=new h(\\\"strftime\\\"),oe=L(Q,((e,t)=>{let n=[new l((e=>h.$empty))];for(let r=0;r<12;r++){const e=new V(2001,r+1,1);n.push(e.tp$getattr(re))}n=new c(n),t._months=n,mkLocalizedCls(n,t)}),\\\"_localized_month\\\"),se=L(Q,((e,t)=>{let n=[];for(let r=0;r<7;r++){const e=new V(2001,1,r+1);n.push(e.tp$getattr(re))}n=new c(n),t._days=n,mkLocalizedCls(n,t)}),\\\"_localized_day\\\"),me=A(se,[new h(\\\"%A\\\")]),de=A(se,[new h(\\\"%a\\\")]),ie=A(oe,[new h(\\\"%B\\\")]),ce=A(oe,[new h(\\\"%b\\\")]),[fe,he,we,ye,ue,_e,ge]=[0,1,2,3,4,5,6];function isleap(e){return(e=F(e))%4==0&&(e%100!=0||e%400==0)}function weekday(e,t,n){e=F(e),G<=e&&e<=X||(e=2e3+e%400);const r=A(V,[new i(e),t,n]);return callA(V,\\\"weekday\\\",r)}function monthrange(e,t){if(!le(H,t)||!le(t,P))throw A(Z,[t]);const n=weekday(e,t,H);t=F(t);const r=ne[t]+Number(t===ae&&isleap(e));return[n,new i(r)]}function iterweekdays(e){return iterFn(A(u,[e.fwd,add(e.fwd,j)]),mod7)}function itermonthdates(e,t,n){return iterFn(itermonthdays3(e,t,n),(e=>A(V,e.valueOf())))}function itermonthdays(e,t,n){const[r,o]=monthrange(t,n),s=mod7(sub(r,e.fwd)),m=A(W,[S,s]),d=A(u,[H,inc(o)]),l=mod7(sub(e.fwd,add(r,o))),i=A(W,[S,l]);return A(q,[m,d,i])}function itermonthdays2(e,t,n){return iterFn(A($,[itermonthdays(e,t,n),e.fwd]),(e=>{const[t,n]=e.valueOf();return new y([n,mod7(t)])}))}function itermonthdays3(e,t,n){const ymdIter=(e,t,n)=>iterFn(n,(n=>new y([e,t,n]))),[r,o]=monthrange(t,n),s=mod7(sub(r,e.fwd)),m=mod7(sub(e.fwd,add(r,o))),[d,l]=function _prevmonth(e,t){return eq(t,H)?[dec(e),P]:[e,dec(t)]}(t,n),c=inc(function _monthlen(e,t){return t=F(t),new i(ne[t]+Number(t===ae&&isleap(e)))}(d,l)),f=A(u,[sub(c,s),c]),h=A(u,[H,inc(o)]),[w,_]=function _nextmonth(e,t){return eq(t,P)?[inc(e),H]:[e,inc(t)]}(t,n),g=A(u,[H,inc(m)]);return A(q,[ymdIter(d,l,f),ymdIter(t,n,h),ymdIter(w,_,g)])}function itermonthdays4(e,t,n){const r=itermonthdays3(e,t,n);let o=0;return iterFn(r,(t=>new y([...t.valueOf(),mod7(add(e.fwd,new i(o++)))])))}function _monthIter(e,t,n,r){const o=O(e(t,n,r)),s=[];for(let m=0;m{const n=makePyMethod.bind(null,\\\"Calendar\\\"),r=[\\\"firstweekday\\\"],o=[\\\"year\\\",\\\"month\\\"],s=[\\\"year\\\",\\\"width\\\"],m={__init__:n((function __init__(e,t){return Object.defineProperty(e,\\\"fwd\\\",{get(){return mod7(this._fwd)},set(e){return this._fwd=e,!0}}),e.fwd=t,f}),{name:\\\"__init__\\\",args:r,defaults:[S]}),getfirstweekday:n((function getfirstweekday(e){return e.fwd}),{name:\\\"getfirstweekday\\\"}),setfirstweekday:n((function setfirstweekday(e,t){return e.fwd=t,f}),{name:\\\"setfirstweekday\\\",args:r}),iterweekdays:n(iterweekdays,{name:\\\"iterweekdays\\\"}),itermonthdates:n(itermonthdates,{name:\\\"itermonthdates\\\",args:o}),itermonthdays:n(itermonthdays,{name:\\\"itermonthdays\\\",args:o}),itermonthdays2:n(itermonthdays2,{name:\\\"itermonthdays2\\\",args:o}),itermonthdays3:n(itermonthdays3,{name:\\\"itermonthdays3\\\",args:o}),itermonthdays4:n(itermonthdays4,{name:\\\"itermonthdays4\\\",args:o}),monthdatescalendar:n(monthdatescalendar,{name:\\\"monthdatescalendar\\\",args:o}),monthdays2calendar:n(monthdays2calendar,{name:\\\"monthdays2calendar\\\",args:o}),monthdayscalendar:n(monthdayscalendar,{name:\\\"monthdayscalendar\\\",args:o}),yeardatescalendar:n(yeardatescalendar,{name:\\\"yeardatescalendar\\\",args:s,defaults:[N]}),yeardays2calendar:n(yeardays2calendar,{name:\\\"yeardays2calendar\\\",args:s,defaults:[N]}),yeardayscalendar:n(yeardayscalendar,{name:\\\"yeardayscalendar\\\",args:s,defaults:[N]})};m.firstweekday=new k(m.getfirstweekday,m.setfirstweekday),Object.assign(t,m)}),\\\"Calendar\\\");function doTextFormatweekday(e,t,n){let r;return r=x(n,J,\\\"GtE\\\")?me:de,pyCenter(o(o(r,t),new w(f,n)),n)}function doTextFormatmonthname(e,t,n,r,s=!0){let m=o(ie,n);return T(s)&&(m=mod(new h(\\\"%s %r\\\"),new y([m,t]))),pyCenter(m,r)}const pe=L(Q,((e,t)=>{const txtPrint=e=>p([e],[\\\"end\\\",h.$empty]);const n=doTextFormatweekday;function formatweekheader(e,t){const n=[];for(const r of iterJs(iterweekdays(e)))n.push(callA(e,\\\"formatweekday\\\",r,t).toString());return new h(n.join(\\\" \\\"))}const r=doTextFormatmonthname;const o=makePyMethod.bind(null,\\\"TextCalendar\\\"),s={prweek:o((function prweek(e,t,n){txtPrint(callA(e,\\\"formatweek\\\",t,n))}),{name:\\\"prweek\\\",args:[\\\"theweek\\\",\\\"width\\\"]}),formatday:o((function formatday(e,t,n,r){let o;return o=eq(t,S)?h.$empty:mod(new h(\\\"%2i\\\"),t),pyCenter(o,r)}),{name:\\\"formatday\\\",args:[\\\"day\\\",\\\"weekday\\\",\\\"width\\\"]}),formatweek:o((function formatweek(e,t,n){const r=[];for(const o of iterJs(t)){const[t,s]=o.valueOf();r.push(callA(e,\\\"formatday\\\",t,s,n).toString())}return new h(r.join(\\\" \\\"))}),{name:\\\"formatweek\\\",args:[\\\"theweek\\\",\\\"width\\\"]}),formatweekday:o(n,{name:\\\"formatweekday\\\",args:[\\\"day\\\",\\\"width\\\"]}),formatweekheader:o(formatweekheader,{name:\\\"formatweekheader\\\",args:[\\\"width\\\"]}),formatmonthname:o(r,{name:\\\"formatmonthname\\\",args:[\\\"theyear\\\",\\\"themonth\\\",\\\"width\\\",\\\"withyear\\\"],defaults:[m]}),prmonth:o((function prmonth(e,t,n,r,o){txtPrint(callA(e,\\\"formatmonth\\\",t,n,r,o))}),{name:\\\"prmonth\\\",args:[\\\"theyear\\\",\\\"themonth\\\",\\\"w\\\",\\\"l\\\"],defaults:[S,S]}),formatmonth:o((function formatmonth(e,t,n,r,o){const addNewLines=e=>new h(e+\\\"\\\\n\\\".repeat(o.valueOf()));r=_([D,r]),o=_([H,o]);let s=callA(e,\\\"formatmonthname\\\",t,n,dec(mul(j,inc(r))),!0);s=pyRStrip(s),s=addNewLines(s),s=add(s,pyRStrip(callA(e,\\\"formatweekheader\\\",r))),s=addNewLines(s);for(const m of iterJs(monthdays2calendar(e,t,n)))s=add(s,pyRStrip(callA(e,\\\"formatweek\\\",m,r))),s=addNewLines(s);return s}),{name:\\\"formatmonth\\\",args:[\\\"thyear\\\",\\\"themonth\\\",\\\"w\\\",\\\"l\\\"],defaults:[S,S]}),formatyear:o((function formatyear(e,t,n,r,o,s){n=_([D,n]),r=_([H,r]),o=_([D,o]);const m=dec(mul(inc(n),j));let d=\\\"\\\";const a=e=>d+=e;a(pyRStrip(pyCenter(t.$r(),add(mul(m,s),mul(o,dec(s)))))),a(\\\"\\\\n\\\".repeat(r));const l=formatweekheader(e,n);let f=0;for(const w of iterJs(yeardays2calendar(e,t,s))){const d=new i(f),y=inc(mul(s,d)),_=g([inc(mul(s,inc(d))),Y]),k=A(u,[y,_]);a(\\\"\\\\n\\\".repeat(r));const p=iterFn(k,(n=>callA(e,\\\"formatmonthname\\\",t,n,m,!1)));a(pyRStrip(formatstring(p,m,o))),a(\\\"\\\\n\\\".repeat(r));const $=iterFn(k,(e=>l));a(pyRStrip(formatstring($,m,o))),a(\\\"\\\\n\\\".repeat(r));const b=Math.max(...w.valueOf().map((e=>e.valueOf().length)));for(let t=0;t=r.length?s.push(h.$empty):s.push(callA(e,\\\"formatweek\\\",r[t],n));a(pyRStrip(formatstring(new c(s),m,o))),a(\\\"\\\\n\\\".repeat(r))}f++}return new h(d)}),{name:\\\"formatyear\\\",args:[\\\"theyear\\\",\\\"w\\\",\\\"l\\\",\\\"c\\\",\\\"m\\\"],defaults:[D,H,R,N]}),pryear:o((function pryear(e,t,n,r,o,s){txtPrint(callA(e,\\\"formatyear\\\",t,n,r,o,s))}),{name:\\\"pryear\\\",args:[\\\"theyear\\\",\\\"w\\\",\\\"l\\\",\\\"c\\\",\\\"m\\\"],defaults:[S,S,R,N]})};Object.assign(t,s)}),\\\"TextCalendar\\\",[ke]);function doHtmlFormatweekday(e,t){return new h(`${o(de,t)}`)}function doHtmlFormatmonthname(e,t,n,r=!0){let s=\\\"\\\"+o(ie,n);return T(r)&&(s+=\\\" \\\"+t),new h(`${s}`)}const $e=L(Q,((e,t)=>{const n=M([\\\"mon\\\",\\\"tue\\\",\\\"wed\\\",\\\"thu\\\",\\\"fri\\\",\\\"sat\\\",\\\"sun\\\"]),r=n,s=new h(\\\"noday\\\"),d=new h(\\\"month\\\"),l=d,c=new h(\\\"year\\\"),w=c,u=new h(' '),g=new h('%d');const k=doHtmlFormatweekday;function formatweekheader(e){let t=\\\"\\\";for(const n of iterJs(iterweekdays(e)))t+=callA(e,\\\"formatweekday\\\",n);return new h(`${t}`)}const p=doHtmlFormatmonthname;const $=makePyMethod.bind(null,\\\"HTMLCalendar\\\"),b={formatday:$((function formatday(e,t,n){return eq(t,S)?mod(u,getA(e,\\\"cssclass_noday\\\")):mod(g,new y([o(getA(e,\\\"cssclasses\\\"),n),t]))}),{name:\\\"formatday\\\",args:[\\\"day\\\",\\\"weekday\\\"]}),formatweek:$((function formatweek(e,t){let n=\\\"\\\";for(const r of iterJs(t)){const[t,o]=r.valueOf();n+=callA(e,\\\"formatday\\\",t,o)}return new h(`${n}`)}),{name:\\\"formatweek\\\",args:[\\\"theweek\\\"]}),formatweekday:$(k,{name:\\\"formatweekday\\\",args:[\\\"day\\\"]}),formatweekheader:$(formatweekheader,{name:\\\"formatweekheader\\\"}),formatmonthname:$(p,{name:\\\"formatmonthname\\\",args:[\\\"theyear\\\",\\\"themonth\\\",\\\"withyear\\\"],defaults:[m]}),formatmonth:$((function formatmonth(e,t,n,r=!0){let o=\\\"\\\";const a=e=>o+=e+\\\"\\\\n\\\";a(``),a(callA(e,\\\"formatmonthname\\\",t,n,r)),a(formatweekheader(e));for(const s of iterJs(monthdays2calendar(e,t,n)))a(callA(e,\\\"formatweek\\\",s));return a(\\\"
    \\\"),new h(o)}),{name:\\\"formatmonth\\\",args:[\\\"thyear\\\",\\\"themonth\\\",\\\"withyear\\\"],defaults:[m]}),formatyear:$((function formatyear(e,t,n){let r=\\\"\\\";const a=e=>r+=e;n=_([n,H]).valueOf(),a(``),a(\\\"\\\\n\\\"),a(``);for(let o=te;o\\\");const r=Math.min(o+n,13);for(let n=o;n\\\"),a(callA(e,\\\"formatmonth\\\",t,new i(n),!1)),a(\\\"\\\");a(\\\"\\\")}return a(\\\"
    ${t}
    \\\"),new h(r)}),{name:\\\"formatyear\\\",args:[\\\"theyear\\\",\\\"width\\\"],defaults:[N]}),formatyearpage:$((function formatyearpage(e,t,n=3,r=\\\"calendar.css\\\",o=null){null!==o&&o!==f||(o=new h(\\\"utf-8\\\"));let s=\\\"\\\";const a=e=>s+=e;return a(`\\\\n`),a('\\\\n'),a(\\\"\\\\n\\\"),a(\\\"\\\\n\\\"),a(`\\\\n`),r!==f&&a(`\\\\n`),a(`Calendar for ${t}\\\\n`),a(\\\"\\\\n\\\"),a(\\\"\\\\n\\\"),a(callA(e,\\\"formatyear\\\",t,n)),a(\\\"\\\\n\\\"),a(\\\"\\\\n\\\"),callA(h,\\\"encode\\\",new h(s),o,new h(\\\"ignore\\\"))}),{name:\\\"formatyearpage\\\",args:[\\\"theyear\\\",\\\"width\\\",\\\"css\\\",\\\"encoding\\\"],defaults:[N,new h(\\\"calendar.css\\\"),new h(\\\"utf-8\\\")]}),cssclasses:n,cssclasses_weekday_head:r,cssclass_noday:s,cssclass_month_head:d,cssclass_month:l,cssclass_year_head:c,cssclass_year:w};Object.assign(t,b)}),\\\"HTMLCalendar\\\",[ke]);function withLocale(e,t){const n=E.localizeByIdentifier(e.toString());v.strftime=n;try{return t()}finally{v.strftime=E}}function localInit(e,t){T(t)||(t=new h(\\\"en_US\\\")),e.locale=t}const be=L(Q,((e,t)=>{const n=makePyMethod.bind(null,\\\"LocaleTextCalendar\\\"),r={__init__:n((function __init__(e,t,n){return callA(pe,\\\"__init__\\\",e,t),localInit(e,n),f}),{name:\\\"__init__\\\",args:[\\\"firstweekday\\\",\\\"locale\\\"],defaults:[S,f]}),formatweekday:n((function formatweekday(e,t,n){return withLocale(e.locale,(()=>doTextFormatweekday(0,t,n)))}),{name:\\\"formatweekday\\\",args:[\\\"day\\\",\\\"width\\\"]}),formatmonthname:n((function formatmonthname(e,t,n,r,o){return withLocale(e.locale,(()=>doTextFormatmonthname(0,t,n,r,o)))}),{name:\\\"formatmonthname\\\",args:[\\\"theyear\\\",\\\"themonth\\\",\\\"width\\\",\\\"withyear\\\"],defaults:[m]})};Object.assign(t,r)}),\\\"LocaleTextCalendar\\\",[pe]),Me=L(Q,((e,t)=>{const n=makePyMethod.bind(null,\\\"LocaleHTMLCalendar\\\"),r={__init__:n((function __init__(e,t,n){return callA($e,\\\"__init__\\\",e,t),localInit(e,n),f}),{name:\\\"__init__\\\",args:[\\\"firstweekday\\\",\\\"locale\\\"],defaults:[S,f]}),formatweekday:n((function formatweekday(e,t){return withLocale(e.locale,(()=>doHtmlFormatweekday(e,t)))}),{name:\\\"formatweekday\\\",args:[\\\"day\\\"]}),formatmonthname:n((function formatmonthname(e,t,n,r){return withLocale(e.locale,(()=>doHtmlFormatmonthname(e,t,n,r)))}),{name:\\\"formatmonthname\\\",args:[\\\"theyear\\\",\\\"themonth\\\",\\\"withyear\\\"],defaults:[m]})};Object.assign(t,r)}),\\\"LocaleHTMLCalendar\\\",[$e]),Te=A(pe,[]);Object.assign(Q,{IllegalMonthError:Z,IllegalWeekdayError:ee,day_name:me,month_name:ie,day_abbr:de,month_abbr:ce,January:new i(te),February:new i(ae),mdays:M(ne),MONDAY:new i(fe),TUESDAY:new i(he),WEDNESDAY:new i(we),THURSDAY:new i(ye),FRIDAY:new i(ue),SATURDAY:new i(_e),SUNDAY:new i(ge),Calendar:ke,TextCalendar:pe,HTMLCalendar:$e,LocaleTextCalendar:be,LocaleHTMLCalendar:Me,c:Te,firstweekday:getA(Te,\\\"getfirstweekday\\\"),monthcalendar:getA(Te,\\\"monthdayscalendar\\\"),prweek:getA(Te,\\\"prweek\\\"),week:getA(Te,\\\"formatweek\\\"),weekheader:getA(Te,\\\"formatweekheader\\\"),prmonth:getA(Te,\\\"prmonth\\\"),month:getA(Te,\\\"formatmonth\\\"),calendar:getA(Te,\\\"formatyear\\\"),prcal:getA(Te,\\\"pryear\\\")});const Ce=new i(20),Oe=R;function formatstring(e,t,n){t||(t=Ce),n||(n=Oe),n=mul(n,new h(\\\" \\\"));const r=[];for(const o of iterJs(e))r.push(pyCenter(o,t).toString());return new h(r.join(n.toString()))}const Le=getA(V,\\\"toordinal\\\"),xe=A(Le,[new V(1970,1,1)]);return t(\\\"calendar\\\",Q,{isleap:{$meth:e=>s(isleap(e)),$flags:{NamedArgs:[\\\"year\\\"]},$doc:\\\"Return True for leap years, False for non-leap years\\\"},leapdays:{$meth(e,t){e=F(e)-1,t=F(t)-1;const n=Math.floor;return new i(n(t/4)-n(e/4)-(n(t/100)-n(e/100))+(n(t/400)-n(e/400)))},$flags:{MinArgs:2,MaxArgs:2}},weekday:{$meth:weekday,$flags:{NamedArgs:[\\\"year\\\",\\\"month\\\",\\\"day\\\"]},$doc:\\\"Return weekday (0-6 ~ Mon-Sun) for year, month (1-12), day (1-31).\\\"},monthrange:{$meth:(e,t)=>new y(monthrange(e,t)),$flags:{NamedArgs:[\\\"year\\\",\\\"month\\\"]},$doc:\\\"Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month.\\\"},setfirstweekday:{$meth(e){const t=F(e);if(!(fe<=t&&t<=ge))throw A(ee,[e]);Te.fwd=e},$flags:{NamedArgs:[\\\"firstweekday\\\"]}},format:{$meth:function format(e,t,n){return p([formatstring(e,t,n)]),f},$flags:{NamedArgs:[\\\"cols\\\",\\\"colwidth\\\",\\\"spacing\\\"],Defaults:[Ce,Oe]}},formatstring:{$meth:formatstring,$flags:{NamedArgs:[\\\"cols\\\",\\\"colwidth\\\",\\\"spacing\\\"],Defaults:[Ce,Oe]}},timegm:{$meth(e){const[t,n,r,o,s,m]=e.valueOf(),d=A(V,[t,n,H]),l=A(Le,[d]),i=add(sub(l,xe),dec(r)),c=add(mul(i,U),o),f=add(mul(c,z),s);return add(mul(f,z),m)},$flags:{OneArg:!0}}}),Q}\",\"src/lib/cellbotics/__init__.js\":\"\\\"use strict\\\";function promiseToPy(e){const n=new Sk.misceval.Suspension;let i,t;return n.resume=function(){if(t)throw t;return i},n.data={type:\\\"Sk.promise\\\",promise:e.then((function(e){return i=e,e}),(function(e){return t=e,e}))},n}function remapToPy(e){return e instanceof Promise&&(e=promiseToPy(e)),Sk.ffi.remapToPy(e)}function remapToJsFunc(e,...n){return function(...i){n&&Sk.builtin.pyCheckArgs(e.name,i,...n),i=i.slice(1);return remapToPy(e(...i.map((e=>Sk.ffi.remapToJs(e)))))}}var $builtinmodule=function(e){return remapToPy(Promise.all([runestoneComponents.runestone_import(\\\"ble\\\"),runestoneComponents.runestone_import(\\\"simple_sensor\\\")]).then((([e,n])=>{const i={__name__:new Sk.builtin.str(\\\"cellbotics\\\")},get_self=e=>e&&e.__js_class;i.JsProperty=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs(\\\"__init__\\\",e,2,2);const[n,i]=e;n.__js_property=Sk.ffi.remapToJs(i)})),n.__get__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs(\\\"__get__\\\",e,2,3);const[n,i,t]=e;return remapToPy(get_self(i)[n.__js_property])}))}),\\\"JsProperty\\\",[]);const prop_wrap=e=>Sk.misceval.callsim(i.JsProperty,new Sk.builtins.str(e)),t=e.cell_bot_ble_gui.cell_bot_ble;t&&(i.CellBot=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(e){if(!t.paired())throw\\\"The CellBot is not paired. Click on the Pair button before running your program.\\\";return remapToPy(t.resetHardware().then((()=>{})))})),n.INPUT=new Sk.builtin.int_(t.INPUT),n.OUTPUT=new Sk.builtin.int_(t.OUTPUT);const wrap=(e,n)=>new Sk.builtin.func(remapToJsFunc(e,n,n));n.resetHardware=wrap(t.resetHardware,1),n.pinMode=wrap(t.pinMode,3),n.digitalWrite=wrap(t.digitalWrite,3),n.digitalRead=wrap(t.digitalRead,2),n.ledcSetup=wrap(t.ledcSetup,4),n.ledcAttachPin=wrap(t.ledcAttachPin,3),n.ledcDetachPin=wrap(t.ledcDetachPin,2),n.ledcWrite=wrap(t.ledcWrite,3)}),\\\"CellBot\\\",[]));const method_wrap=(e,n)=>new Sk.builtin.func(((...i)=>remapToJsFunc(get_self(i[0])[e],n,n)(...i)));i._Sensor=Sk.misceval.buildClass(i,(function(e,n){n.start=method_wrap(\\\"start\\\",1),n.stop=method_wrap(\\\"stop\\\",1)}),\\\"_Sensor\\\",[]),i._XYZSensor=Sk.misceval.buildClass(i,(function(e,n){n.x=prop_wrap(\\\"x\\\"),n.y=prop_wrap(\\\"y\\\"),n.z=prop_wrap(\\\"z\\\")}),\\\"_XYZSensor\\\",[i._Sensor]),i._OrientationSensor=Sk.misceval.buildClass(i,(function(e,n){n.quaternion=prop_wrap(\\\"quaternion\\\")}),\\\"_OrientationSensor\\\",[i._Sensor]);const sensor_factory=(e,n,t)=>i[e]=Sk.misceval.buildClass(i,(function(e,n){n.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs(\\\"__init__\\\",[e],1,1),e[0].__js_class=new t}))}),e,[n]);return i.AmbientLightSensor=Sk.misceval.buildClass(i,(function(e,i){i.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs(\\\"__init__\\\",[e],1,1),e[0].__js_class=new n.SimpleAmbientLightSensor})),i.illuminance=prop_wrap(\\\"illuminance\\\")}),\\\"AmbientLightSensor\\\",[i._Sensor]),i.GeolocationSensor=Sk.misceval.buildClass(i,(function(e,i){i.__init__=new Sk.builtin.func((function(...e){Sk.builtin.pyCheckArgs(\\\"__init__\\\",[e],1,1),e[0].__js_class=new n.SimpleGeolocationSensor})),i.latitude=prop_wrap(\\\"latitude\\\"),i.longitude=prop_wrap(\\\"longitude\\\"),i.altitude=prop_wrap(\\\"altitude\\\"),i.accuracy=prop_wrap(\\\"accuracy\\\"),i.altitudeAccuracy=prop_wrap(\\\"altitudeAccuracy\\\"),i.heading=prop_wrap(\\\"heading\\\"),i.speed=prop_wrap(\\\"speed\\\")}),\\\"GeolocationSensor\\\",[i._Sensor]),sensor_factory(\\\"Accelerometer\\\",i._XYZSensor,n.SimpleAccelerometer),sensor_factory(\\\"Gyroscope\\\",i._XYZSensor,n.SimpleGyroscope),sensor_factory(\\\"Magnetometer\\\",i._XYZSensor,n.SimpleMagnetometer),sensor_factory(\\\"LinearAccelerationSensor\\\",i._XYZSensor,n.SimpleLinearAccelerationSensor),sensor_factory(\\\"GravitySensor\\\",i._XYZSensor,n.SimpleGravitySensor),sensor_factory(\\\"AbsoluteOrientationSensor\\\",i._OrientationSensor,n.SimpleAbsoluteOrientationSensor),sensor_factory(\\\"RelativeOrientationSensor\\\",i._OrientationSensor,n.SimpleRelativeOrientationSensor),i})))};\",\"src/lib/collections.js\":\"function $builtinmodule(t){const e={};return Sk.misceval.chain(Sk.importModule(\\\"keyword\\\",!1,!0),(t=>(e._iskeyword=t.$d.iskeyword,Sk.importModule(\\\"itertools\\\",!1,!0))),(t=>(e._chain=t.$d.chain,e._starmap=t.$d.starmap,e._repeat=t.$d.repeat,Sk.importModule(\\\"operator\\\",!1,!0))),(t=>{e._itemgetter=t.$d.itemgetter}),(()=>collections_mod(e)))}function collections_mod(t){function counterNumberSlot(e){return function(i){if(void 0!==i&&!(i instanceof t.Counter))return Sk.builtin.NotImplemented.NotImplemented$;const s=new t.Counter;return e.call(this,s,i),s}}function counterInplaceSlot(t,e){return function(i){if(!(i instanceof Sk.builtin.dict))throw new Sk.builtin.TypeError(\\\"Counter \\\"+t+\\\"= \\\"+Sk.abstr.typeName(i)+\\\" is not supported\\\");return e.call(this,i),this.keep$positive()}}t.__all__=new Sk.builtin.list([\\\"deque\\\",\\\"defaultdict\\\",\\\"namedtuple\\\",\\\"Counter\\\",\\\"OrderedDict\\\"].map((t=>new Sk.builtin.str(t)))),t.defaultdict=Sk.abstr.buildNativeClass(\\\"collections.defaultdict\\\",{constructor:function defaultdict(t,e){this.default_factory=t,Sk.builtin.dict.call(this,e)},base:Sk.builtin.dict,methods:{copy:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__copy__:{$meth(){return this.$copy()},$flags:{NoArgs:!0}},__missing__:{$meth(t){if(Sk.builtin.checkNone(this.default_factory))throw new Sk.builtin.KeyError(Sk.misceval.objectRepr(t));{const e=Sk.misceval.callsimArray(this.default_factory,[]);return this.mp$ass_subscript(t,e),e}},$flags:{OneArg:!0}}},getsets:{default_factory:{$get(){return this.default_factory},$set(t){t=t||Sk.builtin.none.none$,this.default_factory=t}}},slots:{tp$doc:\\\"defaultdict(default_factory[, ...]) --\\\\x3e dict with default factory\\\\n\\\\nThe default factory is called without arguments to produce\\\\na new value when a key is not present, in __getitem__ only.\\\\nA defaultdict compares equal to a dict with the same items.\\\\nAll remaining arguments are treated the same as if they were\\\\npassed to the dict constructor, including keyword arguments.\\\\n\\\",tp$init(t,e){const i=t.shift();if(void 0===i)this.default_factory=Sk.builtin.none.none$;else{if(!Sk.builtin.checkCallable(i)&&!Sk.builtin.checkNone(i))throw new Sk.builtin.TypeError(\\\"first argument must be callable\\\");this.default_factory=i}return Sk.builtin.dict.prototype.tp$init.call(this,t,e)},$r(){const t=Sk.misceval.objectRepr(this.default_factory),e=Sk.builtin.dict.prototype.$r.call(this).v;return new Sk.builtin.str(\\\"defaultdict(\\\"+t+\\\", \\\"+e+\\\")\\\")}},proto:{$copy(){const e=[];return Sk.misceval.iterFor(Sk.abstr.iter(this),(t=>{e.push(t),e.push(this.mp$subscript(t))})),new t.defaultdict(this.default_factory,e)}}}),t.Counter=Sk.abstr.buildNativeClass(\\\"Counter\\\",{constructor:function Counter(){this.$d=new Sk.builtin.dict,Sk.builtin.dict.apply(this)},base:Sk.builtin.dict,methods:{elements:{$flags:{NoArgs:!0},$meth(){const e=t._chain.tp$getattr(new Sk.builtin.str(\\\"from_iterable\\\")),i=t._starmap,s=t._repeat,n=Sk.misceval.callsimArray;return n(e,[n(i,[s,n(this.tp$getattr(this.str$items))])])}},most_common:{$flags:{NamedArgs:[\\\"n\\\"],Defaults:[Sk.builtin.none.none$]},$meth(t){const e=this.sq$length();t=Sk.builtin.checkNone(t)||(t=Sk.misceval.asIndexOrThrow(t))>e?e:t<0?0:t;const i=this.$items().sort(((t,e)=>Sk.misceval.richCompareBool(t[1],e[1],\\\"Lt\\\")?1:Sk.misceval.richCompareBool(t[1],e[1],\\\"Gt\\\")?-1:0));return new Sk.builtin.list(i.slice(0,t).map((t=>new Sk.builtin.tuple(t))))}},update:{$flags:{FastCall:!0},$meth(t,e){return Sk.abstr.checkArgsLen(\\\"update\\\",t,0,1),this.counter$update(t,e)}},subtract:{$flags:{FastCall:!0},$meth(t,e){Sk.abstr.checkArgsLen(\\\"subtract\\\",t,0,1);const i=t[0];if(void 0!==i)if(i instanceof Sk.builtin.dict)for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,i.mp$subscript(n),\\\"Sub\\\"))}else for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,this.$one,\\\"Sub\\\"))}e=e||[];for(let s=0;s>> c = Counter('abcdeabcdabcaba') # count elements from a string\\\\n\\\\n >>> c.most_common(3) # three most common elements\\\\n [('a', 5), ('b', 4), ('c', 3)]\\\\n >>> sorted(c) # list all unique elements\\\\n ['a', 'b', 'c', 'd', 'e']\\\\n >>> ''.join(sorted(c.elements())) # list elements with repetitions\\\\n 'aaaaabbbbcccdde'\\\\n >>> sum(c.values()) # total of all counts\\\\n 15\\\\n\\\\n >>> c['a'] # count of letter 'a'\\\\n 5\\\\n >>> for elem in 'shazam': # update counts from an iterable\\\\n ... c[elem] += 1 # by adding 1 to each element's count\\\\n >>> c['a'] # now there are seven 'a'\\\\n 7\\\\n >>> del c['b'] # remove all 'b'\\\\n >>> c['b'] # now there are zero 'b'\\\\n 0\\\\n\\\\n >>> d = Counter('simsalabim') # make another counter\\\\n >>> c.update(d) # add in the second counter\\\\n >>> c['a'] # now there are nine 'a'\\\\n 9\\\\n\\\\n >>> c.clear() # empty the counter\\\\n >>> c\\\\n Counter()\\\\n\\\\n Note: If a count is set to zero or reduced to zero, it will remain\\\\n in the counter until the entry is deleted or the counter is cleared:\\\\n\\\\n >>> c = Counter('aaabbc')\\\\n >>> c['b'] -= 2 # reduce the count of 'b' by two\\\\n >>> c.most_common() # 'b' is still in, but its count is zero\\\\n [('a', 3), ('c', 1), ('b', 0)]\\\\n\\\\n\\\",tp$init(t,e){return Sk.abstr.checkArgsLen(this.tpjs_name,t,0,1),this.counter$update(t,e)},$r(){const t=this.size>0?Sk.builtin.dict.prototype.$r.call(this).v:\\\"\\\";return new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+t+\\\")\\\")},tp$as_sequence_or_mapping:!0,mp$ass_subscript(t,e){return void 0===e?this.mp$lookup(t)&&Sk.builtin.dict.prototype.mp$ass_subscript.call(this,t,e):Sk.builtin.dict.prototype.mp$ass_subscript.call(this,t,e)},tp$as_number:!0,nb$positive:counterNumberSlot((function(t){this.$items().forEach((([e,i])=>{Sk.misceval.richCompareBool(i,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(e,i)}))})),nb$negative:counterNumberSlot((function(t){this.$items().forEach((([e,i])=>{Sk.misceval.richCompareBool(i,this.$zero,\\\"Lt\\\")&&t.mp$ass_subscript(e,Sk.abstr.numberBinOp(this.$zero,i,\\\"Sub\\\"))}))})),nb$subtract:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=Sk.abstr.numberBinOp(s,e.mp$subscript(i),\\\"Sub\\\");Sk.misceval.richCompareBool(n,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(i,n)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,\\\"Lt\\\")&&t.mp$ass_subscript(e,Sk.abstr.numberBinOp(this.$zero,i,\\\"Sub\\\"))}))})),nb$add:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=Sk.abstr.numberBinOp(s,e.mp$subscript(i),\\\"Add\\\");Sk.misceval.richCompareBool(n,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(i,n)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(e,i)}))})),nb$inplace_add:counterInplaceSlot(\\\"+\\\",(function(t){t.$items().forEach((([t,e])=>{const i=Sk.abstr.numberInplaceBinOp(this.mp$subscript(t),e,\\\"Add\\\");this.mp$ass_subscript(t,i)}))})),nb$inplace_subtract:counterInplaceSlot(\\\"-\\\",(function(t){t.$items().forEach((([t,e])=>{const i=Sk.abstr.numberInplaceBinOp(this.mp$subscript(t),e,\\\"Sub\\\");this.mp$ass_subscript(t,i)}))})),nb$or:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=e.mp$subscript(i),r=Sk.misceval.richCompareBool(s,n,\\\"Lt\\\")?n:s;Sk.misceval.richCompareBool(r,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(i,r)})),e.$items().forEach((([e,i])=>{void 0===this.mp$lookup(e)&&Sk.misceval.richCompareBool(i,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(e,i)}))})),nb$and:counterNumberSlot((function(t,e){this.$items().forEach((([i,s])=>{const n=e.mp$subscript(i),r=Sk.misceval.richCompareBool(s,n,\\\"Lt\\\")?s:n;Sk.misceval.richCompareBool(r,this.$zero,\\\"Gt\\\")&&t.mp$ass_subscript(i,r)}))})),nb$inplace_and:counterInplaceSlot(\\\"&\\\",(function(t){this.$items().forEach((([e,i])=>{const s=t.mp$subscript(e);Sk.misceval.richCompareBool(s,i,\\\"Lt\\\")&&this.mp$ass_subscript(e,s)}))})),nb$inplace_or:counterInplaceSlot(\\\"|\\\",(function(t){t.$items().forEach((([t,e])=>{Sk.misceval.richCompareBool(e,this.mp$subscript(t),\\\"Gt\\\")&&this.mp$ass_subscript(t,e)}))})),nb$reflected_and:null,nb$reflected_or:null,nb$reflected_add:null,nb$reflected_subtract:null},proto:{keep$positive(){return this.$items().forEach((([t,e])=>{Sk.misceval.richCompareBool(e,this.$zero,\\\"LtE\\\")&&this.mp$ass_subscript(t)})),this},$zero:new Sk.builtin.int_(0),$one:new Sk.builtin.int_(1),str$items:new Sk.builtin.str(\\\"items\\\"),counter$update(t,e){const i=t[0];if(void 0!==i)if(Sk.builtin.checkMapping(i))if(this.sq$length())for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,i.mp$subscript(n),\\\"Add\\\"))}else this.update$common(t,void 0,\\\"update\\\");else for(let s=Sk.abstr.iter(i),n=s.tp$iternext();void 0!==n;n=s.tp$iternext()){const t=this.mp$subscript(n);this.mp$ass_subscript(n,Sk.abstr.numberBinOp(t,this.$one,\\\"Add\\\"))}if(e&&e.length)if(this.sq$length())for(let s=0;s`(${Sk.misceval.objectRepr(t)}, ${Sk.misceval.objectRepr(e)})`));return t=0===t.length?\\\"\\\":\\\"[\\\"+t.join(\\\", \\\")+\\\"]\\\",this.in$repr=!1,new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+t+\\\")\\\")},tp$richcompare(e,i){if(\\\"Eq\\\"!==i&&\\\"Ne\\\"!==i)return Sk.builtin.NotImplemented.NotImplemented$;if(!(e instanceof t.OrderedDict))return Sk.builtin.dict.prototype.tp$richcompare.call(this,e,i);const s=\\\"Eq\\\"==i,n=this.size;if(n!==e.size)return!s;const r=e.$items(),a=this.$items();for(let t=0;t=r||l>=a)switch(i){case\\\"Lt\\\":return ra;case\\\"GtE\\\":return r>=a}return\\\"Eq\\\"!==i&&(\\\"NotEq\\\"===i||Sk.misceval.richCompareBool(n[this.head+l&this.mask],e[s.head+l&s.mask],i))},tp$iter(){return new e(this)},$r(){const t=[],e=this.tail-this.head&this.mask;if(this.$entered_repr)return new Sk.builtin.str(\\\"[...]\\\");this.$entered_repr=!0;for(let s=0;s=e||t<-e)throw new Sk.builtin.IndexError(\\\"deque index out of range\\\");const i=(t>=0?this.head:this.tail)+t&this.mask;return this.v[i]},mp$ass_subscript(t,e){t=Sk.misceval.asIndexOrThrow(t);const i=this.tail-this.head&this.mask;if(t>=i||t<-i)throw new Sk.builtin.IndexError(\\\"deque index out of range\\\");void 0===e?this.del$item(t):this.set$item(t,e)},nb$inplace_add(t){this.maxlen=void 0;for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$push(i);return this},nb$inplace_multiply(t){(t=Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError,\\\"can't multiply sequence by non-int of type '{tp$name}'\\\"))<=0&&this.$clear();const e=this.$copy(),i=this.tail-this.head&this.mask;for(let s=1;s integer -- return number of occurrences of value\\\"},extend:{$meth(t){return this.$extend(t),Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Extend the right side of the deque with elements from the iterable\\\"},extendleft:{$meth(t){for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$pushLeft(i);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Extend the left side of the deque with elements from the iterable\\\"},index:{$meth(t,e,i){const s=this.$index(t,e,i);if(void 0!==s)return new Sk.builtin.int_(s);throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(t)+\\\" is not in deque\\\")},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\\\"D.index(value, [start, [stop]]) -> integer -- return first index of value.\\\\nRaises ValueError if the value is not present.\\\"},insert:{$meth(t,e){t=Sk.misceval.asIndexOrThrow(t,\\\"integer argument expected, got {tp$name}\\\");const i=this.tail-this.head&this.mask;if(void 0!==this.maxlen&&i>=this.maxlen)throw new Sk.builtin.IndexError(\\\"deque already at its maximum size\\\");t>i&&(t=i),t<=-i&&(t=0);const s=(t>=0?this.head:this.tail)+t&this.mask;let n=this.tail;for(this.tail=this.tail+1&this.mask;n!==s;){const t=n-1&this.mask;this.v[n]=this.v[t],n=t}return this.v[s]=e,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1),Sk.builtin.none.none$},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:\\\"D.insert(index, object) -- insert object before index\\\"},pop:{$meth(){return this.$pop()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Remove and return the rightmost element.\\\"},popleft:{$meth(){return this.$popLeft()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Remove and return the leftmost element.\\\"},remove:{$meth(t){const e=this.$index(t);if(void 0===e)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(t)+\\\" is not in deque\\\");let i=this.head+e&this.mask;for(;i!==this.tail;){const t=i+1&this.mask;this.v[i]=this.v[t],i=t}this.tail=this.tail-1&this.mask;var s=this.tail-this.head&this.mask;s>>1&&this.$resize(s,this.v.length>>>1)},$flags:{OneArg:!0},$textsig:null,$doc:\\\"D.remove(value) -- remove first occurrence of value.\\\"},__reversed__:{$meth(){return new i(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"D.__reversed__() -- return a reverse iterator over the deque\\\"},reverse:{$meth(){const t=this.head,e=this.tail,i=this.mask,s=this.tail-this.head&this.mask;for(let n=0;n<~~(s/2);n++){const s=e-n-1&i,r=t+n&i,a=this.v[s];this.v[s]=this.v[r],this.v[r]=a}return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"D.reverse() -- reverse *IN PLACE*\\\"},rotate:{$meth(t){t=void 0===t?1:Sk.misceval.asIndexSized(t,Sk.builtin.OverflowError);const e=this.head,i=this.tail;if(0===t||e===i)return this;if(this.head=e-t&this.mask,this.tail=i-t&this.mask,t>0)for(let s=1;s<=t;s++){const t=e-s&this.mask,n=i-s&this.mask;this.v[t]=this.v[n],this.v[n]=void 0}else for(let s=0;s>t;s--){const t=i-s&this.mask,n=e-s&this.mask;this.v[t]=this.v[n],this.v[n]=void 0}return Sk.builtin.none.none$},$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\\\"Rotate the deque n steps to the right (default n=1). If n is negative, rotates left.\\\"}},classmethods:Sk.generic.classGetItem,getsets:{maxlen:{$get(){return void 0===this.maxlen?Sk.builtin.none.none$:new Sk.builtin.int_(this.maxlen)},$doc:\\\"maximum size of a deque or None if unbounded\\\"}},proto:{$clear(){this.head=0,this.tail=0,this.mask=1,this.v=new Array(2)},$copy(){return new t.deque(this.v.slice(0),this.maxlen,this.head,this.tail,this.mask)},$extend(t){for(let e=Sk.abstr.iter(t),i=e.tp$iternext();void 0!==i;i=e.tp$iternext())this.$push(i)},set$item(t,e){const i=(t>=0?this.head:this.tail)+t&this.mask;this.v[i]=e},del$item(t){let e=(t>=0?this.head:this.tail)+t&this.mask;for(;e!==this.tail;){const t=e+1&this.mask;this.v[e]=this.v[t],e=t}const i=this.tail-this.head&this.mask;this.tail=this.tail-1&this.mask,i>>1&&this.$resize(i,this.v.length>>>1)},$push(t){this.v[this.tail]=t,this.tail=this.tail+1&this.mask,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const e=this.tail-this.head&this.mask;return void 0!==this.maxlen&&e>this.maxlen&&this.$popLeft(),this},$pushLeft(t){this.head=this.head-1&this.mask,this.v[this.head]=t,this.head===this.tail&&this.$resize(this.v.length,this.v.length<<1);const e=this.tail-this.head&this.mask;return void 0!==this.maxlen&&e>this.maxlen&&this.$pop(),this},$pop(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\\\"pop from an empty deque\\\");this.tail=this.tail-1&this.mask;const t=this.v[this.tail];this.v[this.tail]=void 0;const e=this.tail-this.head&this.mask;return e>>1&&this.$resize(e,this.v.length>>>1),t},$popLeft(){if(this.head===this.tail)throw new Sk.builtin.IndexError(\\\"pop from an empty deque\\\");const t=this.v[this.head];this.v[this.head]=void 0,this.head=this.head+1&this.mask;const e=this.tail-this.head&this.mask;return e>>1&&this.$resize(e,this.v.length>>>1),t},$resize(t,e){const i=this.head,s=this.mask;if(this.head=0,this.tail=t,this.mask=e-1,0===i)return void(this.v.length=e);const n=new Array(e);for(let r=0;r=0?i:i<-s?0:s+i;for(let o=e>=0?e:e<-s?0:s+e;o=this.$length)return;const t=(this.$index>=0?this.$head:this.$tail)+this.$index&this.$mask;return this.$index++,this.dq[t]},methods:{__length_hint__:{$meth:function __length_hint__(){return new Sk.builtin.int_(this.$length-this.$index)},$flags:{NoArgs:!0}}}}),i=Sk.abstr.buildIteratorClass(\\\"_collections._deque_reverse_iterator\\\",{constructor:function _deque_reverse_iterator(t){this.$index=(t.tail-t.head&t.mask)-1,this.dq=t.v,this.$head=t.head,this.$mask=t.mask},iternext(){if(this.$index<0)return;const t=this.$head+this.$index&this.$mask;return this.$index--,this.dq[t]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef}}),s=new RegExp(/^[0-9].*/),n=new RegExp(/^[0-9_].*/),r=new RegExp(/^\\\\w*$/),a=/,/g,o=/\\\\s+/;function namedtuple(e,i,l,h,c){if(e=e.tp$str(),Sk.misceval.isTrue(Sk.misceval.callsimArray(t._iskeyword,[e])))throw new Sk.builtin.ValueError(\\\"Type names and field names cannot be a keyword: '\\\"+Sk.misceval.objectRepr(e)+\\\"'\\\");const u=e.$jsstr();if(s.test(u)||!r.test(u)||!u)throw new Sk.builtin.ValueError(\\\"Type names and field names must be valid identifiers: '\\\"+u+\\\"'\\\");let m,d;if(Sk.builtin.checkString(i))m=i.$jsstr().replace(a,\\\" \\\").split(o),1==m.length&&\\\"\\\"===m[0]&&(m=[]),d=m.map((t=>new Sk.builtin.str(t)));else{m=[],d=[];for(let t=Sk.abstr.iter(i),e=t.tp$iternext();void 0!==e;e=t.tp$iternext())e=e.tp$str(),d.push(e),m.push(e.$jsstr())}let p=new Set;if(Sk.misceval.isTrue(l))for(let s=0;sm.length)throw new Sk.builtin.TypeError(\\\"Got more default values than field names\\\");for(let t=0,e=d.length-b.length;e\\\"'\\\"+t.$jsstr()+\\\"'\\\"))+\\\"]\\\")}return r}_make.co_varnames=[\\\"_cls\\\",\\\"iterable\\\"],_asdict.co_varnames=[\\\"self\\\"],_replace.co_kwargs=1,_replace.co_varnames=[\\\"_self\\\"];const S={};for(let s=0;sm[e]+\\\"=\\\"+Sk.misceval.objectRepr(t)));return new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+t.join(\\\", \\\")+\\\")\\\")}},flags:{sk$klass:!0},proto:Object.assign({__module__:Sk.builtin.checkNone(c)?Sk.globals.__name__:c,__slots__:new Sk.builtin.tuple,_fields:$,_field_defaults:f,_make:new Sk.builtin.classmethod(new Sk.builtin.func(_make)),_asdict:new Sk.builtin.func(_asdict),_replace:new Sk.builtin.func(_replace)},S)})}return namedtuple.co_argcount=2,namedtuple.co_kwonlyargcount=3,namedtuple.$kwdefs=[Sk.builtin.bool.false$,Sk.builtin.none.none$,Sk.builtin.none.none$],namedtuple.co_varnames=[\\\"typename\\\",\\\"field_names\\\",\\\"rename\\\",\\\"defaults\\\",\\\"module\\\"],t.namedtuple=new Sk.builtin.func(namedtuple),t}\",\"src/lib/datetime.js\":\"function $builtinmodule(){const{isTrue:t,richCompareBool:e,asIndexOrThrow:n,asIndexSized:i,objectRepr:s,opAllowsEquality:o,callsimArray:r,callsimOrSuspendArray:a}=Sk.misceval,{numberBinOp:$,typeName:c,buildNativeClass:h,checkArgsLen:m,objectHash:u,copyKeywordsToNamedArgs:l}=Sk.abstr,{int_:f,float_:d,str:w,bytes:_,tuple:p,bool:{true$:g},none:{none$:y},NotImplemented:{NotImplemented$:b},TypeError:z,ValueError:v,OverflowError:M,ZeroDivisionError:A,NotImplementedError:x,checkNumber:N,checkFloat:S,checkString:k,checkInt:O,asnum$:I,round:E,getattr:T}=Sk.builtin,{remapToPy:D,remapToJs:R}=Sk.ffi,intRound=t=>E(t).nb$int(),q=$,C=new w(\\\"auto\\\"),U=new w(\\\"utcoffset\\\"),Y=new w(\\\"tzname\\\"),j=new w(\\\"as_integer_ratio\\\"),F=new w(\\\"dst\\\"),H=new w(\\\"isoformat\\\"),J=new w(\\\"replace\\\"),B=new w(\\\"fromtimestamp\\\"),G=new w(\\\"fromordinal\\\"),L=new w(\\\"utcfromtimestamp\\\"),X=new w(\\\"strftime\\\"),P=new w(\\\"fromutc\\\"),W=new f(0),Z=new d(0),K=new f(7),V=new f(60),Q=new f(3600),tt=new f(1e3),et=new f(1e6),nt=new d(1e6),it=new f(86400),st=new d(86400);let ot=null;function pyDivMod(t,e){return q(t,e,\\\"DivMod\\\").v}function $divMod(t,e){if(\\\"number\\\"!=typeof t||\\\"number\\\"!=typeof e)return t=JSBI.BigInt(t),e=JSBI.BigInt(e),[JSBI.toNumber(JSBI.divide(t,e)),JSBI.toNumber(JSBI.remainder(t,e))];if(0===e)throw new A(\\\"integer division or modulo by zero\\\");return[Math.floor(t/e),t-Math.floor(t/e)*e]}function modf(t){const e=(t=I(t))<0?-1:1;return t=Math.abs(t),[new d(e*(t-Math.floor(t))),new d(e*Math.floor(t))]}function _d(t,e=\\\"0\\\",n=2){return t.toString().padStart(n,e)}const rt=/^[0-9]+$/;function _as_integer(t){if(!rt.test(t))throw new Error;return parseInt(t)}function _as_int_ratio(t){let e=r(t.tp$getattr(j));if(!(e instanceof p))throw new z(\\\"unexpected return type from as_integer_ratio(): expected tuple, got '\\\"+c(e)+\\\"'\\\");if(e=e.v,2!==e.length)throw new v(\\\"as_integer_ratio() must return a 2-tuple\\\");return e}return Sk.misceval.chain(Sk.importModule(\\\"time\\\",!1,!0),(a=>{const $=a.$d,E={__name__:new w(\\\"datetime\\\"),__all__:new Sk.builtin.list([\\\"date\\\",\\\"datetime\\\",\\\"time\\\",\\\"timedelta\\\",\\\"timezone\\\",\\\"tzinfo\\\",\\\"MINYEAR\\\",\\\"MAXYEAR\\\"].map((t=>new w(t))))};function _cmp(t,e){for(let n=0;ne[n]?1:-1;return 0}function _do_compare(t,e,n){const i=t.$cmp(e,n);switch(n){case\\\"Lt\\\":return i<0;case\\\"LtE\\\":return i<=0;case\\\"Eq\\\":return 0===i;case\\\"NotEq\\\":return 0!==i;case\\\"Gt\\\":return i>0;case\\\"GtE\\\":return i>=0}}const j=9999;E.MINYEAR=new f(1),E.MAXYEAR=new f(j);const rt=3652059,at=[-1,31,28,31,30,31,30,31,31,30,31,30,31],$t=[-1];let ct=0;function _is_leap(t){return t%4==0&&(t%100!=0||t%400==0)}function _days_before_year(t){const e=t-1;return 365*e+Math.floor(e/4)-Math.floor(e/100)+Math.floor(e/400)}function _days_before_month(t,e){return $t[e]+(e>2&&_is_leap(t))}function _ymd2ord(t,e,n){return _days_before_year(t)+_days_before_month(t,e)+n}at.slice(1).forEach((t=>{$t.push(ct),ct+=t}));const ht=_days_before_year(401),mt=_days_before_year(101),ut=_days_before_year(5);function _ord2ymd(t){if((t=n(t))>Number.MAX_SAFE_INTEGER)throw new M(\\\"Python int too large to convert to js number\\\");if(t<1)throw new v(\\\"ordinal must be >= 1\\\");let e,i,s,o;t-=1,[e,t]=$divMod(t,ht);let r=400*e+1;if([i,t]=$divMod(t,mt),[s,t]=$divMod(t,ut),[o,t]=$divMod(t,365),r+=100*i+4*s+o,4===o||4===i)return[r-1,12,31].map((t=>new f(t)));const a=3===o&&(24!==s||3===i);let $=t+50>>5,c=$t[$]+($>2&&a);return c>t&&($-=1,c-=at[$]+(2===$&&a)),[r,$,(t-=c)+1].map((t=>new f(t)))}const lt=[null,\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"],ft=[null,\\\"Mon\\\",\\\"Tue\\\",\\\"Wed\\\",\\\"Thu\\\",\\\"Fri\\\",\\\"Sat\\\",\\\"Sun\\\"];function _build_struct_time(t,e,n,i,s,o,r){const a=(_ymd2ord(t,e,n)+6)%7,c=_days_before_month(t,e)+n;return $.struct_time.tp$call([new p([t,e,n,i,s,o,a,c,r].map((t=>new f(t))))])}const dt={hours:t=>_d(t),minutes:(t,e)=>_d(t)+\\\":\\\"+_d(e),seconds:(t,e,n)=>_d(t)+\\\":\\\"+_d(e)+\\\":\\\"+_d(n),milliseconds:(t,e,n,i)=>_d(t)+\\\":\\\"+_d(e)+\\\":\\\"+_d(n)+\\\".\\\"+_d(i,\\\"0\\\",3),microseconds:(t,e,n,i)=>_d(t)+\\\":\\\"+_d(e)+\\\":\\\"+_d(n)+\\\".\\\"+_d(i,\\\"0\\\",6)};function _format_time(t,e,n,i,s=\\\"auto\\\"){if(\\\"string\\\"!=typeof s&&!k(s))throw new z(\\\"must be str, not \\\"+c(s));\\\"auto\\\"===(s=s.toString())?s=i?\\\"microseconds\\\":\\\"seconds\\\":\\\"milliseconds\\\"===s&&(i=Math.floor(i/1e3));let o=dt[s];if(void 0===o)throw new v(\\\"Unknown timespec value\\\");return o(t,e,n,i)}function _format_offset(t){let e,n=\\\"\\\";if(t!==y){let i,s,o;return t.$days<0?(e=\\\"-\\\",t=new wt(-t.$days,-t.$secs,-t.$micro)):e=\\\"+\\\",[i,s]=pyDivMod(t,pt),[s,o]=pyDivMod(s,gt),n+=e+`${_d(i)}:${_d(s)}`,(o.$secs||o.$micro)&&(n+=\\\":\\\"+_d(o.$secs,\\\"0\\\",2),o.$micro&&(n+=\\\".\\\"+_d(o.$micro,\\\"0\\\",6))),n}}function _wrap_strftime(t,e,n){let i=null,s=null,o=null,a=[],c=0;const h=e.length;for(;cnew f(t)))}function _parse_hh_mm_ss_ff(t){const e=t.length,n=[0,0,0,0];let i=0;for(let s=0;s<3;s++){if(e-i<2)throw new v(\\\"Incomplete time component\\\");n[s]=_as_integer(t.slice(i,i+2)),i+=2;const o=t.substr(i,1);if(!o||s>=2)break;if(\\\":\\\"!==o)throw new v(\\\"Invalid time separator: \\\"+o);i+=1}if(i0?t.slice(0,e-1):t),s=y;if(e>0){if(n=t.slice(e),![5,8,15].includes(n.length))throw new v(\\\"Malformed time zone string\\\");const i=_parse_hh_mm_ss_ff(n);if(i.every((t=>0===t)))s=St.prototype.utc;else{const n=\\\"-\\\"===t[e-1]?-1:1,o=new wt(0,n*(3600*i[0]+60*i[1]+i[2]),n*i[3]);s=new St(o)}}return i=i.map((t=>new f(t))),i.push(s),i}function _check_tzname(t){if(t!==y&&!k(t))throw new z(\\\"tzinfo.tzname() must return None or string, not '\\\"+c(t)+\\\"'\\\")}function _check_utc_offset(t,n){if(n!==y){if(!(n instanceof wt))throw new z(`tzinfo.${t}() must return None or timedelta, not '${c(n)}'`);if(!e(zt,n,\\\"Lt\\\")||!e(n,_t,\\\"Lt\\\"))throw new v(`${t}()=${n.toString()}, must be strictly between -timedelta(hours=24) and timedelta(hours=24)`)}}function _check_date_fields(t,e=null,i=null){if(null===e||null===i){throw new z(`function missing required argument '${null===i?\\\"day\\\":\\\"month\\\"}' (pos ${null===i?\\\"3\\\":\\\"2\\\"})`)}if(t=n(t),e=n(e),i=n(i),!(1<=t&&t<=j))throw new v(\\\"year must be in 1..\\\"+j,new f(t));if(!(1<=e&&e<=12))throw new v(\\\"month must be in 1..12\\\",new f(e));const s=function _days_in_month(t,e){return 2===e&&_is_leap(t)?29:at[e]}(t,e);if(!(1<=i&&i<=s))throw new v(\\\"day must be in 1..\\\"+s,new f(i));return[t,e,i]}function _check_time_fields(t,e,i,s,o){if(t=n(t),e=n(e),i=n(i),s=n(s),o=n(o),!(0<=t&&t<=23))throw new v(\\\"hour must be in 0..23\\\",new f(t));if(!(0<=e&&e<=59))throw new v(\\\"minute must be in 0..59\\\",new f(e));if(!(0<=i&&i<=59))throw new v(\\\"second must be in 0..59\\\",new f(i));if(!(0<=s&&s<=999999))throw new v(\\\"microsecond must be in 0..999999\\\",new f(s));if(0!==o&&1!==o)throw new v(\\\"fold must be either 0 or 1\\\",new f(o));return[t,e,i,s,o]}function _check_tzinfo_arg(t){if(t!==y&&!(t instanceof Mt))throw new z(\\\"tzinfo argument must be None or of a tzinfo subclass\\\")}function _divide_and_round(t,e){let[n,i]=$divMod(t,e);return i*=2,((e>0?i>e:i999999999)throw new M(`days=${t}; must have magnitude <= 999999999`)},slots:{tp$new(t,e){let i,s,o,r,a,$,c,[h,m,u,d,w,_,p]=l(\\\"timedelta\\\",[\\\"days\\\",\\\"seconds\\\",\\\"microseconds\\\",\\\"milliseconds\\\",\\\"minutes\\\",\\\"hours\\\",\\\"weeks\\\"],t,e,new Array(7).fill(W));i=s=o=W,h=q(h,q(p,K,\\\"Mult\\\"),\\\"Add\\\"),m=q(m,q(q(w,V,\\\"Mult\\\"),q(_,Q,\\\"Mult\\\"),\\\"Add\\\"),\\\"Add\\\"),u=q(u,q(d,tt,\\\"Mult\\\"),\\\"Add\\\"),S(h)?([r,h]=modf(h),[a,$]=modf(q(r,st,\\\"Mult\\\")),s=new f($),i=new f(h)):(a=Z,i=h),S(m)?([c,m]=modf(m),m=new f(m),c=q(c,a,\\\"Add\\\")):c=a,[h,m]=pyDivMod(m,it),i=q(i,h,\\\"Add\\\"),s=q(s,new f(m),\\\"Add\\\");const g=q(c,nt,\\\"Mult\\\");if(S(u)?(u=intRound(q(u,g,\\\"Add\\\")),[m,u]=pyDivMod(u,et),[h,m]=pyDivMod(m,it),i=q(i,h,\\\"Add\\\"),s=q(s,m,\\\"Add\\\")):(u=new f(u),[m,u]=pyDivMod(u,et),[h,m]=pyDivMod(m,it),i=q(i,h,\\\"Add\\\"),s=q(s,m,\\\"Add\\\"),u=intRound(q(u,g,\\\"Add\\\"))),[m,o]=pyDivMod(u,et),s=q(s,m,\\\"Add\\\"),[h,s]=pyDivMod(s,it),i=q(i,h,\\\"Add\\\"),i=n(i),s=n(s),o=n(o),Math.abs(i)>999999999)throw new M(\\\"timedelta # of days is too large: \\\"+h.toString());if(this===wt.prototype)return new wt(i,s,o);{const t=new this.constructor;return wt.call(t,i,s,o),t}},$r(){const t=[];return this.$days&&t.push(`days=${this.$days}`),this.$secs&&t.push(`seconds=${this.$secs}`),this.$micro&&t.push(`microseconds=${this.$micro}`),t.length||t.push(\\\"0\\\"),new w(`${this.tp$name}(${t.join(\\\", \\\")})`)},tp$str(){const t=this.$secs%60;let e=Math.floor(this.$secs/60);const n=Math.floor(e/60);e%=60;let i=`${n}:${_d(e)}:${_d(t)}`;if(this.$days){i=`${this.$days} day${function plural(t){return 1!==Math.abs(t)?\\\"s\\\":\\\"\\\"}(this.$days)}, `+i}return this.$micro&&(i+=`.${_d(this.$micro,\\\"0\\\",6)}`),new w(i)},tp$as_number:!0,nb$add(t){return t instanceof wt?new wt(this.$days+t.$days,this.$secs+t.$secs,this.$micro+t.$micro):b},nb$subtract(t){return t instanceof wt?new wt(this.$days-t.$days,this.$secs-t.$secs,this.$micro-t.$micro):b},nb$positive(){return this},nb$negative(){return new wt(-this.$days,-this.$secs,-this.$micro)},nb$abs(){return this.$days<0?this.nb$negative():this},nb$multiply(t){if(O(t))return t=i(t,M),new wt(this.$days*t,this.$secs*t,this.$micro*t);if(S(t)){const e=this.$toMicrosecs();let[s,o]=_as_int_ratio(t);return s=i(s,M),o=n(o),new wt(0,0,_divide_and_round(e*s,o))}return b},nb$floor_divide(t){const e=this.$toMicrosecs();if(t instanceof wt){const n=t.$toMicrosecs();if(0===n)throw new A(\\\"integer division or modulo by zero\\\");return new f(Math.floor(e/n))}if(O(t)){if(0===(t=i(t,M)))throw new A(\\\"integer division or modulo by zero\\\");return new wt(0,0,Math.floor(e/t))}return b},nb$divide(t){const e=this.$toMicrosecs();if(t instanceof wt){if(0===t.$toMicrosecs())throw new A(\\\"integer division or modulo by zero\\\");return new d(e/t.$toMicrosecs())}if(O(t))return t=n(t),new wt(0,0,_divide_and_round(e,t));if(S(t)){let[s,o]=_as_int_ratio(t);return s=n(s),o=i(o,M),new wt(0,0,_divide_and_round(o*e,s))}return b},nb$remainder(t){if(!(t instanceof wt))return b;const e=this.$toMicrosecs(),n=t.$toMicrosecs();if(0===n)throw new A(\\\"integer division or modulo by zero\\\");const i=e-Math.floor(e/n)*n;return new wt(0,0,i)},nb$divmod(t){if(!(t instanceof wt))return b;const e=this.$toMicrosecs(),n=t.$toMicrosecs(),[i,s]=$divMod(e,n);return new p([new f(i),new wt(0,0,s)])},tp$richcompare(t,e){return t instanceof wt?_do_compare(this,t,e):b},tp$hash(){return-1===this.$hashcode&&(this.$hashcode=u(new p(this.$getState().map((t=>new f(t)))))),this.$hashcode},nb$bool(){return 0!==this.$days||0!==this.$secs||0!==this.$micro}},methods:{total_seconds:{$meth(){return new d(((86400*this.$days+this.$secs)*10**6+this.$micro)/10**6)},$flags:{NoArgs:!0},$doc:\\\"Total seconds in the duration.\\\"},__reduce__:{$meth(){return new p([this.ob$type,new p(this.$getState().map((t=>D(t))))])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"__reduce__() -> (cls, state)\\\"}},getsets:{days:{$get(){return new f(this.$days)},$doc:\\\"Number of days.\\\"},seconds:{$get(){return new f(this.$secs)},$doc:\\\"Number of seconds (>= 0 and less than 1 day).\\\"},microseconds:{$get(){return new f(this.$micro)},$doc:\\\"Number of microseconds (>= 0 and less than 1 second).\\\"}},proto:{$toMicrosecs(){return 1e6*(86400*this.$days+this.$secs)+this.$micro},$cmp(t){return _cmp(this.$getState(),t.$getState())},$getState(){return[this.$days,this.$secs,this.$micro]}}});wt.prototype.min=new wt(-999999999),wt.prototype.max=new wt(999999999,86399,999999),wt.prototype.resolution=new wt(0,0,1);const _t=new wt(1),pt=new wt(0,3600),gt=new wt(0,60),yt=new wt(0,1),bt=new wt(0),zt=new wt(-1),vt=E.date=h(\\\"datetime.date\\\",{constructor:function date(t,e,n){this.$year=t,this.$month=e,this.$day=n,this.$hashcode=-1},slots:{tp$new(t,e){let n,[i,s,o]=l(\\\"date\\\",[\\\"year\\\",\\\"month\\\",\\\"day\\\"],t,e,[null,null]);if(null===s&&i instanceof _&&4===(n=i.valueOf()).length&&1<=n[2]&&n[2]<=12){const t=new this.constructor;return t.$setState(n),t}if([i,s,o]=_check_date_fields(i,s,o),this===vt.prototype)return new vt(i,s,o);{const t=new this.constructor;return vt.call(t,i,s,o),t}},$r(){return new w(`${this.tp$name}(${this.$year}, ${this.$month}, ${this.$day})`)},tp$str(){return this.tp$getattr(H).tp$call([])},tp$richcompare(t,e){return t instanceof vt?_do_compare(this,t,e):b},tp$hash(){return-1===this.$hashcode&&(this.$hashcode=u(this.$getState())),this.$hashcode},tp$as_number:!0,nb$add(t){if(t instanceof wt){const e=this.$toOrdinal()+t.$days;if(0 local date from a POSIX timestamp (like time.time()).\\\"},fromordinal:{$meth:function fromordinal(t){return this.tp$call(_ord2ymd(t))},$flags:{OneArg:!0},$textsig:null,$doc:\\\"int -> date corresponding to a proleptic Gregorian ordinal.\\\"},fromisocalendar:{$meth:function fromisocalendar(t,e,i){if(t=n(t),e=n(e),i=n(i),!(1<=t&&t<=j))throw new v(`Year is out of range: ${t}`);let s,o;if(!(0 date corresponding to a proleptic Gregorian ordinal.\\\"},fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z(\\\"fromisoformat: argument must be str\\\");t=t.toString();try{if(10!==t.length)throw new Error;return this.tp$call(_parse_isoformat_date(t))}catch(e){throw new v(\\\"Invalid isoformat string: '\\\"+t+\\\"'\\\")}},$flags:{OneArg:!0},$textsig:null,$doc:\\\"str -> Construct a date from the output of date.isoformat()\\\"},today:{$meth:function today(){const t=$.time.tp$call([]);return this.tp$getattr(B).tp$call([t])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Current date or datetime: same as self.__class__.fromtimestamp(time.time()).\\\"}},methods:{ctime:{$meth:function ctime(){const t=this.$toOrdinal()%7||7,e=ft[t],n=lt[this.$month];return new w(`${e} ${n} ${_d(this.$day,\\\" \\\",2)} 00:00:00 ${_d(this.$year,\\\"0\\\",4)}`)},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return ctime() style string.\\\"},strftime:{$meth:function strftime(t){if(!k(t))throw new z(\\\"must be str, not \\\"+c(t));return _wrap_strftime(this,t=t.toString(),this.$timetuple())},$flags:{OneArg:!0},$textsig:null,$doc:\\\"format -> strftime() style string.\\\"},__format__:{$meth:function __format__(t){if(!k(t))throw new z(\\\"must be str, not \\\"+c(t));return\\\"\\\"!==t.v?this.tp$getattr(X).tp$call([t]):this.tp$str()},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Formats self with strftime.\\\"},timetuple:{$meth:function timetuple(){return this.$timetuple()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return time tuple, compatible with time.localtime().\\\"},isocalendar:{$meth:function isocalendar(){let t=this.$year,e=_isoweek1monday(t);const n=_ymd2ord(this.$year,this.$month,this.$day);let[i,s]=$divMod(n-e,7);return i<0?(t-=1,e=_isoweek1monday(t),[i,s]=$divMod(n-e,7)):i>=52&&n>=_isoweek1monday(t+1)&&(t+=1,i=0),new At(new f(t),new f(i+1),new f(s+1))},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return a 3-tuple containing ISO year, week number, and weekday.\\\"},isoformat:{$meth:function isoformat(){return this.$isoformat()},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return string in ISO 8601 format, YYYY-MM-DD.\\\"},isoweekday:{$meth:function isoweekday(){return new f(this.$toOrdinal()%7||7)},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return the day of the week represented by the date.\\\\nMonday == 1 ... Sunday == 7\\\"},toordinal:{$meth:function toordinal(){return new f(this.$toOrdinal())},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return proleptic Gregorian ordinal. January 1 of year 1 is day 1.\\\"},weekday:{$meth:function weekday(){return new f((this.$toOrdinal()+6)%7)},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return the day of the week represented by the date.\\\\nMonday == 0 ... Sunday == 6\\\"},replace:{$meth:function replace(t,e,n){return t===y&&(t=new f(this.$year)),e===y&&(e=new f(this.$month)),n===y&&(n=new f(this.$day)),this.ob$type.tp$call([t,e,n])},$flags:{NamedArgs:[\\\"year\\\",\\\"month\\\",\\\"day\\\"],Defaults:[y,y,y]},$textsig:null,$doc:\\\"Return date with new specified fields.\\\"},__reduce__:{$meth(){return new p([this.ob$type,new p([this.$getState()])])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"__reduce__() -> (cls, state)\\\"}},getsets:{year:{$get(){return new f(this.$year)},$doc:\\\"year (1-9999)\\\"},month:{$get(){return new f(this.$month)},$doc:\\\"month (1-12)\\\"},day:{$get(){return new f(this.$day)},$doc:\\\"day (1-31)\\\"}},proto:{$cmp(t){return _cmp([this.$year,this.$month,this.$day],[t.$year,t.$month,t.$day])},$getState(){const[t,e]=$divMod(this.$year,256);return new _([t,e,this.$month,this.$day])},$setState(t){const[e,n,i,s]=t,o=256*e+n;this.$year=o,this.$month=i,this.$day=s},$toOrdinal(){return _ymd2ord(this.$year,this.$month,this.$day)},$isoformat(){return new w(`${_d(this.$year,\\\"0\\\",4)}-${_d(this.$month,\\\"0\\\",2)}-${_d(this.$day,\\\"0\\\",2)}`)},$timetuple(){return _build_struct_time(this.$year,this.$month,this.$day,this.$hour||0,this.$min||0,this.$sec||0,-1)},$strftime(t=\\\"\\\"){return _wrap_strftime(this,t.toString(),this.$timetuple())}}});vt.prototype.min=new vt(1,1,1),vt.prototype.max=new vt(9999,12,31),vt.prototype.resolution=new wt(1);const Mt=E.tzinfo=h(\\\"datetime.tzinfo\\\",{constructor:function tzinfo(){},methods:{tzname:{$meth:function tzname(t){throw new x(\\\"tzinfo subclass must override tzname()\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"datetime -> string name of time zone.\\\"},utcoffset:{$meth:function utcoffset(t){throw new x(\\\"tzinfo subclass must override utcoffset()\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"datetime -> timedelta showing offset from UTC, negative values indicating West of UTC\\\"},dst:{$meth:function dst(t){throw new x(\\\"tzinfo subclass must override dst()\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"datetime -> DST offset as timedelta positive east of UTC.\\\"},fromutc:{$meth:function fromutc(e){if(!(e instanceof Nt))throw new z(\\\"fromutc() requires a datetime argument\\\");if(e.$tzinfo!==this)throw new v(\\\"dt.tzinfo is not self\\\");const n=r(e.tp$getattr(U));if(n===y)throw new v(\\\"fromutc() requires a non-None utcoffset() result\\\");let i=r(e.tp$getattr(F));if(i===y)throw new v(\\\"fromutc() requires a non-None dst() result\\\");const s=q(n,i,\\\"Sub\\\");if(t(s)&&(e=q(e,s,\\\"Add\\\"),i=r(e.tp$getattr(F)),i===y))throw new v(\\\"fromutc(): dt.dst gave inconsistent results; cannot convert\\\");return q(e,i,\\\"Add\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"datetime in UTC -> datetime in local time.\\\"},__reduce__:{$meth(){let e,n;const i=T(this,new w(\\\"__getinitargs__\\\"),y);e=i!==y?r(i,[]):new p;const s=T(this,new w(\\\"__getstate__\\\"),y);return s!==y?n=r(s,[]):(n=T(this,new w(\\\"__dict__\\\"),y),n=t(n)?n:y),new p(n===y?[this.ob$type,e]:[this.ob$type,e,n])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"-> (cls, state)\\\"}}}),At=h(\\\"datetime.IsoCalendarDate\\\",{base:p,constructor:function IsoCalendarDate(t,e,n){this.y=t,this.w=e,this.wd=n,p.call(this,[t,e,n])},slots:{tp$new(t,e){const[n,i,s]=l(\\\"IsoCalendarDate\\\",[\\\"year\\\",\\\"week\\\",\\\"weekday\\\"],t,e);return new this.constructor(n,i,s)},$r(){return new w(`${this.tp$name}(year=${this.y}, week=${this.w}, weekday=${this.wd})`)}},getsets:{year:{$get(){return this.y}},week:{$get(){return this.w}},weekday:{$get(){return this.wd}}}}),xt=E.time=h(\\\"datetime.time\\\",{constructor:function time(t=0,e=0,n=0,i=0,s=null,o=0){this.$hour=t,this.$min=e,this.$sec=n,this.$micro=i,this.$tzinfo=s||y,this.$fold=o,this.$hashcode=-1},slots:{tp$new(t,e){m(\\\"time\\\",t,0,5);let n,[i,s,o,r,a,$]=l(\\\"time\\\",[\\\"hour\\\",\\\"minute\\\",\\\"second\\\",\\\"microsecond\\\",\\\"tzinfo\\\",\\\"fold\\\"],t,e,[W,W,W,W,y,W]);if(i instanceof _&&6===(n=i.valueOf()).length&&(127&n[0])<24){const t=new this.constructor;return t.$setState(n,s===W?y:s),t}if([i,s,o,r,$]=_check_time_fields(i,s,o,r,$),_check_tzinfo_arg(a),this===xt.prototype)return new xt(i,s,o,r,a,$);{const t=new this.constructor;return xt.call(t,i,s,o,r,a,$),t}},tp$richcompare(t,e){return t instanceof xt?_do_compare(this,t,e):b},tp$hash(){if(-1===this.$hashcode){const e=this.$fold?r(this.tp$getattr(J),[],[\\\"fold\\\",W]):this,n=r(e.tp$getattr(U));if(t(n)){let[t,e]=pyDivMod(new wt(0,3600*this.$hour+60*this.$min).nb$subtract(n),pt);e=e.nb$floor_divide(gt),0<=t&&t<=24?(t=I(t),e=I(e),this.$hashcode=u(new xt(t,e,this.$sec,this.$micro))):this.$hashcode=u(new p([t,e,new f(this.$sec),new f(this.$micro)]))}else this.$hashcode=u(e.$getState()[0])}return this.$hashcode},$r(){let t;return t=0!==this.$micro?`, ${this.$sec}, ${this.$micro}`:0!==this.$sec?`, ${this.$sec}`:\\\"\\\",t=`${this.tp$name}(${this.$hour}, ${this.$min}${t})`,this.$tzinfo!==y&&(t=t.slice(0,-1)+\\\", tzinfo=\\\"+s(this.$tzinfo)+\\\")\\\"),this.$fold&&(t=t.slice(0,-1)+\\\", fold=1)\\\"),new w(t)},tp$str(){return this.tp$getattr(H).tp$call([])}},methods:{isoformat:{$meth:function isoformat(t){let e=_format_time(this.$hour,this.$min,this.$sec,this.$micro,t);const n=this.$tzstr();return n&&(e+=n),new w(e)},$flags:{NamedArgs:[\\\"timespec\\\"],Defaults:[C]},$textsig:null,$doc:\\\"Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\\\\n\\\\ntimespec specifies what components of the time to include.\\\\n\\\"},strftime:{$meth:function strftime(t){if(!k(t))throw new z(\\\"must be str, not \\\"+c(t));return _wrap_strftime(this,t=t.toString(),new p([1900,1,1,this.$hour,this.$min,this.$sec,0,1,-1].map((t=>new f(t)))))},$flags:{OneArg:!0},$textsig:null,$doc:\\\"format -> strftime() style string.\\\"},__format__:{$meth:function __format__(t){if(!k(t))throw new z(\\\"must be str, not \\\"+c(t));return\\\"\\\"!==t.v?this.tp$getattr(X).tp$call([t]):this.tp$str()},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Formats self with strftime.\\\"},utcoffset:{$meth:function utcoffset(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(U),e=r(t,[y]);return _check_utc_offset(\\\"utcoffset\\\",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.utcoffset(self).\\\"},tzname:{$meth:function tzname(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(Y),e=r(t,[y]);return _check_tzname(e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.tzname(self).\\\"},dst:{$meth:function dst(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(F),e=r(t,[y]);return _check_utc_offset(\\\"dst\\\",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.dst(self).\\\"},replace:{$meth:function replace(t,e){m(\\\"replace\\\",t,0,5);let[n,i,s,o,r,a]=l(\\\"replace\\\",[\\\"hour\\\",\\\"minute\\\",\\\"second\\\",\\\"microsecond\\\",\\\"tzinfo\\\",\\\"fold\\\"],t,e,[y,y,y,y,g,y]);return n===y&&(n=new f(this.$hour)),i===y&&(i=new f(this.$min)),s===y&&(s=new f(this.$sec)),o===y&&(o=new f(this.$micro)),r===g&&(r=this.$tzinfo),a===y&&(a=new f(this.$fold)),this.ob$type.tp$call([n,i,s,o,r],[\\\"fold\\\",a])},$flags:{FastCall:!0},$textsig:null,$doc:\\\"Return time with new specified fields.\\\"},__reduce_ex__:{$meth(t){return new p([this.ob$type,new p(this.$getState(R(t)))])},$flags:{OneArg:!0},$textsig:null,$doc:\\\"__reduce_ex__(proto) -> (cls, state)\\\"},__reduce__:{$meth(){return this.tp$getattr(new w(\\\"__reduce_ex__\\\")).tp$call([new f(2)])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"__reduce__() -> (cls, state)\\\"}},classmethods:{fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z(\\\"fromisoformat: argument must be str\\\");t=t.toString();try{return this.tp$call(_parse_isoformat_time(t))}catch{throw new v(\\\"Invalid isofrmat string: '\\\"+t+\\\"'\\\")}},$flags:{OneArg:!0},$textsig:null,$doc:\\\"string -> time from time.isoformat() output\\\"}},getsets:{hour:{$get(){return new f(this.$hour)}},minute:{$get(){return new f(this.$min)}},second:{$get(){return new f(this.$sec)}},microsecond:{$get(){return new f(this.$micro)}},tzinfo:{$get(){return this.$tzinfo}},fold:{$get(){return new f(this.$fold)}}},proto:{$cmp(t,n){const s=this.$tzinfo,o=t.$tzinfo;let a,$,c;if(a=$=y,s===o?c=!0:(a=r(this.tp$getattr(U)),$=r(t.tp$getattr(U)),c=e(a,$,\\\"Eq\\\")),c)return _cmp([this.$hour,this.$min,this.$sec,this.$micro],[t.$hour,t.$min,t.$sec,t.$micro]);if(a===y||$===y){if(\\\"Eq\\\"===n||\\\"NotEq\\\"===n)return 2;throw new z(\\\"cannot compare naive and aware times\\\")}const h=60*this.$hour+this.$min-i(a.nb$floor_divide(gt)),m=60*t.$hour+t.$min-i($.nb$floor_divide(gt));return _cmp([h,this.$sec,this.$micro],[m,t.$sec,t.$micro])},$tzstr(){return _format_offset(r(this.tp$getattr(U)))},$getState(t=3){let[e,n]=$divMod(this.$micro,256),[i,s]=$divMod(e,256),o=this.$hour;this.$fold&&t>3&&(o+=128);const r=new _([o,this.$min,this.$sec,i,s,n]);return this.$tzinfo===y?[r]:[r,this.$tzinfo]},$setState(t,e){const[n,i,s,o,r,a]=t;n>127?(this.$fold=1,this.$hour=n-128):(this.$fold=0,this.$hour=n),this.$min=i,this.$sec=s,this.$micro=(o<<8|r)<<8|a,this.$tzinfo=e}}});xt.prototype.min=new xt(0,0,0),xt.prototype.max=new xt(23,59,59,999999),xt.prototype.resolution=new wt;const Nt=E.datetime=h(\\\"datetime.datetime\\\",{base:vt,constructor:function datetime(t,e,n,i=0,s=0,o=0,r=0,a=null,$=0){this.$year=t,this.$month=e,this.$day=n,this.$hour=i,this.$min=s,this.$sec=o,this.$micro=r,this.$tzinfo=a||y,this.$fold=$,this.$hashcode=-1},slots:{tp$new(t,e){m(\\\"datetime\\\",t,0,9);let n,[i,s,o,r,a,$,c,h,u]=l(\\\"time\\\",[\\\"year\\\",\\\"month\\\",\\\"day\\\",\\\"hour\\\",\\\"minute\\\",\\\"second\\\",\\\"microsecond\\\",\\\"tzinfo\\\",\\\"fold\\\"],t,e,[null,null,W,W,W,W,y,W]);if(i instanceof _&&10===(n=i.valueOf()).length&&(127&n[2])<=12){const t=new this.constructor;return t.$setState(n,null===s?y:s),t}if([i,s,o]=_check_date_fields(i,s,o),[r,a,$,c,u]=_check_time_fields(r,a,$,c,u),_check_tzinfo_arg(h),this===Nt.prototype)return new Nt(i,s,o,r,a,$,c,h,u);{const t=new this.constructor;return Nt.call(t,i,s,o,r,a,$,c,h,u),t}},$r(){const t=[this.$year,this.$month,this.$day,this.$hour,this.$min,this.$sec,this.$micro];0===t[t.length-1]&&t.pop(),0===t[t.length-1]&&t.pop();let e=`${this.tp$name}(${t.join(\\\", \\\")})`;return this.$tzinfo!==y&&(e=e.slice(0,-1)+\\\", tzinfo=\\\"+s(this.$tzinfo)+\\\")\\\"),this.$fold&&(e=e.slice(0,-1)+\\\", fold=1)\\\"),new w(e)},tp$str(){return this.tp$getattr(H).tp$call([],[\\\"sep\\\",new w(\\\" \\\")])},tp$richcompare(t,e){if(t instanceof Nt)return _do_compare(this,t,e);if(!(t instanceof vt))return b;if(\\\"Eq\\\"===e||\\\"NotEq\\\"===e)return\\\"NotEq\\\"===e;throw new z(`can't compare '${c(this)}' to '${c(t)}'`)},tp$as_number:!0,nb$add(t){if(!(t instanceof wt))return b;let e=new wt(this.$toOrdinal(),3600*this.$hour+60*this.$min+this.$sec,this.$micro);e=q(e,t,\\\"Add\\\");let[n,i]=$divMod(e.$secs,3600),[s,o]=$divMod(i,60);if(0 string in ISO 8601 format, YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\\\\nsep is used to separate the year from the time, and defaults to 'T'.\\\\ntimespec specifies what components of the time to include (allowed values are 'auto', 'hours', 'minutes', 'seconds', 'milliseconds', and 'microseconds').\\\\n\\\"},utcoffset:{$meth:function utcoffset(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(U),e=r(t,[this]);return _check_utc_offset(\\\"utcoffset\\\",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.utcoffset(self).\\\"},tzname:{$meth:function tzname(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(Y),e=r(t,[this]);return _check_tzname(e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.tzname(self).\\\"},dst:{$meth:function dst(){if(this.$tzinfo===y)return y;const t=this.$tzinfo.tp$getattr(F),e=r(t,[this]);return _check_utc_offset(\\\"dst\\\",e),e},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return self.tzinfo.dst(self).\\\"},replace:{$meth:function replace(t,e){m(\\\"replace\\\",t,0,8);let[n,i,s,o,r,a,$,c,h]=l(\\\"replace\\\",[\\\"year\\\",\\\"month\\\",\\\"day\\\",\\\"hour\\\",\\\"minute\\\",\\\"second\\\",\\\"microsecond\\\",\\\"tzinfo\\\",\\\"fold\\\"],t,e,[y,y,y,y,y,y,y,g,y]);return n===y&&(n=new f(this.$year)),i===y&&(i=new f(this.$month)),s===y&&(s=new f(this.$day)),o===y&&(o=new f(this.$hour)),r===y&&(r=new f(this.$min)),a===y&&(a=new f(this.$sec)),$===y&&($=new f(this.$micro)),c===g&&(c=this.$tzinfo),h===y&&(h=new f(this.$fold)),this.ob$type.tp$call([n,i,s,o,r,a,$,c],[\\\"fold\\\",h])},$flags:{FastCall:!0},$textsig:null,$doc:\\\"Return datetime with new specified fields.\\\"},astimezone:{$meth:function astimezone(t){if(t===y)t=this.$localTimezone();else if(!(t instanceof Mt))throw new z(\\\"tz argument must be an instance of tzinfo\\\");let e,n=this.$tzinfo;if(n===y?(n=this.$localTimezone(),e=r(n.tp$getattr(U),[this])):(e=r(n.tp$getattr(U),[this]),e===y&&(n=r(this.tp$getattr(J),[],[\\\"tzinfo\\\",y]).$localTimezone(),e=r(n.tp$getattr(U),[this]))),t===n)return this;const i=r(this.nb$subtract(e).tp$getattr(J),[],[\\\"tzinfo\\\",t]);return t.tp$getattr(P).tp$call([i])},$flags:{NamedArgs:[\\\"tz\\\"],Defaults:[y]},$textsig:null,$doc:\\\"tz -> convert to local time in new timezone tz\\\\n\\\"},__reduce_ex__:{$meth(t){return new p([this.ob$type,new p(this.$getState(R(t)))])},$flags:{OneArg:!0},$textsig:null,$doc:\\\"__reduce_ex__(proto) -> (cls, state)\\\"},__reduce__:{$meth(){return this.tp$getattr(new w(\\\"__reduce_ex__\\\")).tp$call([new f(2)])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"__reduce__() -> (cls, state)\\\"}},classmethods:{now:{$meth:function now(t){const e=$.time.tp$call([]);return this.tp$getattr(B).tp$call([e,t])},$flags:{NamedArgs:[\\\"tz\\\"],Defaults:[y]},$textsig:\\\"($type, /, tz=None)\\\",$doc:\\\"Returns new datetime object representing current time local to tz.\\\\n\\\\n tz\\\\n Timezone object.\\\\n\\\\nIf no tz is specified, uses local timezone.\\\"},utcnow:{$meth:function utcnow(){const t=$.time.tp$call([]);return this.tp$getattr(L).tp$call([t])},$flags:{NoArgs:!0},$textsig:null,$doc:\\\"Return a new datetime representing UTC day and time.\\\"},fromtimestamp:{$meth:function fromtimestamp(t,e){return _check_tzinfo_arg(e),this.prototype.$fromtimestamp.call(this,t,e!==y,e)},$flags:{NamedArgs:[\\\"timestamp\\\",\\\"tz\\\"],Defaults:[y]},$textsig:null,$doc:\\\"timestamp[, tz] -> tz's local time from POSIX timestamp.\\\"},utcfromtimestamp:{$meth:function utcfromtimestamp(t){return this.prototype.$fromtimestamp.call(this,t,!0,y)},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Construct a naive UTC datetime from a POSIX timestamp.\\\"},strptime:{$meth:function strptime(t,e){return null===ot?Sk.misceval.chain(Sk.importModule(\\\"_strptime\\\",!1,!0),(n=>(ot=n.tp$getattr(new w(\\\"_strptime_datetime\\\")),ot.tp$call([this,t,e])))):ot.tp$call([this,t,e])},$flags:{MinArgs:2,MaxArgs:2},$textsig:null,$doc:\\\"string, format -> new datetime parsed from a string (like time.strptime()).\\\"},combine:{$meth:function combine(t,e,n){if(!(t instanceof vt))throw new z(\\\"date argument must be a date instance\\\");if(!(e instanceof xt))throw new z(\\\"time argument must be a time instance\\\");n===g&&(n=e.$tzinfo);const i=[t.$year,t.$month,t.$day,e.$hour,e.$min,e.$sec,e.$micro].map((t=>new f(t)));return i.push(n),this.tp$call(i,[\\\"fold\\\",new f(e.$fold)])},$flags:{NamedArgs:[\\\"date\\\",\\\"time\\\",\\\"tzinfo\\\"],Defaults:[g]},$textsig:null,$doc:\\\"date, time -> datetime with same date and time fields\\\"},fromisoformat:{$meth:function fromisoformat(t){if(!k(t))throw new z(\\\"fromisoformat: argument must be str\\\");const e=(t=t.toString()).slice(0,10),n=t.slice(11);let i,s;try{i=_parse_isoformat_date(e)}catch(o){throw new v(\\\"Invalid isoformat string: '\\\"+t+\\\"'\\\")}if(n)try{s=_parse_isoformat_time(n)}catch(o){throw new v(\\\"Invalid isoformat string: '\\\"+t+\\\"'\\\")}else s=[W,W,W,W,y];return this.tp$call(i.concat(s))},$flags:{OneArg:!0},$textsig:null,$doc:\\\"string -> datetime from datetime.isoformat() output\\\"}},getsets:{hour:{$get(){return new f(this.$hour)}},minute:{$get(){return new f(this.$min)}},second:{$get(){return new f(this.$sec)}},microsecond:{$get(){return new f(this.$micro)}},tzinfo:{$get(){return this.$tzinfo}},fold:{$get(){return new f(this.$fold)}}},proto:{$cmp(n,i){const s=this.$tzinfo,o=n.$tzinfo;let a,$,c;if(a=$=y,s===o)c=!0;else{if(a=r(this.tp$getattr(U)),$=r(n.tp$getattr(U)),\\\"Eq\\\"===i||\\\"NotEq\\\"===i){const t=r(this.tp$getattr(J),[],[\\\"fold\\\",new f(Number(!this.$fold))]);if(e(a,r(t.tp$getattr(U)),\\\"NotEq\\\"))return 2;const i=r(n.tp$getattr(J),[],[\\\"fold\\\",new f(Number(!n.$fold))]);if(e($,r(i.tp$getattr(U)),\\\"NotEq\\\"))return 2}c=e(a,$,\\\"Eq\\\")}if(c)return _cmp([this.$year,this.$month,this.$day,this.$hour,this.$min,this.$sec,this.$micro],[n.$year,n.$month,n.$day,n.$hour,n.$min,n.$sec,n.$micro]);if(a===y||$===y){if(\\\"Eq\\\"===i||\\\"NotEq\\\"===i)return 2;throw new z(\\\"cannot compare naive and aware datetimes\\\")}const h=this.nb$subtract(n);return h.$days<0?-1:t(h)?1:0},$mkTime(){const t=new Nt(1970,1,1),e=this.nb$subtract(t).nb$floor_divide(yt);function local(e){const[n,i,s,o,r,a]=$.localtime.tp$call([e]).v;return Nt.tp$call([n,i,s,o,r,a]).nb$subtract(t).nb$floor_divide(yt)}let n,i,s=local(e).nb$subtract(e),o=e.nb$subtract(s),r=local(o);if(r.ob$eq(e)){if(n=o.nb$add([new f(-86400),new f(86400)][this.$fold]),i=local(n).nb$subtract(n),s.ob$eq(i))return o}else i=r.nb$subtract(o);n=e.nb$subtract(i);if(local(n).ob$eq(e))return n;if(r.ob$eq(e))return o;const a=o.ob$ge(n)?o:n;return[a,o===a?n:o][this.$fold]},$fromtimestamp(t,n,s){let o;if(!N(t))throw new z(\\\"a number is required, (got '\\\"+c(t)+\\\"'\\\");[o,t]=modf(t);let a=intRound(q(o,nt,\\\"Mult\\\"));a=a.v,t=t.v,a>=1e6?(t+=1,a-=1e6):a<0&&(t-=1,a+=1e6),t=new f(t),Number.isInteger(a)||(a=Math.trunc(a)),a=new f(a);const h=n?$.gmtime:$.localtime;function converter(t){return h.tp$call([t]).v}let[m,u,l,d,_,p]=converter(t);p=new f(Math.min(i(p),59));let g=r(this,[m,u,l,d,_,p,a,s]);if(s===y){const n=86400;[m,u,l,d,_,p]=converter(q(t,new f(n),\\\"Sub\\\"));const i=r(this,[m,u,l,d,_,p,a,s]),o=q(q(g,i,\\\"Sub\\\"),new wt(0,n),\\\"Sub\\\");if(o.$days<0){[m,u,l,d,_,p]=converter(q(t,q(o,yt,\\\"FloorDiv\\\"),\\\"Add\\\"));const n=r(this,[m,u,l,d,_,p,a,s]);e(n,g,\\\"Eq\\\")&&(g.$fold=1)}}else g=r(s.tp$getattr(new w(\\\"fromutc\\\")),[g]);return g},$localTimezone(){let t;t=this.$tzinfo===y?this.$mkTime():this.nb$subtract(kt).nb$floor_divide(yt);const e=$.localtime.tp$call([t]),n=(Nt.tp$call(e.v.slice(0,6)),e.tp$getattr(new w(\\\"tm_gmtoff\\\"))),i=e.tp$getattr(new w(\\\"tm_zone\\\"));return new St(wt.tp$call([W,n]),i)},$getState(t=3){let[e,n]=$divMod(this.$year,256),[i,s]=$divMod(this.$micro,256),[o,r]=$divMod(i,256),a=this.$month;this.$fold&&t>3&&(a+=128);const $=new _([e,n,a,this.$day,this.$hour,this.$min,this.$sec,o,r,s]);return this.$tzinfo===y?[$]:[$,this.$tzinfo]},$setState(t,e){const[n,i,s,o,r,a,$,c,h,m]=t;s>127?(this.$fold=1,this.$month=s-128):(this.$fold=0,this.$month=s),this.$year=256*n+i,this.$day=o,this.$hour=r,this.$min=a,this.$sec=$,this.$micro=(c<<8|h)<<8|m,this.$tzinfo=e}}});function _isoweek1monday(t){const e=_ymd2ord(t,1,1),n=(e+6)%7;let i=e-n;return n>3&&(i+=7),i}Nt.prototype.min=new Nt(1,1,1),Nt.prototype.max=new Nt(9999,12,31,23,59,59,999999),Nt.prototype.resolution=new wt(0,0,1);const St=E.timezone=h(\\\"datetime.timezone\\\",{base:Mt,constructor:function timezone(t,n){if(this.$offset=t,this.$name=n||y,!e(this.$minoffset,t,\\\"LtE\\\")||!e(this.$maxoffset,t,\\\"GtE\\\"))throw new v(\\\"offset must be a timedelta strictly between -timedelta(hours=24) and timedelta(hours=24).\\\")},slots:{tp$new(e,n){let[i,s]=l(\\\"timezone\\\",[\\\"offset\\\",\\\"name\\\"],e,n,[null]);if(!(i instanceof wt))throw new z(\\\"offset must be a timedelta\\\");if(null===s){if(!t(i))return this.utc;s=y}else if(!k(s))throw new z(\\\"name must be a string\\\");if(this===St.prototype)return new St(i,s);{const t=new this.constructor;return St.call(t,i,s),t}},tp$richcompare(t,n){if(!(t instanceof St))return b;const i=e(this.$offset,t.$offset,\\\"Eq\\\");return\\\"NotEq\\\"===n?!i:\\\"Eq\\\"===n||i&&o(n)?i:b},$r(){return this===this.utc?new w(\\\"datetime.timezone.utc\\\"):this.$name===y?new w(`${this.tp$name}(${s(this.$offset)})`):new w(`${this.tp$name}(${s(this.$offset)}, ${s(this.$name)})`)},tp$str(){return this.tp$getattr(Y).tp$call([y])},tp$hash(){return u(this.$offset)}},methods:{tzname:{$meth:function tzname(t){if(t instanceof Nt||t===y)return this.$name===y?this.$nameFromOff(this.$offset):this.$name;throw new z(\\\"tzname() argument must be a datetime instance or None\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"If name is specified when timezone is created, returns the name. Otherwise returns offset as 'UTC(+|-)HH:MM'.\\\"},utcoffset:{$meth:function utcoffset(t){if(t instanceof Nt||t===y)return this.$offset;throw new z(\\\"utcoffset() argument must be a datetime instance or None\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Return fixed offset.\\\"},dst:{$meth:function dst(t){if(t instanceof Nt||t===y)return y;throw new z(\\\"dst() argument must be a datetime instance or None\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"Return None.\\\"},fromutc:{$meth:function fromutc(t){if(t instanceof Nt){if(t.$tzinfo!==this)throw new v(\\\"fromutc: dt.tzinfo is not self\\\");return q(t,this.$offset,\\\"Add\\\")}throw new z(\\\"fromutc() argument must be a datetime instance or None\\\")},$flags:{OneArg:!0},$textsig:null,$doc:\\\"datetime in UTC -> datetime in local time.\\\"},__getinitargs__:{$meth(){return this.$name===y?new p([this.$offset]):new p([this.$offset,this.$name])},$flags:{NoArgs:!0}}},proto:{$maxoffset:new wt(0,86399,999999),$minoffset:new wt(-1,0,1),$nameFromOff(n){if(!t(n))return new w(\\\"UTC\\\");let i,s,o,r,a,$;return e(n,bt,\\\"Lt\\\")?(i=\\\"-\\\",n=n.nb$negative()):i=\\\"+\\\",[s,o]=pyDivMod(n,pt),[r,o]=pyDivMod(o,gt),a=o.$secs,$=o.$micro,new w($?`UTC${i}${_d(s)}:${_d(r)}:${_d(a)}.${_d($,\\\"0\\\",6)}`:a?`UTC${i}${_d(s)}:${_d(r)}:${_d(a)}`:`UTC${i}${_d(s)}:${_d(r)}`)}}});St.prototype.utc=new St(new wt(0)),St.prototype.min=new St(new wt(0,-86340,0)),St.prototype.max=new St(new wt(0,86340,0));const kt=new Nt(1970,1,1,0,0,0,0,St.prototype.utc);return E}))}\",\"src/lib/document.js\":\"function $builtinmodule(){const{builtin:{str:i},misceval:{callsimArray:n},ffi:{toPy:t},abstr:{gattr:e}}=Sk,r={__name__:new i(\\\"document\\\")},o=t(Sk.global.document);return Sk.abstr.setUpModuleMethods(\\\"document\\\",r,{__getattr__:{$meth:i=>e(o,i,!0),$flags:{OneArg:!0}},__dir__:{$meth:()=>n(o.tp$getattr(i.$dir)),$flags:{NoArgs:!0}}}),r.currentDiv=new Sk.builtin.func((function(){if(void 0!==Sk.divid)return new Sk.builtin.str(Sk.divid);throw new Sk.builtin.AttributeError(\\\"There is no value set for divid\\\")})),r.currentCourse=new Sk.builtin.func((function(){if(void 0!==eBookConfig)return new Sk.builtin.str(eBookConfig.course);throw new Sk.builtin.AttributeError(\\\"There is no course\\\")})),r.currentGradingContainer=new Sk.builtin.func((function(){if(void 0!==Sk.gradeContainer)return new Sk.builtin.str(Sk.gradeContainer);if(null!=Sk.divid)return new Sk.builtin.str(Sk.divid);throw new Sk.builtin.AttributeError(\\\"There is no value set for grading\\\")})),r.getCurrentEditorValue=new Sk.builtin.func((function(){if(void 0!==Sk.divid&&void 0!==window.componentMap){if(Sk.gradeContainer!=Sk.divid){var i=Sk.gradeContainer+\\\" \\\"+Sk.divid;return i in window.componentMap?new Sk.builtin.str(window.componentMap[i].editor.getValue()):new Sk.builtin.str(window.componentMap[Sk.divid].editor.getValue())}return new Sk.builtin.str(window.componentMap[Sk.divid].editor.getValue())}throw new Sk.builtin.AttributeError(\\\"Can't find editor for this div\\\")})),r.popup=new Sk.builtin.func((function(i){const n=Sk.ffi.remapToJs(i);alert(n)})),r}\",\"src/lib/fractions.js\":\"function $builtinmodule(t){const e={};return Sk.misceval.chain(Sk.importModule(\\\"math\\\",!1,!0),(t=>(e.math=t,Sk.importModule(\\\"sys\\\",!1,!0))),(t=>(e.sys=t,fractionsMod(e))))}function fractionsMod({math:t,sys:e}){const{builtin:{int_:n,bool:{true$:i,false$:r},none:{none$:s},NotImplemented:{NotImplemented$:o},tuple:a,float_:$,complex:u,str:h,isinstance:l,TypeError:m,ZeroDivisionError:d,ValueError:f,NotImplementedError:c,abs:_,round:b,pow:p},ffi:{remapToPy:g},abstr:{buildNativeClass:w,copyKeywordsToNamedArgs:v,numberBinOp:y,typeName:k,lookupSpecial:E,checkArgsLen:N},misceval:{isTrue:F,richCompareBool:A,callsimArray:S,objectRepr:M}}=Sk,O={__name__:new h(\\\"fractions\\\"),__all__:g([\\\"Fraction\\\"])},D=/^\\\\s*(?[-+]?)(?=\\\\d|\\\\.\\\\d)(?\\\\d*)(?:(?:\\\\/(?\\\\d+))?|(?:\\\\.(?\\\\d*))?(?:E(?[-+]?\\\\d+))?)\\\\s*$/i,q=new n(0),x=new n(1),z=new n(2),I=new n(10),T=new h(\\\"numerator\\\"),R=new h(\\\"denominator\\\"),B=new h(\\\"as_integer_ratio\\\"),C=new h(\\\"from_float\\\"),getNumer=t=>t.tp$getattr(T),getDenom=t=>t.tp$getattr(R),mul=(t,e)=>y(t,e,\\\"Mult\\\"),div=(t,e)=>y(t,e,\\\"Div\\\"),pow=(t,e)=>y(t,e,\\\"Pow\\\"),add=(t,e)=>y(t,e,\\\"Add\\\"),sub=(t,e)=>y(t,e,\\\"Sub\\\"),floorDiv=(t,e)=>y(t,e,\\\"FloorDiv\\\"),divmod=(t,e)=>y(t,e,\\\"DivMod\\\"),mod=(t,e)=>y(t,e,\\\"Mod\\\"),K=t.tp$getattr(new h(\\\"gcd\\\")),eq=(t,e)=>A(t,e,\\\"Eq\\\"),lt=(t,e)=>A(t,e,\\\"Lt\\\"),ge=(t,e)=>A(t,e,\\\"GtE\\\"),L={NoArgs:!0},P={OneArg:!0},j=e.tp$getattr(new h(\\\"hash_info\\\")),G=j.tp$getattr(new h(\\\"modulus\\\")),V=j.tp$getattr(new h(\\\"inf\\\"));function _operator_fallbacks(t,e){return[function(n){return isRational(n)?t(this,n):n instanceof $?e(this.nb$float(),n):n instanceof u?e(S(u,[this]),n):o},function(n){return isRational(n)?t(n,this):n instanceof $?e(n,this.nb$float()):n instanceof u?e(n,S(u,[this])):o}]}const[Z,H]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e);return S(ot,[add(mul(getNumer(t),i),mul(getNumer(e),n)),mul(n,i)])}),add),[J,Q]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e);return S(ot,[sub(mul(getNumer(t),i),mul(getNumer(e),n)),mul(n,i)])}),sub),[U,W]=_operator_fallbacks(((t,e)=>S(ot,[mul(getNumer(t),getNumer(e)),mul(getDenom(t),getDenom(e))])),mul),[X,Y]=_operator_fallbacks(((t,e)=>S(ot,[mul(getNumer(t),getDenom(e)),mul(getDenom(t),getNumer(e))])),div),[tt,et]=_operator_fallbacks(((t,e)=>floorDiv(mul(getNumer(t),getDenom(e)),mul(getDenom(t),getNumer(e)))),floorDiv),[nt,it]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e),[r,s]=divmod(mul(getNumer(t),i),mul(n,getNumer(e))).valueOf();return new a([r,S(ot,[s,mul(n,i)])])}),divmod),[rt,st]=_operator_fallbacks(((t,e)=>{const n=getDenom(t),i=getDenom(e),r=mod(mul(getNumer(t),i),mul(getNumer(e),n));return S(ot,[r,mul(n,i)])}),mod),ot=O.Fraction=w(\\\"fractions.Fraction\\\",{constructor:function(t,e){this.$num=t||q,this.$den=e||x},slots:{tp$new(t,e){N(\\\"Fraction\\\",t,0,2);let[r,o,a]=v(\\\"Fraction\\\",[\\\"numerator\\\",\\\"denominator\\\",\\\"_normalize\\\"],t,e,[q,s,i]);const u=new this.constructor;if(o===s){if(r.ob$type===n)return u.$num=r,u.$den=x,u;if(isRational(r))return u.$num=getNumer(r),u.$den=getDenom(r),u;if(r instanceof $)return[u.$num,u.$den]=S(r.tp$getattr(B)).valueOf(),u;if(!(r instanceof h))throw new m(\\\"argument should be a string or a Rational instance\\\");{const t=r.toString().match(D);if(null===t)throw new f(\\\"Invalid literal for Fraction: \\\"+M(r));r=new n(t.groups.num||\\\"0\\\");const e=t.groups.denom;if(e)o=new n(e);else{o=x;const e=t.groups.decimal;if(e){const t=new n(\\\"\\\"+10**e.length);r=add(mul(r,t),new n(e)),o=mul(o,t)}let i=t.groups.exp;i&&(i=new n(i),lt(i,q)?o=mul(o,pow(I,i.nb$negative())):r=mul(r,pow(I,i)))}\\\"-\\\"==t.groups.sign&&(r=r.nb$negative())}}else if(r.ob$type===n&&o.ob$type===n);else{if(!isRational(r)||!isRational(o))throw new m(\\\"both arguments should be Rational instances\\\");[r,o]=[mul(getNumer(r),getDenom(o)),mul(getNumer(o),getDenom(r))]}if(eq(o,q))throw new d(`Fraction(${r}, 0)`);if(F(a)){let t=S(K,[r,o]);lt(o,q)&&(t=t.nb$negative()),r=floorDiv(r,t),o=floorDiv(o,t)}return u.$num=r,u.$den=o,u},$r(){const t=E(this.ob$type,h.$name);return new h(`${t}(${this.$num}, ${this.$den})`)},tp$str(){return eq(this.$den,x)?new h(this.$num):new h(`${this.$num}/${this.$den}`)},tp$hash(){const t=p(this.$den,sub(G,z),G);let e;e=F(t)?mod(mul(_(this.$num),t),G):V;let n=ge(this,q)?e:e.nb$negative();return n=n.tp$hash(),-1===n?-2:n},tp$richcompare(t,e){const op=(t,n)=>A(t,n,e);if(\\\"Eq\\\"===e||\\\"NotEq\\\"==e){if(t.ob$type===n){const n=eq(this.$num,t)&&eq(this.$den,x);return\\\"Eq\\\"===e?n:!n}if(t instanceof ot||t instanceof n){const n=eq(this.$num,getNumer(t))&&eq(this.$den,getDenom(t));return\\\"Eq\\\"===e?n:!n}t instanceof u&&eq(t.tp$getattr(new h(\\\"imag\\\")),q)&&(t=t.tp$getattr(new h(\\\"real\\\")))}return isRational(t)?op(mul(getNumer(this),getDenom(t)),mul(getDenom(this),getNumer(t))):t instanceof $?Number.isFinite(t.valueOf())?op(this,S(this.tp$getattr(C),[t])):op(new $(0),t):o},tp$as_number:!0,nb$add:Z,nb$reflected_add:H,nb$subtract:J,nb$reflected_subtract:Q,nb$multiply:U,nb$reflected_multiply:W,nb$divide:X,nb$reflected_divide:Y,nb$floor_divide:tt,nb$reflected_floor_divide:et,nb$divmod:nt,nb$reflected_divmod:it,nb$remainder:rt,nb$reflected_remainder:st,nb$power(t){if(isRational(t)){if(eq(getDenom(t),x)){let e=getNumer(t);return ge(e,q)?S(ot,[pow(this.$num,e),pow(this.$den,e)],[\\\"_normalize\\\",r]):ge(this.$num,q)?(e=e.nb$negative(),S(ot,[pow(this.$den,e),pow(this.$num,e)],[\\\"_normalize\\\",r])):(e=e.nb$negative(),S(ot,[pow(this.$den.nb$negative(),e),pow(this.$num.nb$negative(),e)],[\\\"_normalize\\\",r]))}return pow(this.nb$float(),S($,[t]))}return pow(this.nb$float(),t)},nb$reflected_power(t){return eq(this.$den,x)&&ge(this.$num,q)?pow(t,this.$num):isRational(t)?pow(new ot(getNumer(t),getDenom(t)),this):eq(this.$den,x)?pow(t,this.$num):pow(t,this.nb$float())},nb$positive(){return new ot(this.$num,this.$den)},nb$negative(){return new ot(this.$num.nb$negative(),this.$den)},nb$abs(){return new ot(this.$num.nb$abs(),this.$den)},nb$bool(){return this.$num.nb$bool()},nb$float(){return div(this.$num,this.$den)}},methods:{as_integer_ratio:{$meth(){return new a([this.$num,this.$den])},$flags:L},limit_denominator:{$meth(t){if(lt(t,x))throw new f(\\\"max_denominator should be at least 1\\\");if(ge(t,this.$den))return S(ot,[this]);let[e,n,i,r]=[q,x,x,q],s=this.$num,o=this.$den;for(;;){const a=floorDiv(s,o),$=add(n,mul(a,r));if(lt(t,$))break;[e,n,i,r]=[i,r,add(e,mul(a,i)),$],[s,o]=[o,sub(s,mul(a,o))]}const a=floorDiv(sub(t,n),r),$=S(ot,[add(e,mul(a,i)),add(n,mul(a,r))]),u=S(ot,[i,r]);return ge(_(sub($,this)),_(sub(u,this)))?u:$},$flags:{NamedArgs:[\\\"max_denominator\\\"],Defaults:[new n(1e6)]}},__trunc__:{$meth(){return lt(this.$num,q)?floorDiv(this.$num.nb$negative(),this.$den).nb$negative():floorDiv(this.$num,this.$den)},$flags:L},__floor__:{$meth(){return floorDiv(this.$num,this.$den)},$flags:L},__ceil__:{$meth(){return floorDiv(this.$num.nb$negative(),this.$den).nb$negative()},$flags:L},__round__:{$meth(t){if(t===s){const[t,e]=divmod(this.$num,this.$den).valueOf(),n=mul(e,z);return lt(n,this.$den)?t:lt(this.$den,n)?add(t,x):eq(mod(t,z),q)?t:add(t,x)}const e=pow(I,_(t));return lt(q,t)?S(ot,[b(mul(this,e)),e]):S(ot,[mul(b(div(this,e)),e)])},$flags:{NamedArgs:[\\\"ndigits\\\"],Defaults:[s]}},__reduce__:{$meth(){return new a([this.ob$type,new a([new h(this)])])},$flags:L},__copy__:{$meth(){return this.ob$type===ot?this:S(this.ob$type,[this.$num,this.$den])},$flags:L},__deepcopy__:{$meth(t){return this.ob$type===ot?this:S(this.ob$type,[this.$num,this.$den])},$flags:P}},classmethods:{from_float:{$meth(t){if(t instanceof n)return S(this,[t]);if(t instanceof $){const[e,n]=S(t.tp$getattr(B)).valueOf();return S(this,[e,n])}throw new m(`${k(this)}.from_float() only takes floats, not ${M(t)}, (${k(t)})`)},$flags:P},from_decimal:{$meth(){throw c(\\\"from_decimal not yet implemented in SKulpt\\\")},$flags:P}},getsets:{numerator:{$get(){return this.$num}},denominator:{$get(){return this.$den}},_numerator:{$get(){return this.$num},$set(t){this.$num=t}},_denominator:{$get(){return this.$den},$set(t){this.$den=t}}}}),at=new a([n,ot]),isRational=t=>F(l(t,at));return O}\",\"src/lib/functools.js\":\"function $builtinmodule(){const t={};return Sk.misceval.chain(Sk.importModule(\\\"collections\\\",!1,!0),(e=>(t._namedtuple=e.$d.namedtuple,functools_mod(t))))}function functools_mod(t){const{object:e,int_:n,str:r,list:s,tuple:a,dict:i,none:{none$:o},bool:{false$:c},NotImplemented:{NotImplemented$:_},bool:l,func:h,method:p,TypeError:u,RuntimeError:d,ValueError:f,NotImplementedError:m,AttributeError:w,OverflowError:g,checkNone:$,checkBool:y,checkCallable:k,checkClass:b}=Sk.builtin,{callsimArray:x,callsimOrSuspendArray:A,iterFor:S,chain:E,isIndex:v,asIndexSized:N,isTrue:P,richCompareBool:j,objectRepr:R,retryOptionalSuspeionOrThrow:z,chain:q}=Sk.misceval,{remapToPy:T}=Sk.ffi,{checkOneArg:I,checkNoKwargs:C,buildNativeClass:D,setUpModuleMethods:M,keywordArrayFromPyDict:O,keywordArrayToPyDict:W,objectHash:U,lookupSpecial:F,copyKeywordsToNamedArgs:G,typeName:B,objectSetItem:K,iter:L,gattr:H}=Sk.abstr,{getSetDict:V,getAttr:J,setAttr:Q}=Sk.generic;function proxyFail(t){return new h((()=>{throw new m(t+\\\" is not yet implemented in skulpt\\\")}))}Object.assign(t,{__name__:new r(\\\"functools\\\"),__doc__:new r(\\\"Tools for working with functions and callable objects\\\"),__all__:new s([\\\"update_wrapper\\\",\\\"wraps\\\",\\\"WRAPPER_ASSIGNMENTS\\\",\\\"WRAPPER_UPDATES\\\",\\\"total_ordering\\\",\\\"cmp_to_key\\\",\\\"cache\\\",\\\"lru_cache\\\",\\\"reduce\\\",\\\"partial\\\",\\\"partialmethod\\\",\\\"singledispatch\\\",\\\"singledispatchmethod\\\",\\\"cached_property\\\"].map((t=>new r(t)))),WRAPPER_ASSIGNMENTS:new a([\\\"__module__\\\",\\\"__name__\\\",\\\"__qualname__\\\",\\\"__doc__\\\",\\\"__annotations__\\\"].map((t=>new r(t)))),WRAPPER_UPDATES:new a([new r(\\\"__dict__\\\")]),singledispatch:proxyFail(\\\"singledispatch\\\"),singledispatchmethod:proxyFail(\\\"singledispatchmethod\\\")});const X=new r(\\\"cache_parameters\\\");function _lru_cache(e,n){if(n||(n=c),v(e))(e=N(e,g))<0&&(e=0);else{if(k(e)&&y(n)){const r=e,s=new Z(r,e=128,n);return s.tp$setattr(X,new h((()=>T({maxsize:e,typed:n})))),A(t.update_wrapper,[s,r])}if(!$(e))throw new u(\\\"Expected first argument to be an integer, a callable, or None\\\")}return new h((r=>{const s=new Z(r,e,n);return s.tp$setattr(X,new h((()=>T({maxsize:e,typed:n})))),A(t.update_wrapper,[s,r])}))}const Y=t._CacheInfo=x(t._namedtuple,[\\\"CacheInfo\\\",[\\\"hits\\\",\\\"misses\\\",\\\"maxsize\\\",\\\"currsize\\\"]].map((t=>T(t))),[\\\"module\\\",new r(\\\"functools\\\")]),Z=D(\\\"functools._lru_cache_wrapper\\\",{constructor:function _lru_cache_wrapper(t,e,n,r){if(!k(t))throw new u(\\\"the first argument must be callable\\\");let s;if($(e))s=infinite_lru_cache_wrapper,e=-1;else{if(!v(e))throw new u(\\\"maxsize should be integer or None\\\");(e=N(e,g))<0&&(e=0),s=0===e?uncached_lru_cache_wrapper:bounded_lru_cache_wrapper}this.root={},this.root.prev=this.root.next=this.root,this.wrapper=s,this.maxsize=e,this.typed=n,this.cache=new i([]),this.func=t,this.misses=this.hits=0,this.$d=new i([])},slots:{tp$new(t,e){const[n,r,s,a]=G(\\\"_lru_cache_wrapper\\\",[\\\"user_function\\\",\\\"maxsize\\\",\\\"typed\\\",\\\"cache_info_type\\\"],t,e);return new Z(n,r,s,a)},tp$call(t,e){return this.wrapper(t,e)},tp$descr_get(t,e){return null===t?this:new p(this,t)},tp$doc:\\\"Create a cached callable that wraps another function.\\\\n\\\\nuser_function: the function being cached\\\\n\\\\nmaxsize: 0 for no caching\\\\n None for unlimited cache size\\\\n n for a bounded cache\\\\n\\\\ntyped: False cache f(3) and f(3.0) as identical calls\\\\n True cache f(3) and f(3.0) as distinct calls\\\\n\\\\ncache_info_type: namedtuple class with the fields:\\\\n hits misses currsize maxsize\\\\n\\\"},methods:{cache_info:{$meth(){return A(Y,[this.hits,this.misses,-1===this.maxsize?o:this.maxsize,this.cache.get$size()].map((t=>T(t))))},$flags:{NoArgs:!0},$doc:\\\"Report cache statistics\\\"},cache_clear:{$meth(){return this.hits=this.misses=0,this.root={},this.root.next=this.root.prev=this.root,A(this.cache.tp$getattr(new r(\\\"clear\\\"),!0))},$flags:{NoArgs:!0},$doc:\\\"Clear the cache and cache statistics\\\"},__deepcopy__:{$meth(t){return this},$flags:{OneArg:!0}},__copy__:{$meth(){return this},$flags:{NoArgs:!0}}},getsets:{__dict__:V}});function infinite_lru_cache_wrapper(t,e){const n=_make_key(t,e,this.typed),r=this.cache.mp$lookup(n);return void 0!==r?(this.hits++,r):(this.misses++,E(A(this.func,t,e),(t=>(this.cache.mp$ass_subscript(n,t),t))))}function uncached_lru_cache_wrapper(t,e){return this.misses++,A(this.func,t,e)}function bounded_lru_cache_wrapper(t,e){const n=_make_key(t,e,this.typed),r=this.cache.mp$lookup(n);if(void 0!==r){const{result:t}=r;return lru_cache_extract_link(r),lru_cache_append_link(this,r),this.hits++,t}return this.misses++,E(A(this.func,t,e),(t=>{if(void 0!==this.cache.mp$lookup(n))return t;if(this.cache.get$size()t.ob$type)),...i.map((t=>t.ob$type)));else if(1===s.length&&nt.has(s[0].ob$type))return s[0];return new tt(s)}function partial_adjust_args_kwargs(t,e){if(t=this.arg_arr.concat(t),e){e=W(e);const t=this.kwdict.dict$copy();t.dict$merge(e),e=O(t)}else e=O(this.kwdict);return{args:t,kwargs:e}}function partial_new(t,e){if(t.length<1)throw new u(\\\"type 'partial' takes at least 1 argument\\\");let n,r,s=t.shift();if(s instanceof this.sk$builtinBase){const t=s;s=t.fn,n=t.arg_arr,r=t.kwdict}this.check$func(s),n&&(t=n.concat(t));let a=W(e=e||[]);if(r){const t=r.dict$copy();t.dict$merge(a),a=t}if(this.sk$builtinBase===this.constructor)return new this.constructor(s,t,a);{const e=new this.constructor;return this.sk$builtinBase.call(e,s,t,a),e}}function partial_repr(){if(this.in$repr)return new r(\\\"...\\\");this.in$repr=!0;const t=[R(this.fn)];return this.arg_arr.forEach((e=>{t.push(R(e))})),this.kwdict.$items().forEach((([e,n])=>{t.push(e.toString()+\\\"=\\\"+R(n))})),this.in$repr=!1,new r(this.tp$name+\\\"(\\\"+t.join(\\\", \\\")+\\\")\\\")}t.partial=D(\\\"functools.partial\\\",{constructor:function partial(t,e,n){this.fn=t,this.arg_arr=e,this.arg_tup=new a(e),this.kwdict=n,this.in$repr=!1,this.$d=new i([])},slots:{tp$new:partial_new,tp$call(t,e){return({args:t,kwargs:e}=this.adj$args_kws(t,e)),this.fn.tp$call(t,e)},tp$doc:\\\"partial(func, *args, **keywords) - new function with partial application\\\\n of the given arguments and keywords.\\\\n\\\",$r:partial_repr,tp$getattr:J,tp$setattr:Q},getsets:{func:{$get(){return this.fn},$doc:\\\"function object to use in future partial calls\\\"},args:{$get(){return this.arg_tup},$doc:\\\"tuple of arguments to future partial calls\\\"},keywords:{$get(){return this.kwdict},$doc:\\\"dictionary of keyword arguments to future partial calls\\\"},__dict__:V},methods:{},classmethods:Sk.generic.classGetItem,proto:{adj$args_kws:partial_adjust_args_kwargs,check$func(t){if(!k(t))throw new u(\\\"the first argument must be callable\\\")}}}),t.partialmethod=D(\\\"functools.partialmethod\\\",{constructor:function partialmethod(t,e,n){this.fn=t,this.arg_arr=e,this.arg_tup=new a(e),this.kwdict=n},slots:{tp$new:partial_new,tp$doc:\\\"Method descriptor with partial application of the given arguments\\\\n and keywords.\\\\n\\\\n Supports wrapping existing descriptors and handles non-descriptor\\\\n callables as instance methods.\\\\n \\\",$r:partial_repr,tp$descr_get(e,n){let r;if(this.fn.tp$descr_get){const s=this.fn.tp$descr_get(e,n);if(s!==this.fn){if(!k(s))throw new u(\\\"type 'partial' requires a callable\\\");r=new t.partial(s,this.arg_arr.slice(0),this.kwdict.dict$copy());const e=F(s,this.str$self);void 0!==e&&r.tp$setattr(this.str$self,e)}}return void 0===r&&(r=this.make$unbound().tp$descr_get(e,n)),r}},methods:{_make_unbound_method:{$meth(){return this.make$unbound()},$flags:{NoArgs:!0}}},classmethods:Sk.generic.classGetItem,getsets:{func:{$get(){return this.fn},$doc:\\\"function object to use in future partial calls\\\"},args:{$get(){return this.arg_tup},$doc:\\\"tuple of arguments to future partial calls\\\"},keywords:{$get(){return this.kwdict},$doc:\\\"dictionary of keyword arguments to future partial calls\\\"},__dict__:V},proto:{str$self:new r(\\\"__self__\\\"),make$unbound(){const t=this;function _method(e,n){const r=e.shift();return({args:e,kwargs:n}=t.adj$args_kws(e,n)),e.unshift(r),A(t.fn,e,n)}return _method.co_fastcall=!0,new h(_method)},adj$args_kws:partial_adjust_args_kwargs,check$func(t){if(!k(t)&&void 0===t.tp$descr_get)throw new u(R(t)+\\\" is not callable or a descriptor\\\")}}});const rt={__lt__:r.$lt,__le__:r.$le,__gt__:r.$gt,__ge__:r.$ge};function from_slot(t,e){const n=rt[t];function compare_slot(t,r){let s=x(t.tp$getattr(n),[r]);return s===_?s:(s=P(s),new l(e(s,t,r)))}return compare_slot.co_name=n,compare_slot}const st=from_slot(\\\"__lt__\\\",((t,e,n)=>!t&&j(e,n,\\\"NotEq\\\"))),at=from_slot(\\\"__lt__\\\",((t,e,n)=>t||j(e,n,\\\"Eq\\\"))),it=from_slot(\\\"__lt__\\\",(t=>!t)),ot=from_slot(\\\"__le__\\\",((t,e,n)=>!t||j(e,n,\\\"Eq\\\"))),ct=from_slot(\\\"__le__\\\",((t,e,n)=>t&&j(e,n,\\\"NotEq\\\"))),_t=from_slot(\\\"__le__\\\",(t=>!t)),lt=from_slot(\\\"__gt__\\\",((t,e,n)=>!t&&j(e,n,\\\"NotEq\\\"))),ht=from_slot(\\\"__gt__\\\",((t,e,n)=>t||j(e,n,\\\"Eq\\\"))),pt=from_slot(\\\"__gt__\\\",(t=>!t)),ut=from_slot(\\\"__ge__\\\",((t,e,n)=>!t||j(e,n,\\\"Eq\\\"))),dt=from_slot(\\\"__ge__\\\",((t,e,n)=>t&&j(e,n,\\\"NotEq\\\"))),ft=from_slot(\\\"__ge__\\\",(t=>!t)),mt={__lt__:{__gt__:new h(st),__le__:new h(at),__ge__:new h(it)},__le__:{__ge__:new h(ot),__lt__:new h(ct),__gt__:new h(_t)},__gt__:{__lt__:new h(lt),__ge__:new h(ht),__le__:new h(pt)},__ge__:{__le__:new h(ut),__gt__:new h(dt),__lt__:new h(ft)}},wt={__lt__:\\\"ob$lt\\\",__le__:\\\"ob$le\\\",__gt__:\\\"ob$gt\\\",__ge__:\\\"ob$ge\\\"};const gt=new r(\\\"get\\\"),$t=new e;t.cached_property=D(\\\"functools.cached_property\\\",{constructor:function(){},slots:{tp$init(t,e){I(\\\"cached_property\\\",t,e),C(\\\"cached_property\\\",e),this._func=t[0],this._attr=o},tp$descr_get(t,e,n){if(null==t)return this;if(this._attr===o)throw new u(\\\"Cannot use cached_property instance without calling __set_name__ on it.\\\");let s;try{s=H(t,r.$dict)}catch(c){if(c instanceof w){const e=`No '__dict__' attribute on '${B(t)}' instance to cache ${R(this._attr)} property.`;throw new u(e)}throw c}const a=H(s,gt);let i=x(a,[this._attr,$t]);if(i===$t){const e=A(this._func,[t]);i=q(e,(n=>{try{return K(s,this._attr,e),n}catch(c){if(c instanceof u){const e=`The '__dict__' attribute on '${B(t)}' instance does not support item assignment for caching ${R(this._attr)} property.`;throw new u(e)}throw c}}))}return n?i:z(i)}},getsets:{__doc__:{$get(){return this._func.tp$getattr(r.$doc)||o}}},methods:{__set_name__:{$meth(t,e){if(this._attr===o)this._attr=e;else if(e.toString()!==this._attr.toString())throw new u(`Cannot assign the same cached_property to two different names (${R(this._attr)} and ${R(e)})`)},$flags:{MinArgs:2,MaxArgs:2}}},classmethods:Sk.generic.classGetItem});const yt=new n(0),kt=D(\\\"functools.KeyWrapper\\\",{constructor:function(t,e){this.cmp=t,this.obj=e},slots:{tp$call(t,e){const[n]=G(\\\"K\\\",[\\\"obj\\\"],t,e,[]);return new kt(this.cmp,n)},tp$richcompare(t,e){if(!(t instanceof kt))throw new u(\\\"other argument must be K instance\\\");const n=this.obj,r=t.obj;if(!n||!r)throw new w(\\\"object\\\");const s=A(this.cmp,[n,r]);return E(s,(t=>j(t,yt,e)))},tp$getattr:J,tp$hash:o},getsets:{obj:{$get(){return this.obj||o},$set(t){this.obj=t},$doc:\\\"Value wrapped by a key function.\\\"}}}),bt=new r(\\\"update\\\"),xt=new r(\\\"__wrapped__\\\");return M(\\\"functools\\\",t,{cache:{$meth:function cache(t){return A(_lru_cache(o),[t])},$flags:{OneArg:!0},$doc:'Simple lightweight unbounded cache. Sometimes called \\\"memoize\\\".',$textsig:\\\"($module, user_function, /)\\\"},lru_cache:{$meth:_lru_cache,$flags:{NamedArgs:[\\\"maxsize\\\",\\\"typed\\\"],Defaults:[new n(128),c]},$doc:\\\"Least-recently-used cache decorator.\\\\n\\\\nIf *maxsize* is set to None, the LRU features are disabled and the cache\\\\ncan grow without bound.\\\\n\\\\nIf *typed* is True, arguments of different types will be cached separately.\\\\nFor example, f(3.0) and f(3) will be treated as distinct calls with\\\\ndistinct results.\\\\n\\\\nArguments to the cached function must be hashable.\\\\n\\\\nView the cache statistics named tuple (hits, misses, maxsize, currsize)\\\\nwith f.cache_info(). Clear the cache and statistics with f.cache_clear().\\\\nAccess the underlying function with f.__wrapped__.\\\\n\\\\nSee: http://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)\\\"},cmp_to_key:{$meth:function cmp_to_key(t){return new kt(t)},$flags:{NamedArgs:[\\\"mycmp\\\"],Defaults:[]},$doc:\\\"Convert a cmp= function into a key= function.\\\",$textsig:\\\"($module, cmp, /)\\\"},reduce:{$meth:function reduce(t,e,n){const r=L(e);let s;return n=n||r.tp$iternext(!0),E(n,(e=>{if(void 0===e)throw new u(\\\"reduce() of empty sequence with no initial value\\\");return s=e,S(r,(e=>E(A(t,[s,e]),(t=>{s=t}))))}),(()=>s))},$flags:{MinArgs:2,MaxArgs:3},$doc:\\\"reduce(function, sequence[, initial]) -> value\\\\n\\\\nApply a function of two arguments cumulatively to the items of a sequence,\\\\nfrom left to right, so as to reduce the sequence to a single value.\\\\nFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\\\\n((((1+2)+3)+4)+5). If initial is present, it is placed before the items\\\\nof the sequence in the calculation, and serves as a default when the\\\\nsequence is empty.\\\",$textsig:\\\"($module, function, sequence[, initial], /)\\\"},total_ordering:{$meth:function total_ordering(t){const n=[];if(!b(t))throw new u(\\\"total ordering only supported for type objects not '\\\"+B(t)+\\\"'\\\");if(Object.keys(mt).forEach((r=>{const s=wt[r];t.prototype[s]!==e.prototype[s]&&n.push(r)})),!n.length)throw new f(\\\"must define atleast one ordering operation: <, >, <=, >=\\\");const r=n[0];return Object.entries(mt[r]).forEach((([e,r])=>{n.includes(e)||t.tp$setattr(rt[e],r)})),t},$flags:{OneArg:!0},$doc:\\\"Class decorator that fills in missing ordering methods\\\"},update_wrapper:{$meth:function update_wrapper(t,e,n,r){let s,a=L(n);for(let i=a.tp$iternext();void 0!==i;i=a.tp$iternext())void 0!==(s=e.tp$getattr(i))&&t.tp$setattr(i,s);a=L(r);for(let o=a.tp$iternext();void 0!==o;o=a.tp$iternext()){s=e.tp$getattr(o)||new i([]);const n=H(t,o),r=H(n,bt);x(r,[s])}return t.tp$setattr(xt,e),t},$flags:{NamedArgs:[\\\"wrapper\\\",\\\"wrapped\\\",\\\"assigned\\\",\\\"updated\\\"],Defaults:[t.WRAPPER_ASSIGNMENTS,t.WRAPPER_UPDATES]},$doc:\\\"Update a wrapper function to look like the wrapped function\\\\n\\\\n wrapper is the function to be updated\\\\n wrapped is the original function\\\\n assigned is a tuple naming the attributes assigned directly\\\\n from the wrapped function to the wrapper function (defaults to\\\\n functools.WRAPPER_ASSIGNMENTS)\\\\n updated is a tuple naming the attributes of the wrapper that\\\\n are updated with the corresponding attribute from the wrapped\\\\n function (defaults to functools.WRAPPER_UPDATES)\\\\n \\\",$textsig:\\\"($module, /, wrapper, wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',))\\\"},wraps:{$meth:function wraps(e,n,r){const s=[\\\"wrapped\\\",e,\\\"assigned\\\",n,\\\"updated\\\",r];return A(t.partial,[t.update_wrapper],s)},$flags:{NamedArgs:[\\\"wrapped\\\",\\\"assigned\\\",\\\"updated\\\"],Defaults:[t.WRAPPER_ASSIGNMENTS,t.WRAPPER_UPDATES]},$doc:\\\"Decorator factory to apply update_wrapper() to a wrapper function\\\\n\\\\n Returns a decorator that invokes update_wrapper() with the decorated\\\\n function as the wrapper argument and the arguments to wraps() as the\\\\n remaining arguments. Default arguments are as for update_wrapper().\\\\n This is a convenience function to simplify applying partial() to\\\\n update_wrapper().\\\\n \\\",$textsig:\\\"($module, /, wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',))\\\"}}),t}\",\"src/lib/image.js\":\"var ImageMod,$builtinmodule;ImageMod||((ImageMod={}).canvasLib=[]),$builtinmodule=function(e){var n,i,t,a,u,l,r,c={__name__:new Sk.builtin.str(\\\"image\\\")};return c.Image=Sk.misceval.buildClass(c,(function(e,n){u=function(e){e.width=e.image.width,e.height=e.image.height,e.delay=0,e.updateCount=0,e.updateInterval=1,e.lastx=0,e.lasty=0,e.canvas=document.createElement(\\\"canvas\\\"),e.canvas.height=e.height,e.canvas.width=e.width,e.ctx=e.canvas.getContext(\\\"2d\\\"),e.ctx.drawImage(e.image,0,0),e.imagedata=e.ctx.getImageData(0,0,e.width,e.height)},n.__init__=new Sk.builtin.func((function(e,n){var i;Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,2,2);try{e.image=document.getElementById(Sk.ffi.remapToJs(n)),null==e.image&&(e.image=document.querySelector(`[data-filename=\\\"${Sk.ffi.remapToJs(n)}\\\"]`)),u(e)}catch(t){e.image=null}if(null==e.image)return(i=new Sk.misceval.Suspension).resume=function(){if(i.data.error)throw new Sk.builtin.IOError(i.data.error.message)},i.data={type:\\\"Sk.promise\\\",promise:new Promise((function(i,t){var a=new Image;a.crossOrigin=\\\"\\\",a.onerror=function(){t(Error(\\\"Failed to load URL: \\\"+a.src))},a.onload=function(){e.image=this,u(e),i()},a.src=r(n)}))},i})),r=function(e){let n=Sk.ffi.remapToJs(e);try{let e=Sk.read(n);return`data:image/${n.substring(n.lastIndexOf(\\\".\\\")+1)};base64, ${e}`}catch(u){console.log(`${n} is not in the database ${u}`)}var i,t,a=\\\"function\\\"==typeof Sk.imageProxy?Sk.imageProxy:function(e){return(i=document.createElement(\\\"a\\\")).href=t,window.location.host!==i.host?Sk.imageProxy+\\\"/\\\"+e:e};return t=a(t=Sk.ffi.remapToJs(e))},l=function(e,n,i){if(n<0||i<0||n>=e.width||i>=e.height)throw new Sk.builtin.ValueError(\\\"Pixel index out of range.\\\")};var setdelay=function(e,n,i){var t;Sk.builtin.pyCheckArgsLen(\\\"setdelay\\\",arguments.length,2,3),e.delay=Sk.ffi.remapToJs(n),t=Sk.builtin.asnum$(i),e.updateInterval=t||1};n.set_delay=new Sk.builtin.func(setdelay),n.setDelay=new Sk.builtin.func(setdelay);var getpixels=function(e){var n,i=[];for(Sk.builtin.pyCheckArgsLen(\\\"getpixels\\\",arguments.length,1,1),n=0;n0?window.setTimeout(n,e.delay):n()):n()}))},t};var setpixel=function(e,n,i,t){var u;return Sk.builtin.pyCheckArgsLen(\\\"setpixel\\\",arguments.length,4,4),n=Sk.builtin.asnum$(n),i=Sk.builtin.asnum$(i),l(e,n,i),u=4*i*e.width+4*n,e.imagedata.data[u]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getRed,[t])),e.imagedata.data[u+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getGreen,[t])),e.imagedata.data[u+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(t.getBlue,[t])),e.imagedata.data[u+3]=255,a(e)};n.set_pixel=new Sk.builtin.func(setpixel),n.setPixel=new Sk.builtin.func(setpixel);var setpixelat=function(e,n,i){var t,u,r;return Sk.builtin.pyCheckArgsLen(\\\"setpixelat\\\",arguments.length,3,3),t=(n=Sk.builtin.asnum$(n))%e.image.width,u=Math.floor(n/e.image.width),l(e,t,u),r=4*u*e.width+4*t,e.imagedata.data[r]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getRed,[i])),e.imagedata.data[r+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getGreen,[i])),e.imagedata.data[r+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(i.getBlue,[i])),e.imagedata.data[r+3]=255,a(e)};n.set_pixel_at=new Sk.builtin.func(setpixelat),n.setPixelAt=new Sk.builtin.func(setpixelat);var updatepixel=function(e,n){var i,t,u;return Sk.builtin.pyCheckArgsLen(\\\"updatepixel\\\",arguments.length,2,2),i=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getX,[n])),t=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getY,[n])),l(e,i,t),u=4*t*e.width+4*i,e.imagedata.data[u]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getRed,[n])),e.imagedata.data[u+1]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getGreen,[n])),e.imagedata.data[u+2]=Sk.builtin.asnum$(Sk.misceval.callsimArray(n.getBlue,[n])),e.imagedata.data[u+3]=255,a(e)};n.update_pixel=new Sk.builtin.func(updatepixel),n.updatePixel=new Sk.builtin.func(updatepixel);var getheight=function(e){return Sk.builtin.pyCheckArgsLen(\\\"getheight\\\",arguments.length,1,1),new Sk.builtin.int_(e.height)};n.get_height=new Sk.builtin.func(getheight),n.getHeight=new Sk.builtin.func(getheight);var getwidth=function(e,n){return Sk.builtin.pyCheckArgsLen(\\\"getwidth\\\",arguments.length,1,1),new Sk.builtin.int_(e.width)};n.get_width=new Sk.builtin.func(getwidth),n.getWidth=new Sk.builtin.func(getwidth),n.__getattr__=new Sk.builtin.func((function(e,n){return\\\"height\\\"===(n=Sk.ffi.remapToJs(n))?Sk.builtin.assk$(e.height):\\\"width\\\"===n?Sk.builtin.assk$(e.width):void 0})),n.__setattr__=new Sk.builtin.func((function(e,n,i){throw\\\"height\\\"===(n=Sk.ffi.remapToJs(n))||\\\"width\\\"===n?new Sk.builtin.Exception(\\\"Cannot change height or width they can only be set on creation\\\"):new Sk.builtin.Exception(\\\"Unknown attribute: \\\"+n)})),n.draw=new Sk.builtin.func((function(e,n,i,t){var a;return Sk.builtin.pyCheckArgsLen(\\\"draw\\\",arguments.length,2,4),(a=new Sk.misceval.Suspension).resume=function(){return Sk.builtin.none.none$},a.data={type:\\\"Sk.promise\\\",promise:new Promise((function(a,u){var l;n=Sk.builtin.asnum$(n),i=Sk.builtin.asnum$(i),t=Sk.builtin.asnum$(t),l=Sk.misceval.callsimArray(n.getWin,[n]).getContext(\\\"2d\\\"),void 0===i&&(i=0,t=0),e.lastUlx=i,e.lastUly=t,e.lastCtx=l,l.putImageData(e.imagedata,i,t),e.delay>0?window.setTimeout(a,e.delay):window.setTimeout(a,200)}))},a}))}),\\\"Image\\\",[]),t=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,3,3),e.width=Sk.builtin.asnum$(n),e.height=Sk.builtin.asnum$(i),e.canvas=document.createElement(\\\"canvas\\\"),e.ctx=e.canvas.getContext(\\\"2d\\\"),e.canvas.height=e.height,e.canvas.width=e.width,e.imagedata=e.ctx.getImageData(0,0,e.width,e.height)}))},c.EmptyImage=Sk.misceval.buildClass(c,t,\\\"EmptyImage\\\",[c.Image]),i=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i,t,a,u){Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,4,6),e.red=Sk.builtin.asnum$(n),e.green=Sk.builtin.asnum$(i),e.blue=Sk.builtin.asnum$(t),e.x=Sk.builtin.asnum$(a),e.y=Sk.builtin.asnum$(u)}));var getred=function(e){return Sk.builtin.pyCheckArgsLen(\\\"getred\\\",arguments.length,1,1),Sk.builtin.assk$(e.red)};n.get_red=new Sk.builtin.func(getred),n.getRed=new Sk.builtin.func(getred);var getgreen=function(e){return Sk.builtin.pyCheckArgsLen(\\\"getgreen\\\",arguments.length,1,1),Sk.builtin.assk$(e.green)};n.get_green=new Sk.builtin.func(getgreen),n.getGreen=new Sk.builtin.func(getgreen);var getblue=function(e){return Sk.builtin.pyCheckArgsLen(\\\"getblue\\\",arguments.length,1,1),Sk.builtin.assk$(e.blue)};n.get_blue=new Sk.builtin.func(getblue),n.getBlue=new Sk.builtin.func(getblue);var getx=function(e){return Sk.builtin.pyCheckArgsLen(\\\"getx\\\",arguments.length,1,1),Sk.builtin.assk$(e.x)};n.get_x=new Sk.builtin.func(getx),n.getX=new Sk.builtin.func(getx);var gety=function(e){return Sk.builtin.pyCheckArgsLen(\\\"gety\\\",arguments.length,1,1),Sk.builtin.assk$(e.y)};n.get_y=new Sk.builtin.func(gety),n.getY=new Sk.builtin.func(gety);var setred=function(e,n){Sk.builtin.pyCheckArgsLen(\\\"setred\\\",arguments.length,2,2),e.red=Sk.builtin.asnum$(n)};n.set_red=new Sk.builtin.func(setred),n.setRed=new Sk.builtin.func(setred);var setgreen=function(e,n){Sk.builtin.pyCheckArgsLen(\\\"setgreen\\\",arguments.length,2,2),e.green=Sk.builtin.asnum$(n)};n.set_green=new Sk.builtin.func(setgreen),n.setGreen=new Sk.builtin.func(setgreen);var setblue=function(e,n){Sk.builtin.pyCheckArgsLen(\\\"setblue\\\",arguments.length,2,2),e.blue=Sk.builtin.asnum$(n)};n.set_blue=new Sk.builtin.func(setblue),n.setBlue=new Sk.builtin.func(setblue),n.__getattr__=new Sk.builtin.func((function(e,n){return\\\"red\\\"===(n=Sk.ffi.remapToJs(n))?Sk.builtin.assk$(e.red):\\\"green\\\"===n?Sk.builtin.assk$(e.green):\\\"blue\\\"===n?Sk.builtin.assk$(e.blue):void 0})),n.__setattr__=new Sk.builtin.func((function(e,n,i){\\\"red\\\"!==(n=Sk.ffi.remapToJs(n))&&\\\"green\\\"!==n&&\\\"blue\\\"!==n||(e[n]=Sk.builtin.asnum$(i))}));var setx=function(e,n){Sk.builtin.pyCheckArgsLen(\\\"setx\\\",arguments.length,2,2),e.x=Sk.builtin.asnum$(n)};n.set_x=new Sk.builtin.func(setx),n.setX=new Sk.builtin.func(setx);var sety=function(e,n){Sk.builtin.pyCheckArgsLen(\\\"sety\\\",arguments.length,2,2),e.y=Sk.builtin.asnum$(n)};n.set_y=new Sk.builtin.func(sety),n.setY=new Sk.builtin.func(sety),n.__getitem__=new Sk.builtin.func((function(e,n){return 0===(n=Sk.builtin.asnum$(n))?e.red:1==n?e.green:2==n?e.blue:void 0})),n.__str__=new Sk.builtin.func((function(e){return Sk.ffi.remapToPy(\\\"[\\\"+e.red+\\\",\\\"+e.green+\\\",\\\"+e.blue+\\\"]\\\")})),n.getColorTuple=new Sk.builtin.func((function(e,n,i){})),n.setRange=new Sk.builtin.func((function(e,n){e.max=Sk.builtin.asnum$(n)}))},c.Pixel=Sk.misceval.buildClass(c,i,\\\"Pixel\\\",[]),n=function(e,n){n.__init__=new Sk.builtin.func((function(e,n,i){var t,a,u;Sk.builtin.pyCheckArgsLen(\\\"__init__\\\",arguments.length,1,3),void 0===(t=ImageMod.canvasLib[Sk.canvas])?(a=document.createElement(\\\"canvas\\\"),u=document.getElementById(Sk.canvas),e.theScreen=a,u.appendChild(a),ImageMod.canvasLib[Sk.canvas]=a,ImageMod.canvasLib[Sk.canvas]=e.theScreen):(e.theScreen=t,e.theScreen.height=e.theScreen.height),void 0!==n?(e.theScreen.height=i.v,e.theScreen.width=n.v):(Sk.availableHeight&&(e.theScreen.height=Sk.availableHeight),Sk.availableWidth&&(e.theScreen.width=Sk.availableWidth)),e.theScreen.style.display=\\\"block\\\"})),n.getWin=new Sk.builtin.func((function(e){return e.theScreen})),n.exitonclick=new Sk.builtin.func((function(e){var n=e.theScreen.id;e.theScreen.onclick=function(){document.getElementById(n).style.display=\\\"none\\\",document.getElementById(n).onclick=null,delete ImageMod.canvasLib[n]}}))},c.ImageWin=Sk.misceval.buildClass(c,n,\\\"ImageWin\\\",[]),c};\",\"src/lib/itertools.js\":\"var $builtinmodule=function(t){const{abstr:{checkOneArg:e,copyKeywordsToNamedArgs:i,checkArgsLen:r},builtin:{tuple:s,bool:{false$:n}},misceval:{chain:o,retryOptionSuspensionOrThrow:l,isTrue:c,iterFor:a,Break:h}}=Sk,u={};function combinationsNew(t,e,i){let r,s;[r,s]=Sk.abstr.copyKeywordsToNamedArgs(t.tp$name,[\\\"iterable\\\",\\\"r\\\"],e,i,[]);const n=Sk.misceval.arrayFromIterable(r);if(s=Sk.misceval.asIndexSized(s,Sk.builtin.OverFlowError),s<0)throw new Sk.builtin.ValueError(\\\"r must be non-negative\\\");if(this===t)return new t.constructor(n,s);{const e=new this.constructor;return t.constructor.call(e,n,s),e}}return u.accumulate=Sk.abstr.buildIteratorClass(\\\"itertools.accumulate\\\",{constructor:function accumulate(t,e,i){this.iter=t,this.func=e,this.total=i,this.tp$iternext=()=>(this.total=Sk.builtin.checkNone(this.total)?this.iter.tp$iternext():this.total,this.tp$iternext=this.constructor.prototype.tp$iternext,this.total)},iternext(t){let e=this.iter.tp$iternext();if(void 0!==e)return this.total=Sk.misceval.callsimArray(this.func,[this.total,e]),this.total},slots:{tp$doc:\\\"accumulate(iterable[, func, initial]) --\\\\x3e accumulate object\\\\n\\\\nReturn series of accumulated sums (or other binary function results).\\\",tp$new(t,e){Sk.abstr.checkArgsLen(\\\"accumulate\\\",t,0,2);let[i,r,s]=Sk.abstr.copyKeywordsToNamedArgs(\\\"accumulate\\\",[\\\"iterable\\\",\\\"func\\\",\\\"initial\\\"],t,e,[Sk.builtin.none.none$,Sk.builtin.none.none$]);if(i=Sk.abstr.iter(i),r=Sk.builtin.checkNone(r)?new Sk.builtin.func(((t,e)=>Sk.abstr.numberBinOp(t,e,\\\"Add\\\"))):r,this===u.accumulate.prototype)return new u.accumulate(i,r,s);{const t=new this.constructor;return u.accumulate.call(t,i,r,s),t}}}}),u.batched=Sk.abstr.buildIteratorClass(\\\"itertools.batched\\\",{constructor:function batched(t,e,i){this.it=t,this.n=e,this.strict=i},slots:{tp$new(t,e){r(\\\"batched\\\",t,2,2);let[s,o,l]=i(\\\"batched\\\",[null,null,\\\"strict\\\"],t,e,[n]);if(o=Sk.misceval.asIndexSized(o,Sk.builtin.OverFlowError),o<1)throw new Sk.builtin.ValueError(\\\"n must be at least one\\\");const a=Sk.abstr.iter(s);return new u.batched(a,o,c(l))},tp$doc:\\\"Batch data into tuples of length n. The last batch may be shorter than n.\\\"},iternext(t){let e=0;const i=[],r=o(a(this.it,(t=>{if(e++,i.push(t),e===this.n)return h()})),(()=>{if(0!=e){if(e{if(this.tp$iternext=this.constructor.prototype.tp$iternext,this.current_it=this.iterables.tp$iternext(),void 0!==this.current_it)return this.current_it=Sk.abstr.iter(this.current_it),this.tp$iternext();this.tp$iternext=()=>{}}},iternext(t){let e;for(;void 0===e;){if(e=this.current_it.tp$iternext(),void 0!==e)return e;if(this.current_it=this.iterables.tp$iternext(),void 0===this.current_it)return void(this.tp$iternext=()=>{});this.current_it=Sk.abstr.iter(this.current_it)}},slots:{tp$doc:\\\"chain(*iterables) --\\\\x3e chain object\\\\n\\\\nReturn a chain object whose .__next__() method returns elements from the\\\\nfirst iterable until it is exhausted, then elements from the next\\\\niterable, until all of the iterables are exhausted.\\\",tp$new(t,e){if(Sk.abstr.checkNoKwargs(\\\"chain\\\",e),t=new Sk.builtin.tuple(t.slice(0)).tp$iter(),this===u.chain.prototype)return new u.chain(t);{const e=new this.constructor;return u.chain.call(e,t),e}}},classmethods:Object.assign({from_iterable:{$meth(t){const e=Sk.abstr.iter(t);return new u.chain(e)},$flags:{OneArg:!0},$doc:\\\"chain.from_iterable(iterable) --\\\\x3e chain object\\\\n\\\\nAlternate chain() constructor taking a single iterable argument\\\\nthat evaluates lazily.\\\",$textsig:null}},Sk.generic.classGetItem)}),u.combinations=Sk.abstr.buildIteratorClass(\\\"itertools.combinations\\\",{constructor:function combinations(t,e){this.pool=t,this.r=e,this.indices=new Array(e).fill().map(((t,e)=>e)),this.n=t.length,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(t){let e,i=!1;for(e=this.r-1;e>=0;e--)if(this.indices[e]!=e+this.n-this.r){i=!0;break}if(!i)return void(this.r=0);this.indices[e]++;for(let s=e+1;sthis.pool[t]));return new Sk.builtin.tuple(r)},slots:{tp$doc:\\\"combinations(iterable, r) --\\\\x3e combinations object\\\\n\\\\nReturn successive r-length combinations of elements in the iterable.\\\\n\\\\ncombinations(range(4), 3) --\\\\x3e (0,1,2), (0,1,3), (0,2,3), (1,2,3)\\\",tp$new(t,e){return combinationsNew.call(this,u.combinations.prototype,t,e)}}}),u.combinations_with_replacement=Sk.abstr.buildIteratorClass(\\\"itertools.combinations_with_replacement\\\",{constructor:function combinations_with_replacement(t,e){this.pool=t,this.r=e,this.indices=new Array(e).fill(0),this.n=t.length,this.tp$iternext=()=>{if(this.r&&!this.n)return;this.tp$iternext=this.constructor.prototype.tp$iternext;const t=this.indices.map((t=>this.pool[t]));return new Sk.builtin.tuple(t)}},iternext(t){let e,i=!1;for(e=this.r-1;e>=0;e--)if(this.indices[e]!=this.n-1){i=!0;break}if(!i)return void(this.r=0);const r=this.indices[e]+1;for(let n=e;nthis.pool[t]));return new Sk.builtin.tuple(s)},slots:{tp$doc:\\\"combinations_with_replacement(iterable, r) --\\\\x3e combinations_with_replacement object\\\\n\\\\nReturn successive r-length combinations of elements in the iterable\\\\nallowing individual elements to have successive repeats.\\\\ncombinations_with_replacement('ABC', 2) --\\\\x3e AA AB AC BB BC CC\\\",tp$new(t,e){return combinationsNew.call(this,u.combinations_with_replacement.prototype,t,e)}}}),u.compress=Sk.abstr.buildIteratorClass(\\\"itertools.compress\\\",{constructor:function compress(t,e){this.data=t,this.selectors=e},iternext(){let t=this.data.tp$iternext(),e=this.selectors.tp$iternext();for(;void 0!==t&&void 0!==e;){if(Sk.misceval.isTrue(e))return t;t=this.data.tp$iternext(),e=this.selectors.tp$iternext()}},slots:{tp$doc:\\\"compress(data, selectors) --\\\\x3e iterator over selected data\\\\n\\\\nReturn data elements corresponding to true selector elements.\\\\nForms a shorter iterator from selected data elements using the\\\\nselectors to choose the data elements.\\\",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"compress\\\",[\\\"data\\\",\\\"selectors\\\"],t,e,[]),i=Sk.abstr.iter(i),r=Sk.abstr.iter(r),this===u.count.prototype)return new u.compress(i,r);{const t=new this.constructor;return u.compress.call(t,i,r),t}}}}),u.count=Sk.abstr.buildIteratorClass(\\\"itertools.count\\\",{constructor:function count(t,e){this.start=t,this.step=e},iternext(){const t=this.start;return this.start=Sk.abstr.numberBinOp(this.start,this.step,\\\"Add\\\"),t},slots:{tp$doc:\\\"count(start=0, step=1) --\\\\x3e count object\\\\n\\\\nReturn a count object whose .__next__() method returns consecutive values.\\\\nEquivalent to:\\\\n\\\\n def count(firstval=0, step=1):\\\\n x = firstval\\\\n while 1:\\\\n yield x\\\\n x += step\\\\n\\\",tp$new(t,e){const[i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"count\\\",[\\\"start\\\",\\\"step\\\"],t,e,[new Sk.builtin.int_(0),new Sk.builtin.int_(1)]);if(!Sk.builtin.checkNumber(i)&&!Sk.builtin.checkComplex(i))throw new Sk.builtin.TypeError(\\\"a number is required\\\");if(!Sk.builtin.checkNumber(r)&&!Sk.builtin.checkComplex(r))throw new Sk.builtin.TypeError(\\\"a number is required\\\");if(this===u.count.prototype)return new u.count(i,r);{const t=new this.constructor;return u.count.call(t,i,r),t}},$r(){const t=Sk.misceval.objectRepr(this.start);let e=Sk.misceval.objectRepr(this.step);return e=\\\"1\\\"===e?\\\"\\\":\\\", \\\"+e,new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+t+e+\\\")\\\")}}}),u.cycle=Sk.abstr.buildIteratorClass(\\\"itertools.cycle\\\",{constructor:function cycle(t){this.iter=t,this.saved=[],this.consumed=!1,this.i=0,this.length},iternext(){let t;if(!this.consumed){if(t=this.iter.tp$iternext(),void 0!==t)return this.saved.push(t),t;if(this.consumed=!0,this.length=this.saved.length,!this.length)return}return t=this.saved[this.i],this.i=(this.i+1)%this.length,t},slots:{tp$doc:\\\"cycle(iterable) --\\\\x3e cycle object\\\\n\\\\nReturn elements from the iterable until it is exhausted.\\\\nThen repeat the sequence indefinitely.\\\",tp$new(t,e){Sk.abstr.checkOneArg(\\\"cycle\\\",t,e);const i=Sk.abstr.iter(t[0]);if(this===u.cycle.prototype)return new u.cycle(i);{const t=new this.constructor;return u.cycle.call(t,i),t}}}}),u.dropwhile=Sk.abstr.buildIteratorClass(\\\"itertools.dropwhile\\\",{constructor:function dropwhile(t,e){this.predicate=t,this.iter=e,this.passed},iternext(){let t=this.iter.tp$iternext();for(;void 0===this.passed&&void 0!==t;){const e=Sk.misceval.callsimArray(this.predicate,[t]);if(!Sk.misceval.isTrue(e))return this.passed=!0,t;t=this.iter.tp$iternext()}return t},slots:{tp$doc:\\\"dropwhile(predicate, iterable) --\\\\x3e dropwhile object\\\\n\\\\nDrop items from the iterable while predicate(item) is true.\\\\nAfterwards, return every element until the iterable is exhausted.\\\",tp$new(t,e){Sk.abstr.checkNoKwargs(\\\"dropwhile\\\",e),Sk.abstr.checkArgsLen(\\\"dropwhile\\\",t,2,2);const i=t[0],r=Sk.abstr.iter(t[1]);if(this===u.dropwhile.prototype)return new u.dropwhile(i,r);{const t=new this.constructor;return u.dropwhile.call(t,i,r),t}}}}),u.filterfalse=Sk.abstr.buildIteratorClass(\\\"itertools.filterfalse\\\",{constructor:function filterfalse(t,e){this.predicate=t,this.iter=e},iternext(t){let e=this.iter.tp$iternext();if(void 0===e)return;let i=Sk.misceval.callsimArray(this.predicate,[e]);for(;Sk.misceval.isTrue(i);){if(e=this.iter.tp$iternext(),void 0===e)return;i=Sk.misceval.callsimArray(this.predicate,[e])}return e},slots:{tp$doc:\\\"filterfalse(function or None, sequence) --\\\\x3e filterfalse object\\\\n\\\\nReturn those items of sequence for which function(item) is false.\\\\nIf function is None, return the items that are false.\\\",tp$new(t,e){Sk.abstr.checkNoKwargs(\\\"filterfalse\\\",e),Sk.abstr.checkArgsLen(\\\"filterfalse\\\",t,2,2);const i=Sk.builtin.checkNone(t[0])?Sk.builtin.bool:t[0],r=Sk.abstr.iter(t[1]);if(this===u.filterfalse.prototype)return new u.filterfalse(i,r);{const t=new this.constructor;return u.filterfalse.call(t,i,r),t}}}}),u._grouper=Sk.abstr.buildIteratorClass(\\\"itertools._grouper\\\",{constructor:function _grouper(t,e){this.groupby=t,this.tgtkey=t.tgtkey,this.id=t.id},iternext(t){const e=Sk.misceval.richCompareBool(this.groupby.currkey,this.tgtkey,\\\"Eq\\\");if(this.groupby.id===this.id&&e){let t=this.groupby.currval;return this.groupby.currval=this.groupby.iter.tp$iternext(),void 0!==this.groupby.currval&&(this.groupby.currkey=Sk.misceval.callsimArray(this.groupby.keyf,[this.groupby.currval])),t}}}),u.groupby=Sk.abstr.buildIteratorClass(\\\"itertools.groupby\\\",{constructor:function groupby(t,e){this.iter=t,this.keyf=e,this.currval,this.currkey=this.tgtkey=new Sk.builtin.object,this.id},iternext(t){this.id=new Object;let e=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\\\"Eq\\\");for(;e;){if(this.currval=this.iter.tp$iternext(),void 0===this.currval)return;this.currkey=Sk.misceval.callsimArray(this.keyf,[this.currval]),e=Sk.misceval.richCompareBool(this.currkey,this.tgtkey,\\\"Eq\\\")}this.tgtkey=this.currkey;const i=new u._grouper(this);return new Sk.builtin.tuple([this.currkey,i])},slots:{tp$doc:\\\"groupby(iterable, key=None) -> make an iterator that returns consecutive\\\\nkeys and groups from the iterable. If the key function is not specified or\\\\nis None, the element itself is used for grouping.\\\\n\\\",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"groupby\\\",[\\\"iterable\\\",\\\"key\\\"],t,e,[Sk.builtin.none.none$]),i=Sk.abstr.iter(i),r=Sk.builtin.checkNone(r)?new Sk.builtin.func((t=>t)):r,this===u.groupby.prototype)return new u.groupby(i,r);{const t=new this.constructor;return u.groupby.call(t,i,r),t}}}}),u.islice=Sk.abstr.buildIteratorClass(\\\"itertools.islice\\\",{constructor:function islice(t,e,i,r){this.iter=t,this.previt=e,this.stop=i,this.step=r,this.tp$iternext=()=>{if(this.tp$iternext=this.constructor.prototype.tp$iternext,!(this.previt>=this.stop)){for(let t=0;t=this.stop)){for(let t=this.previt+1;tNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError(\\\"Stop for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");if(!Sk.builtin.checkNone(r)&&!Sk.misceval.isIndex(r))throw new Sk.builtin.ValueError(\\\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");if(r=Sk.builtin.checkNone(r)?0:Sk.misceval.asIndexSized(r),r<0||r>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError(\\\"Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize.\\\");if(!Sk.builtin.checkNone(n)&&!Sk.misceval.isIndex(n))throw new Sk.builtin.ValueError(\\\"Step for islice() must be a positive integer or None\\\");if(n=Sk.builtin.checkNone(n)?1:Sk.misceval.asIndexSized(n),n<=0||n>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.ValueError(\\\"Step for islice() must be a positive integer or None.\\\");if(this===u.islice.prototype)return new u.islice(i,r,s,n);{const t=new this.constructor;return u.islice.call(t,i,r,s,n),t}}}}),u.permutations=Sk.abstr.buildIteratorClass(\\\"itertools.permutations\\\",{constructor:function permutations(t,e){this.pool=t,this.r=e;const i=t.length;this.indices=new Array(i).fill().map(((t,e)=>e)),this.cycles=new Array(e).fill().map(((t,e)=>i-e)),this.n=i,this.tp$iternext=()=>{if(!(this.r>this.n))return this.tp$iternext=this.constructor.prototype.tp$iternext,new Sk.builtin.tuple(this.pool.slice(0,this.r))}},iternext(t){for(let e=this.r-1;e>=0;e--){if(this.cycles[e]--,0!=this.cycles[e]){const t=this.cycles[e];[this.indices[e],this.indices[this.n-t]]=[this.indices[this.n-t],this.indices[e]];const i=this.indices.map((t=>this.pool[t])).slice(0,this.r);return new Sk.builtin.tuple(i)}this.indices.push(this.indices.splice(e,1)[0]),this.cycles[e]=this.n-e}this.r=0},slots:{tp$doc:\\\"permutations(iterable[, r]) --\\\\x3e permutations object\\\\n\\\\nReturn successive r-length permutations of elements in the iterable.\\\\n\\\\npermutations(range(3), 2) --\\\\x3e (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)\\\",tp$new(t,e){let i,r;[i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"permutations\\\",[\\\"iterable\\\",\\\"r\\\"],t,e,[Sk.builtin.none.none$]);const s=Sk.misceval.arrayFromIterable(i);if(r=Sk.builtin.checkNone(r)?s.length:Sk.misceval.asIndexSized(r,Sk.builtin.OverFlowError),r<0)throw new Sk.builtin.ValueError(\\\"r must be non-negative\\\");if(this===u.permutations.prototype)return new u.permutations(s,r);{const t=new this.constructor;return u.permutations.call(t,s,r),t}}}}),u.pairwise=Sk.abstr.buildIteratorClass(\\\"itertools.pairwise\\\",{constructor:function pairwise(t){this.it=t,this.old=null},slots:{tp$new(t,i){e(\\\"pairwise\\\",t,i);const r=t[0],s=Sk.abstr.iter(r);return new u.pairwise(s)},tp$doc:\\\"Return an iterator of overlapping pairs taken from the input iterator.\\\\n\\\\n s -> (s0,s1), (s1,s2), (s2, s3), ...\\\"},iternext(t){let e=this.old;const i=[null];null===e&&(i.push((()=>this.it.tp$iternext(t))),i.push((t=>{void 0!==t&&(e=t,this.old=t)})));const r=o(...i,(()=>{if(null!==e)return this.it.tp$iternext(t)}),(t=>{if(void 0!==t)return this.old=t,new s([e,t]);this.old=null}));return t?r:l(r)}}),u.product=Sk.abstr.buildIteratorClass(\\\"itertools.product\\\",{constructor:function product(t){this.pools=t,this.n=t.length,this.indices=Array(t.length).fill(0),this.pool_sizes=t.map((t=>t.length)),this.tp$iternext=()=>{this.tp$iternext=this.constructor.prototype.tp$iternext;const t=this.indices.map(((t,e)=>this.pools[e][this.indices[e]]));if(!t.some((t=>void 0===t)))return new Sk.builtin.tuple(t);this.n=0}},iternext(t){let e=this.n-1;for(;e>=0&&e=this.pool_sizes[e]?(this.indices[e]=-1,e--):e++;if(this.n&&!this.indices.every((t=>-1===t))){const t=this.indices.map(((t,e)=>this.pools[e][this.indices[e]]));return new Sk.builtin.tuple(t)}this.n=0},slots:{tp$doc:\\\"product(*iterables, repeat=1) --\\\\x3e product object\\\\n\\\\nCartesian product of input iterables. Equivalent to nested for-loops.\\\\n\\\\nFor example, product(A, B) returns the same as: ((x,y) for x in A for y in B).\\\\nThe leftmost iterators are in the outermost for-loop, so the output tuples\\\\ncycle in a manner similar to an odometer (with the rightmost element changing\\\\non every iteration).\\\\n\\\\nTo compute the product of an iterable with itself, specify the number\\\\nof repetitions with the optional repeat keyword argument. For example,\\\\nproduct(A, repeat=4) means the same as product(A, A, A, A).\\\\n\\\\nproduct('ab', range(3)) --\\\\x3e ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\\\\nproduct((0,1), (0,1), (0,1)) --\\\\x3e (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...\\\",tp$new(t,e){let[i]=Sk.abstr.copyKeywordsToNamedArgs(\\\"product\\\",[\\\"repeat\\\"],[],e,[new Sk.builtin.int_(1)]);if(i=Sk.misceval.asIndexSized(i,Sk.builtin.OverFlowError),i<0)throw new Sk.builtin.ValueError(\\\"repeat argument cannot be negative\\\");const r=[];for(let n=0;nthis.object)},iternext(t){return this.times-- >0?this.object:void 0},slots:{tp$doc:\\\"repeat(object [,times]) -> create an iterator which returns the object\\\\nfor the specified number of times. If not specified, returns the object\\\\nendlessly.\\\",tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"repeat\\\",[\\\"object\\\",\\\"times\\\"],t,e,[null]),r=null!==r?Sk.misceval.asIndexSized(r,Sk.builtin.OverFlowError):void 0,this===u.repeat.prototype)return new u.repeat(i,r);{const t=new this.constructor;return u.repeat.call(t,i,r),t}},$r(){const t=Sk.misceval.objectRepr(this.object),e=void 0===this.times?\\\"\\\":\\\", \\\"+(this.times>=0?this.times:0);return new Sk.builtin.str(Sk.abstr.typeName(this)+\\\"(\\\"+t+e+\\\")\\\")}},methods:{__lenght_hint__:{$meth(){if(void 0===this.times)throw new Sk.builtin.TypeError(\\\"len() of unsized object\\\");return new Sk.builtin.int_(this.times)},$flags:{NoArgs:!0},$textsig:null}}}),u.starmap=Sk.abstr.buildIteratorClass(\\\"itertools.starmap\\\",{constructor:function starmap(t,e){this.func=t,this.iter=e},iternext(t){const e=this.iter.tp$iternext();if(void 0===e)return;const i=Sk.misceval.arrayFromIterable(e);return Sk.misceval.callsimArray(this.func,i)},slots:{tp$new(t,e){let i,r;if([i,r]=Sk.abstr.copyKeywordsToNamedArgs(\\\"starmap\\\",[\\\"func\\\",\\\"iterable\\\"],t,e,[]),r=Sk.abstr.iter(r),i=Sk.builtin.checkNone(i)?Sk.builtin.bool:i,this===u.starmap.prototype)return new u.starmap(i,r);{const t=new this.constructor;return u.starmap.call(t,i,r),t}}}}),u.takewhile=Sk.abstr.buildIteratorClass(\\\"itertools.takewhile\\\",{constructor:function takewhile(t,e){this.predicate=t,this.iter=e},iternext(){const t=this.iter.tp$iternext();if(void 0!==t){const e=Sk.misceval.callsimArray(this.predicate,[t]);if(Sk.misceval.isTrue(e))return t;this.tp$iternext=()=>{}}},slots:{tp$doc:\\\"takewhile(predicate, iterable) --\\\\x3e takewhile object\\\\n\\\\nReturn successive entries from an iterable as long as the \\\\npredicate evaluates to true for each entry.\\\",tp$new(t,e){Sk.abstr.checkNoKwargs(\\\"takewhile\\\",e),Sk.abstr.checkArgsLen(\\\"takewhile\\\",t,2,2);const i=t[0],r=Sk.abstr.iter(t[1]);if(this===u.takewhile.prototype)return new u.takewhile(i,r);{const t=new this.constructor;return u.takewhile.call(t,i,r),t}}}}),u.tee=new Sk.builtin.func((function(){throw new Sk.builtin.NotImplementedError(\\\"tee is not yet implemented in Skulpt\\\")})),u.zip_longest=Sk.abstr.buildIteratorClass(\\\"itertools.zip_longest\\\",{constructor:function zip_longest(t,e){this.iters=t,this.fillvalue=e,this.active=this.iters.length},iternext(t){if(!this.active)return;let e;const i=[];for(let r=0;r=\\\"0\\\"&&u<=\\\"9\\\";)e+=u,next();if(\\\".\\\"===u)for(e+=\\\".\\\";next()&&u>=\\\"0\\\"&&u<=\\\"9\\\";)e+=u;if(\\\"e\\\"===u||\\\"E\\\"===u)for(e+=u,next(),\\\"-\\\"!==u&&\\\"+\\\"!==u||(e+=u,next());u>=\\\"0\\\"&&u<=\\\"9\\\";)e+=u,next();if(t=+e,isFinite(t))return t;error(\\\"Bad number\\\")},string=function(){var t,e,n,i=\\\"\\\";if('\\\"'===u)for(;next();){if('\\\"'===u)return next(),i;if(\\\"\\\\\\\\\\\"===u)if(next(),\\\"u\\\"===u){for(n=0,e=0;e<4&&(t=parseInt(next(),16),isFinite(t));e+=1)n=16*n+t;i+=String.fromCharCode(n)}else{if(\\\"string\\\"!=typeof s[u])break;i+=s[u]}else i+=u}error(\\\"Bad string\\\")},white=function(){for(;u&&u<=\\\" \\\";)next()};a=function(){switch(white(),u){case\\\"{\\\":return function(){var t,e={};if(\\\"{\\\"===u){if(next(\\\"{\\\"),white(),\\\"}\\\"===u)return next(\\\"}\\\"),e;for(;u;){if(t=string(),white(),next(\\\":\\\"),Object.hasOwnProperty.call(e,t)&&error('Duplicate key \\\"'+t+'\\\"'),e[t]=a(),white(),\\\"}\\\"===u)return next(\\\"}\\\"),e;next(\\\",\\\"),white()}}error(\\\"Bad object\\\")}();case\\\"[\\\":return function(){var t=[];if(\\\"[\\\"===u){if(next(\\\"[\\\"),white(),\\\"]\\\"===u)return next(\\\"]\\\"),t;for(;u;){if(t.push(a()),white(),\\\"]\\\"===u)return next(\\\"]\\\"),t;next(\\\",\\\"),white()}}error(\\\"Bad array\\\")}();case'\\\"':return string();case\\\"-\\\":return number();default:return u>=\\\"0\\\"&&u<=\\\"9\\\"?number():function(){switch(u){case\\\"t\\\":return next(\\\"t\\\"),next(\\\"r\\\"),next(\\\"u\\\"),next(\\\"e\\\"),!0;case\\\"f\\\":return next(\\\"f\\\"),next(\\\"a\\\"),next(\\\"l\\\"),next(\\\"s\\\"),next(\\\"e\\\"),!1;case\\\"n\\\":return next(\\\"n\\\"),next(\\\"u\\\"),next(\\\"l\\\"),next(\\\"l\\\"),null}error(\\\"Unexpected '\\\"+u+\\\"'\\\")}()}},e.exports=function(t,e){var n;return f=t,i=0,u=\\\" \\\",n=a(),white(),u&&error(\\\"Syntax error\\\"),\\\"function\\\"==typeof e?function walk(t,n){var i,u,f=t[n];if(f&&\\\"object\\\"==typeof f)for(i in f)Object.prototype.hasOwnProperty.call(f,i)&&(void 0!==(u=walk(f,i))?f[i]=u:delete f[i]);return e.call(t,n,f)}({\\\"\\\":n},\\\"\\\"):n}},{}],4:[function(t,e,n){var i,u,f,a=/[\\\\\\\\\\\\\\\"\\\\x00-\\\\x1f\\\\x7f-\\\\x9f\\\\u00ad\\\\u0600-\\\\u0604\\\\u070f\\\\u17b4\\\\u17b5\\\\u200c-\\\\u200f\\\\u2028-\\\\u202f\\\\u2060-\\\\u206f\\\\ufeff\\\\ufff0-\\\\uffff]/g,s={\\\"\\\\b\\\":\\\"\\\\\\\\b\\\",\\\"\\\\t\\\":\\\"\\\\\\\\t\\\",\\\"\\\\n\\\":\\\"\\\\\\\\n\\\",\\\"\\\\f\\\":\\\"\\\\\\\\f\\\",\\\"\\\\r\\\":\\\"\\\\\\\\r\\\",'\\\"':'\\\\\\\\\\\"',\\\"\\\\\\\\\\\":\\\"\\\\\\\\\\\\\\\\\\\"};function quote(t){return a.lastIndex=0,a.test(t)?'\\\"'+t.replace(a,(function(t){var e=s[t];return\\\"string\\\"==typeof e?e:\\\"\\\\\\\\u\\\"+(\\\"0000\\\"+t.charCodeAt(0).toString(16)).slice(-4)}))+'\\\"':'\\\"'+t+'\\\"'}function str(t,e){var n,a,s,c,l,p=i,y=e[t];switch(y&&\\\"object\\\"==typeof y&&\\\"function\\\"==typeof y.toJSON&&(y=y.toJSON(t)),\\\"function\\\"==typeof f&&(y=f.call(e,t,y)),typeof y){case\\\"string\\\":return quote(y);case\\\"number\\\":return isFinite(y)?String(y):\\\"null\\\";case\\\"boolean\\\":case\\\"null\\\":return String(y);case\\\"object\\\":if(!y)return\\\"null\\\";if(i+=u,l=[],\\\"[object Array]\\\"===Object.prototype.toString.apply(y)){for(c=y.length,n=0;n1)for(var n=1;n=\\\"0\\\"&&u<=\\\"9\\\";)e+=u,next();if(\\\".\\\"===u)for(e+=\\\".\\\";next()&&u>=\\\"0\\\"&&u<=\\\"9\\\";)e+=u;if(\\\"e\\\"===u||\\\"E\\\"===u)for(e+=u,next(),\\\"-\\\"!==u&&\\\"+\\\"!==u||(e+=u,next());u>=\\\"0\\\"&&u<=\\\"9\\\";)e+=u,next();if(t=+e,isFinite(t))return t;error(\\\"Bad number\\\")},string=function(){var t,e,n,i=\\\"\\\";if('\\\"'===u)for(;next();){if('\\\"'===u)return next(),i;if(\\\"\\\\\\\\\\\"===u)if(next(),\\\"u\\\"===u){for(n=0,e=0;e<4&&(t=parseInt(next(),16),isFinite(t));e+=1)n=16*n+t;i+=String.fromCharCode(n)}else{if(\\\"string\\\"!=typeof a[u])break;i+=a[u]}else i+=u}error(\\\"Bad string\\\")},white=function(){for(;u&&u<=\\\" \\\";)next()};c=function(){switch(white(),u){case\\\"{\\\":return function(){var t,e={};if(\\\"{\\\"===u){if(next(\\\"{\\\"),white(),\\\"}\\\"===u)return next(\\\"}\\\"),e;for(;u;){if(t=string(),white(),next(\\\":\\\"),Object.hasOwnProperty.call(e,t)&&error('Duplicate key \\\"'+t+'\\\"'),e[t]=c(),white(),\\\"}\\\"===u)return next(\\\"}\\\"),e;next(\\\",\\\"),white()}}error(\\\"Bad object\\\")}();case\\\"[\\\":return function(){var t=[];if(\\\"[\\\"===u){if(next(\\\"[\\\"),white(),\\\"]\\\"===u)return next(\\\"]\\\"),t;for(;u;){if(t.push(c()),white(),\\\"]\\\"===u)return next(\\\"]\\\"),t;next(\\\",\\\"),white()}}error(\\\"Bad array\\\")}();case'\\\"':return string();case\\\"-\\\":return number();default:return u>=\\\"0\\\"&&u<=\\\"9\\\"?number():function(){switch(u){case\\\"t\\\":return next(\\\"t\\\"),next(\\\"r\\\"),next(\\\"u\\\"),next(\\\"e\\\"),!0;case\\\"f\\\":return next(\\\"f\\\"),next(\\\"a\\\"),next(\\\"l\\\"),next(\\\"s\\\"),next(\\\"e\\\"),!1;case\\\"n\\\":return next(\\\"n\\\"),next(\\\"u\\\"),next(\\\"l\\\"),next(\\\"l\\\"),null}error(\\\"Unexpected '\\\"+u+\\\"'\\\")}()}},e.exports=function(t,e){var n;return f=t,i=0,u=\\\" \\\",n=c(),white(),u&&error(\\\"Syntax error\\\"),\\\"function\\\"==typeof e?function walk(t,n){var i,u,f=t[n];if(f&&\\\"object\\\"==typeof f)for(i in f)Object.prototype.hasOwnProperty.call(f,i)&&(void 0!==(u=walk(f,i))?f[i]=u:delete f[i]);return e.call(t,n,f)}({\\\"\\\":n},\\\"\\\"):n}},{}],4:[function(t,e,n){var i,u,f,c=/[\\\\\\\\\\\\\\\"\\\\x00-\\\\x1f\\\\x7f-\\\\x9f\\\\u00ad\\\\u0600-\\\\u0604\\\\u070f\\\\u17b4\\\\u17b5\\\\u200c-\\\\u200f\\\\u2028-\\\\u202f\\\\u2060-\\\\u206f\\\\ufeff\\\\ufff0-\\\\uffff]/g,a={\\\"\\\\b\\\":\\\"\\\\\\\\b\\\",\\\"\\\\t\\\":\\\"\\\\\\\\t\\\",\\\"\\\\n\\\":\\\"\\\\\\\\n\\\",\\\"\\\\f\\\":\\\"\\\\\\\\f\\\",\\\"\\\\r\\\":\\\"\\\\\\\\r\\\",'\\\"':'\\\\\\\\\\\"',\\\"\\\\\\\\\\\":\\\"\\\\\\\\\\\\\\\\\\\"};function quote(t){return c.lastIndex=0,c.test(t)?'\\\"'+t.replace(c,(function(t){var e=a[t];return\\\"string\\\"==typeof e?e:\\\"\\\\\\\\u\\\"+(\\\"0000\\\"+t.charCodeAt(0).toString(16)).slice(-4)}))+'\\\"':'\\\"'+t+'\\\"'}function str(t,e){var n,c,a,s,l,p=i,y=e[t];switch(y&&\\\"object\\\"==typeof y&&\\\"function\\\"==typeof y.toJSON&&(y=y.toJSON(t)),\\\"function\\\"==typeof f&&(y=f.call(e,t,y)),typeof y){case\\\"string\\\":return quote(y);case\\\"number\\\":return isFinite(y)?String(y):\\\"null\\\";case\\\"boolean\\\":case\\\"null\\\":return String(y);case\\\"object\\\":if(!y)return\\\"null\\\";if(i+=u,l=[],\\\"[object Array]\\\"===Object.prototype.toString.apply(y)){for(s=y.length,n=0;n1)for(var n=1;n{throw new a(t+\\\" is not yet implemented in skulpt\\\")}))}const j=E.JSONDecodeError=N(\\\"json.JSONDecodeError\\\",{base:l,constructor:function JSONDecodeError(t,e,n){const r=e.slice(0,n),o=r.split(\\\"\\\\n\\\").length,s=n-r.lastIndexOf(\\\"\\\\n\\\"),i=`${t}: line ${o} column ${s} (char ${n})`;l.call(this,i),this.$msg=t,this.$doc=e,this.$pos=n,this.$lineno=o,this.$colno=s},getsets:Object.fromEntries([\\\"msg\\\",\\\"doc\\\",\\\"pos\\\",\\\"lineno\\\",\\\"colno\\\"].map((t=>[t,{$get(){return m(this[\\\"$\\\"+t])}}])))});class JSONEncoder{constructor(t,e,n,r,o,s,i,l){this.skipkeys=t,this.ensure_ascii=e,this.check_circular=n,this.allow_nan=r,this.indent=o,this.separators=s,this.sort_keys=l,this.item_separator=\\\", \\\",this.key_separator=\\\": \\\",null!==this.separators?[this.item_separator,this.key_separator]=this.separators:null!==this.indent&&(this.item_separator=\\\",\\\"),null!==i&&(this.default=i),this.encoder=this.make_encoder()}default(t){throw new i(`Object of type ${b(t)} is not JSON serializable`)}encode(e){return new t(this.encoder(e))}make_encoder(){let t,e;t=this.check_circular?new Set:null,e=(this.ensure_ascii,JSON.stringify);return function _make_iterencode(t,e,n,r,s,a,u,h,f){null!==r&&\\\"string\\\"!=typeof r&&(r=\\\" \\\".repeat(r));let d,p,m,w;null!==t?(d=e=>{if(t.has(e))throw new l(\\\"Circular reference detected\\\");t.add(e)},p=e=>t.delete(e)):(d=t=>{},p=t=>{});null!==r?(m=(t,e)=>{e+=1;const n=\\\"\\\\n\\\"+r.repeat(e);return[t+=n,e,u+n]},w=(t,e,n)=>(n-=1,t+=\\\"\\\\n\\\"+r.repeat(n)+e)):(m=(t,e)=>[t,e,u],w=(t,e,n)=>t+e);const _unhandled=(t,n)=>{d(t);const r=_iterencode(e(t),n);return p(t),r},_iterencode_list=(t,e)=>{if(!t.length)return\\\"[]\\\";let n,r;d(t),[n,e,r]=m(\\\"[\\\",e);let o=!0;for(let s of t)o?o=!1:n+=r,n+=_iterencode(s,e);return p(t),w(n,\\\"]\\\",e)},_iterencode_dict=(t,e)=>{if(!t.sq$length())return\\\"{}\\\";let r,l;d(t),[r,e,l]=m(\\\"{\\\",e);let u=!0;if(h){const e=$(t.tp$getattr(v)),n=c(e);t=$(o,[n])}for(let[o,c]of t.$items()){const t=o.valueOf(),h=typeof t;if(\\\"string\\\"===h)o=t;else if(\\\"number\\\"===h)o=s(o);else if(\\\"boolean\\\"===h||null===t)o=String(t);else{if(!JSBI.__isBigInt(t)){if(f)continue;throw new i(\\\"keys must be str, int, float, bool or None, not \\\"+b(o))}o=t.toString()}u?u=!1:r+=l,r+=n(o),r+=a,r+=_iterencode(c,e)}return p(t),w(r,\\\"}\\\",e)},_iterencode=(t,e=0)=>String(g(t,{stringHook:t=>n(t),numberHook:(t,e)=>s(e),bigintHook:t=>t.toString(),dictHook:t=>_iterencode_dict(t,e),arrayHook:t=>_iterencode_list(t,e),setHook:t=>_unhandled(t,e),funcHook:(t,n)=>_unhandled(n,e),objecthook:(t,n)=>_unhandled(n,e),unhandledHook:t=>_unhandled(t,e)}));return _iterencode}(t,this.default,e,this.indent,((t,e=this.allow_nan)=>{const n=t.valueOf();let r;if(Number.isFinite(n))return J(t);if(r=n.toString(),!e)throw new l(\\\"Out of range float values are not JSON compliant: \\\"+J(t));return r}),this.key_separator,this.item_separator,this.sort_keys,this.skipkeys)}}const v=new t(\\\"items\\\");const x=[!1,!0,!0,!0,null,null,null,!1],D=new JSONEncoder(...x),F=/(-?(?:0|[1-9]\\\\d*))(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?/;const I=/\\\"[^\\\"\\\\\\\\]*(?:\\\\\\\\.[^\\\"\\\\\\\\]*)*\\\"/m;function scanstring(e,n){const r=e.substring(n-1).match(I);if(null===r)throw new j(\\\"Unterminated string starting at\\\",e,n-1);try{return[new t(JSON.parse(r[0])),n+r[0].length-1]}catch(o){let t=o.message.match(/(?:column|position) (\\\\d+)/);t=t&&Number(t[1]);n=n+(t||0)-(void 0===o.columnNumber?1:2);const r=o.message.replace(\\\"JSON.parse: \\\",\\\"\\\").replace(/ at line \\\\d+ column \\\\d+ of the JSON data/,\\\"\\\").replace(/ in JSON at position \\\\d+$/,\\\"\\\");throw new j(r,e,n)}}const A=/[ \\\\t\\\\n\\\\r]*/;function JSONArray(t,e,r){const o=[];let s=t[e];const adjust_white_space=()=>{if(\\\" \\\"===s||\\\"\\\\t\\\"===s||\\\"\\\\n\\\"===s||\\\"\\\\r\\\"===s){const n=t.substring(e).match(A);e+=n[0].length,s=t[e]}};if(adjust_white_space(),\\\"]\\\"===s)return[new n([]),e+1];for(;;){let n;if([n,e]=r(t,e),void 0===n)throw new j(\\\"Expecting value\\\",t,e);if(o.push(n),s=t[e],adjust_white_space(),e++,\\\"]\\\"===s)break;if(\\\",\\\"!==s)throw new j(\\\"Expecting ',' delimiter\\\",t,e-1);s=t[e],adjust_white_space()}return[new n(o),e]}function JSONObject(t,e,s,i,l,a={}){let c=[],u=t[e];const memo_get=function(t){const e=t.toString();return e in a?a[e]:(a[e]=t,t)},adjust_white_space=()=>{if(\\\" \\\"===u||\\\"\\\\t\\\"===u||\\\"\\\\n\\\"===u||\\\"\\\\r\\\"===u){const n=t.substring(e).match(A);e+=n[0].length,u=t[e]}};if('\\\"'!==u){if(adjust_white_space(),\\\"}\\\"===u){if(null!==l){return[l(new n([])),e+1]}return c=new o([]),null!==i&&(c=i(c)),[c,e+1]}if('\\\"'!==u)throw new j(\\\"Expecting property name enclosed in double quotes\\\",t,e)}let h,f;for(e+=1;;){if([h,e]=scanstring(t,e),h=memo_get(h),\\\":\\\"!==(u=t[e])&&(adjust_white_space(),\\\":\\\"!==t[e]))throw new j(\\\"Expecting ':' delimiter\\\",t,e);if(u=t[++e],adjust_white_space(),[f,e]=s(t,e),void 0===f)throw new j(\\\"Expecting value\\\",t,e);if(u=t[e],c.push([h,f]),adjust_white_space(),e++,\\\"}\\\"===u)break;if(\\\",\\\"!==u)throw new j(\\\"Expecting ',' delimiter\\\",t,e-1);if(u=t[e],adjust_white_space(),e++,'\\\"'!==u)throw new j(\\\"Expecting property name enclosed in double quotes\\\",t,e-1)}if(null!==l){return[l(new n(c.map((t=>new r(t))))),e]}return c=new o(c.flat()),null!==i&&(c=i(c)),[c,e]}const H={NaN:new e(NaN),Infinity:new e(1/0),\\\"-Infinity\\\":new e(-1/0)};class JSONDecoder{constructor(t,e,n,r,o){this.object_hook=t,this.parse_float=e||w,this.parse_int=n||_,this.parse_constant=r||(t=>H[t]),this.object_pairs_hook=o,this.parse_object=JSONObject,this.parse_array=JSONArray,this.parse_string=scanstring,this.memo={},this.scan_once=function make_scanner(t){const{parse_object:e,parse_array:n,parse_string:r,parse_float:o,parse_int:s,parse_constant:i,object_hook:l,object_pairs_hook:a,memo:c}=t,_scan_once=(t,d)=>{const p=t[d];if(void 0===p)return[p,d];if('\\\"'===p)return r(t,d+1);if(\\\"{\\\"===p)return e(t,d+1,_scan_once,l,a,c);if(\\\"[\\\"===p)return n(t,d+1,_scan_once);if(\\\"n\\\"===p&&\\\"null\\\"===t.substring(d,d+4))return[u,d+4];if(\\\"t\\\"===p&&\\\"true\\\"===t.substring(d,d+4))return[h,d+4];if(\\\"f\\\"===p&&\\\"false\\\"===t.substring(d,d+5))return[f,d+5];const m=t.substring(d).match(F);if(null!==m){let t;const[e,n,r,i]=m;return t=r||i?o(n+(r||\\\"\\\")+(i||\\\"\\\")):s(n),[t,d+e.length]}return\\\"N\\\"===p&&\\\"NaN\\\"===t.substring(d,d+3)?[i(\\\"NaN\\\"),d+3]:\\\"I\\\"==p&&\\\"Infinity\\\"===t.substring(d,d+8)?[i(\\\"Infinity\\\"),d+8]:\\\"-\\\"==p&&\\\"-Infinity\\\"===t.substring(d,d+9)?[i(\\\"-Infinity\\\"),d+9]:[void 0,d]};return function scan_once(t,e){try{return _scan_once(t,e)}finally{for(const t in c)delete c[t]}}}(this)}white(t,e){const n=(0===e?t:t.substring(e)).match(A);return null!==n&&(e+=n[0].length),e}decode(t){t=t.toString();let[e,n]=this.scan_once(t,this.white(t,0));if(void 0===e)throw new j(\\\"Expecting value\\\",t,n);if(n=this.white(t,n),n!==t.length)throw new j(\\\"Extra data\\\",t,n);return e}}const T=Array(5).fill(null),C=new JSONDecoder(...T);function convertToNullOrFunc(t){return null===t||t===u?null:e=>$(t,[m(e)])}return k(\\\"json\\\",E,{loads:{$meth(t,e){O(\\\"dumps\\\",t);let n=t[0];if(d(n));else{if(!p(n))throw new i(`the JSON object must be str or bytes, not ${b(n)}`);n=(new TextDecoder).decode(n.valueOf())}const r=S(\\\"dumps\\\",[\\\"object_hook\\\",\\\"parse_float\\\",\\\"parse_int\\\",\\\"parse_constant\\\",\\\"object_pairs_hook\\\"],[],e,T).map(convertToNullOrFunc);return r.every((t=>null===t))?C.decode(n):new JSONDecoder(...r).decode(n)},$doc:\\\"Deserialize ``s`` (a ``str`` or ``bytes`` instance containing a JSON document) to a Python object.\\\",$flags:{FastCall:!0}},dumps:{$meth(t,e){O(\\\"dumps\\\",t);const n=t[0];let[r,o,s,l,a,c,u,h]=S(\\\"loads\\\",[\\\"skipkeys\\\",\\\"ensure_ascii\\\",\\\"check_circular\\\",\\\"allow_nan\\\",\\\"indent\\\",\\\"separators\\\",\\\"default\\\",\\\"sort_keys\\\"],[],e,x);if(r=y(r),o=y(o),s=y(s),l=y(l),a=g(a),c=g(c),u=convertToNullOrFunc(u),h=y(h),!r&&o&&s&&l&&null===a&&null===c&&null===u&&!h)return D.encode(n);if(null===c);else if(!Array.isArray(c)||2!==c.length||\\\"string\\\"!=typeof c[0]||\\\"string\\\"!=typeof c[1])throw new i(\\\"separators shuld be a list or tuple of strings of length 2\\\");return new JSONEncoder(r,o,s,l,a,c,u,h).encode(n)},$doc:\\\"Serialize ``obj`` to a JSON formatted ``str``\\\",$flags:{FastCall:!0}}}),E}\",\"src/lib/keyword.js\":\"function $builtinmodule(){const{ffi:{remapToPy:t},builtin:{frozenset:e,str:s}}=Sk,i=new s(\\\"keyword\\\"),n=t([\\\"iskeyword\\\",\\\"issoftkeyword\\\",\\\"kwlist\\\",\\\"softkwlist\\\"]),o=t([\\\"False\\\",\\\"None\\\",\\\"True\\\",\\\"and\\\",\\\"as\\\",\\\"assert\\\",\\\"async\\\",\\\"await\\\",\\\"break\\\",\\\"class\\\",\\\"continue\\\",\\\"def\\\",\\\"del\\\",\\\"elif\\\",\\\"else\\\",\\\"except\\\",\\\"finally\\\",\\\"for\\\",\\\"from\\\",\\\"global\\\",\\\"if\\\",\\\"import\\\",\\\"in\\\",\\\"is\\\",\\\"lambda\\\",\\\"nonlocal\\\",\\\"not\\\",\\\"or\\\",\\\"pass\\\",\\\"raise\\\",\\\"return\\\",\\\"try\\\",\\\"while\\\",\\\"with\\\",\\\"yield\\\"]),a=t([\\\"_\\\",\\\"case\\\",\\\"match\\\"]);return{__name__:i,__all__:n,kwlist:o,softkwlist:a,iskeyword:new e(o).tp$getattr(s.$contains),issoftkeyword:new e(a).tp$getattr(s.$contains)}}\",\"src/lib/math.js\":\"const $builtinmodule=function(e){const{builtin:{str:t,int_:n,float_:i,TypeError:r,pyCheckType:u,checkNumber:l},abstr:{lookupSpecial:o},misceval:{callsimOrSuspendArray:a}}=Sk,s={pi:new Sk.builtin.float_(Math.PI),e:new Sk.builtin.float_(Math.E),tau:new Sk.builtin.float_(2*Math.PI),nan:new Sk.builtin.float_(NaN),inf:new Sk.builtin.float_(1/0)},b=new t(\\\"__ceil__\\\");const get_sign=function(e){return e=e?e<0?-1:1:1/e<0?-1:1};const c=18;function factorial(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));let t=Sk.builtin.asnum$(e);if((e=Math.floor(t))!=t)throw new Sk.builtin.ValueError(\\\"factorial() only accepts integral values\\\");if(e<0)throw new Sk.builtin.ValueError(\\\"factorial() not defined for negative numbers\\\");let n=1;for(let i=2;i<=e&&i<=c;i++)n*=i;if(e<=c)return new Sk.builtin.int_(n);n=JSBI.BigInt(n);for(let i=c+1;i<=e;i++)n=JSBI.multiply(n,JSBI.BigInt(i));return new Sk.builtin.int_(n)}const m=new t(\\\"__floor__\\\");function _gcd_internal(e,t){let n;return\\\"number\\\"==typeof e&&\\\"number\\\"==typeof t?(n=function _gcd(e,t){return 0==t?e:_gcd(t,e%t)}(e=Math.abs(e),t=Math.abs(t)),n=n<0?-n:n):(n=function _biggcd(e,t){return JSBI.equal(t,JSBI.__ZERO)?e:_biggcd(t,JSBI.remainder(e,t))}(e=JSBI.BigInt(e),t=JSBI.BigInt(t)),JSBI.lessThan(n,JSBI.__ZERO)&&(n=JSBI.multiply(n,JSBI.BigInt(-1)))),n}return Sk.abstr.setUpModuleMethods(\\\"math\\\",s,{acos:{$meth:function acos(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.acos(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc cosine (measured in radians) of x.\\\"},acosh:{$meth:function acosh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=(e=Sk.builtin.asnum$(e))+Math.sqrt(e*e-1);return new Sk.builtin.float_(Math.log(t))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic cosine of x.\\\"},asin:{$meth:function asin(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.asin(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc sine (measured in radians) of x.\\\"},asinh:{$meth:function asinh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=(e=Sk.builtin.asnum$(e))+Math.sqrt(e*e+1);return new Sk.builtin.float_(Math.log(t))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic sine of x.\\\"},atan:{$meth:function atan(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.atan(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the arc tangent (measured in radians) of x.\\\"},atan2:{$meth:function atan2(e,t){return Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(t)),new Sk.builtin.float_(Math.atan2(Sk.builtin.asnum$(e),Sk.builtin.asnum$(t)))},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, y, x, /)\\\",$doc:\\\"Return the arc tangent (measured in radians) of y/x.\\\\n\\\\nUnlike atan(y/x), the signs of both x and y are considered.\\\"},atanh:{$meth:function atanh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=(1+(e=Sk.builtin.asnum$(e)))/(1-e);return new Sk.builtin.float_(Math.log(t)/2)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the inverse hyperbolic tangent of x.\\\"},ceil:{$meth:function ceil(e){let t;if(e.ob$type!==i){const n=o(e,b);if(void 0!==n)return a(n);u(\\\"\\\",\\\"real number\\\",l(e)),t=Sk.builtin.asnum$(e)}else t=e.v;return new n(Math.ceil(t))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the ceiling of x as an Integral.\\\\n\\\\nThis is the smallest integer >= x.\\\"},comb:{$meth:function comb(e,t){let n=Sk.misceval.asIndexOrThrow(e),i=Sk.misceval.asIndexOrThrow(t);if(n<0)throw new Sk.builtin.ValueError(\\\"n must be an non-negative integer\\\");if(i<0)throw new Sk.builtin.ValueError(\\\"k must be a non-negative integer\\\");if(i>e)return new Sk.builtin.int_(0);e=new Sk.builtin.int_(n),t=new Sk.builtin.int_(i);let r=Sk.ffi.remapToJs(e.nb$subtract(t));if(rNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError(\\\"min(n - k, k) must not exceed \\\"+Number.MAX_SAFE_INTEGER);const u=new Sk.builtin.int_(1);let l=e;for(let o=1;o n.\\\\n\\\\nIf k is not specified or is None, then k defaults to n\\\\nand the function returns n!.\\\\n\\\\nRaises TypeError if either of the arguments are not integers.\\\\nRaises ValueError if either of the arguments are negative.\\\"},copysign:{$meth:function copysign(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(t));const n=Sk.builtin.asnum$(t),i=Sk.builtin.asnum$(e),r=get_sign(i)*get_sign(n);return new Sk.builtin.float_(i*r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return a float with the magnitude (absolute value) of x but the sign of y.\\\\n\\\\nOn platforms that support signed zeros, copysign(1.0, -0.0)\\\\nreturns -1.0.\\\\n\\\"},cos:{$meth:function cos(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.cos(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the cosine of x (measured in radians).\\\"},cosh:{$meth:function cosh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e);const t=Math.E,n=Math.pow(t,e),i=(n+1/n)/2;return new Sk.builtin.float_(i)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic cosine of x.\\\"},degrees:{$meth:function degrees(e){Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=180/Math.PI*Sk.builtin.asnum$(e);return new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Convert angle x from radians to degrees.\\\"},dist:{$meth:function dist(e){throw new Sk.builtin.NotImplementedError(\\\"math.dist() is not yet implemented in Skulpt\\\")},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, p, q, /)\\\",$doc:\\\"Return the Euclidean distance between 2 points in any dimension.\\\"},erf:{$meth:function erf(e){throw new Sk.builtin.NotImplementedError(\\\"math.erf() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Error function at x.\\\"},erfc:{$meth:function erfc(e){throw new Sk.builtin.NotImplementedError(\\\"math.erfc() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Complementary error function at x.\\\"},exp:{$meth:function exp(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));let t=e.v;if(\\\"number\\\"!=typeof t&&(t=e.nb$float().v),t==1/0||t==-1/0||isNaN(t))return new Sk.builtin.float_(Math.exp(t));const n=Math.exp(t);if(!isFinite(n))throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(n)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return e raised to the power of x.\\\"},expm1:{$meth:function expm1(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(Math.abs(t)<.7){const e=Math.exp(t);if(1==e)return new Sk.builtin.float_(t);{const n=(e-1)*t/Math.log(e);return new Sk.builtin.float_(n)}}{const e=Math.exp(t)-1;return new Sk.builtin.float_(e)}},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return exp(x)-1.\\\\n\\\\nThis function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\\\"},fabs:{$meth:function fabs(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));let t=e.v;return JSBI.__isBigInt(t)&&(t=e.nb$float().v),t=Math.abs(t),new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the absolute value of the float x.\\\"},factorial:{$meth:factorial,$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Find x!.\\\\n\\\\nRaise a ValueError if x is negative or non-integral.\\\"},floor:{$meth:function floor(e){let t;if(e.ob$type===i)t=e.v;else{const n=o(e,m);if(void 0!==n)return a(n);u(\\\"x\\\",\\\"number\\\",l(e)),t=Sk.builtin.asnum$(e)}return new n(Math.floor(t))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the floor of x as an Integral.\\\\n\\\\nThis is the largest integer <= x.\\\"},fmod:{$meth:function fmod(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if(\\\"number\\\"!=typeof n&&(n=e.nb$float().v),\\\"number\\\"!=typeof i&&(i=t.nb$float().v),(i==1/0||i==-1/0)&&isFinite(n))return new Sk.builtin.float_(n);const r=n%i;if(isNaN(r)&&!isNaN(n)&&!isNaN(i))throw new Sk.builtin.ValueError(\\\"math domain error\\\");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return fmod(x, y), according to platform C.\\\\n\\\\nx % y may differ.\\\"},frexp:{$meth:function frexp(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e),n=[t,0];if(0!==t&&Number.isFinite(t)){const e=Math.abs(t);let i=Math.max(-1023,Math.floor(Math.log2(e))+1),r=e*Math.pow(2,-i);for(;r<.5;)r*=2,i--;for(;r>=1;)r*=.5,i++;t<0&&(r=-r),n[0]=r,n[1]=i}return n[0]=new Sk.builtin.float_(n[0]),n[1]=new Sk.builtin.int_(n[1]),new Sk.builtin.tuple(n)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the mantissa and exponent of x, as pair (m, e).\\\\n\\\\nm is a float and e is an int, such that x = m * 2.**e.\\\\nIf x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.\\\"},fsum:{$meth:function fsum(e){if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError(\\\"'\\\"+Sk.abstr.typeName(e)+\\\"' object is not iterable\\\");let t,n,i,r=[];for(let l=(e=Sk.abstr.iter(e)).tp$iternext();void 0!==l;l=e.tp$iternext()){Sk.builtin.pyCheckType(\\\"\\\",\\\"real number\\\",Sk.builtin.checkNumber(l)),t=0;let e=l.v;\\\"number\\\"!=typeof e&&(e=l.nb$float().v),l=e;for(let u=0,o=r.length;u0;){n--;let t=a;a=JSBI.signedRightShift(u,JSBI.BigInt(n));const r=JSBI.subtract(JSBI.subtract(a,t),i),s=JSBI.leftShift(o,r),b=JSBI.add(JSBI.subtract(JSBI.subtract(l,t),a),i),c=JSBI.signedRightShift(e,b);o=JSBI.add(s,JSBI.divide(c,o))}let s=o;return JSBI.greaterThan(JSBI.multiply(s,s),e)&&(s=JSBI.subtract(s,i)),JSBI.lessThanOrEqual(s,JSBI.BigInt(Number.MAX_SAFE_INTEGER))&&(s=Number(s)),new Sk.builtin.int_(s)}(t)},$flags:{OneArg:!0},$textsig:\\\"($module, n, /)\\\",$doc:\\\"Return the integer part of the square root of the input.\\\"},lcm:{$meth:function lcm(...e){function abs(e){return\\\"number\\\"==typeof e?new Sk.builtin.int_(Math.abs(e)):JSBI.lessThan(e,JSBI.__ZERO)?new Sk.builtin.int_(JSBI.unaryMinus(e)):new Sk.builtin.int_(e)}const t=e.length;if(0===t)return new Sk.builtin.int_(1);let n;for(n=0;nNumber.MAX_SAFE_INTEGER?JSBI.BigInt(r):e}else r=JSBI.BigInt(r);\\\"number\\\"!=typeof r&&(i=JSBI.BigInt(i),r=JSBI.multiply(JSBI.divide(r,_gcd_internal(r,i)),i))}return abs(r)},$flags:{MinArgs:0},$textsig:\\\"($module, *integers, /)\\\",$doc:\\\"Return the least common multiple of the specified integer arguments. If all arguments are nonzero, then the returned value is the smallest positive integer that is a multiple of all arguments. If any of the arguments is zero, then the returned value is 0. lcm() without arguments returns 1.\\\"},ldexp:{$meth:function ldexp(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"i\\\",\\\"integer\\\",Sk.builtin.checkInt(t));let n=e.v;\\\"number\\\"!=typeof n&&(n=e.nb$float().v);const i=Sk.builtin.asnum$(t);if(n==1/0||n==-1/0||0==n||isNaN(n))return new Sk.builtin.float_(n);const r=n*Math.pow(2,i);if(!isFinite(r))throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, i, /)\\\",$doc:\\\"Return x * (2**i).\\\\n\\\\nThis is essentially the inverse of frexp().\\\"},lgamma:{$meth:function lgamma(e){throw new Sk.builtin.NotImplementedError(\\\"math.lgamma() is not yet implemented in Skulpt\\\")},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Natural logarithm of absolute value of Gamma function at x.\\\"},log:{$meth:function log(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));let n,i,r=Sk.builtin.asnum$(e);if(r<=0)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(void 0===t?n=Math.E:(Sk.builtin.pyCheckType(\\\"base\\\",\\\"number\\\",Sk.builtin.checkNumber(t)),n=Sk.builtin.asnum$(t)),n<=0)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(Sk.builtin.checkFloat(e)||re)return new Sk.builtin.int_(0);if(0===t)return new Sk.builtin.int_(1);if(t>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError(\\\"k must not exceed \\\"+Number.MAX_SAFE_INTEGER);const n=new Sk.builtin.int_(1);let i=e=new Sk.builtin.int_(e);for(let r=1;r n.\\\\n\\\\nIf k is not specified or is None, then k defaults to n\\\\nand the function returns n!.\\\\n\\\\nRaises TypeError if either of the arguments are not integers.\\\\nRaises ValueError if either of the arguments are negative.'\\\"},prod:{$meth:function prod(e,t){Sk.abstr.checkArgsLen(\\\"prod\\\",e,1,1),e=Sk.abstr.copyKeywordsToNamedArgs(\\\"prod\\\",[null,\\\"start\\\"],e,t,[new Sk.builtin.int_(1)]);const n=Sk.abstr.iter(e[0]);let i,r=e[1];return i=r.constructor===Sk.builtin.int_?function fastProdInt(){return Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.int_)return e.constructor===Sk.builtin.float_?(r=r.nb$float().nb$multiply(e),new Sk.misceval.Break(\\\"float\\\")):(r=Sk.abstr.numberBinOp(r,e,\\\"Mult\\\"),new Sk.misceval.Break(\\\"slow\\\"));r=r.nb$multiply(e)}))}():r.constructor===Sk.builtin.float_?\\\"float\\\":\\\"slow\\\",Sk.misceval.chain(i,(e=>\\\"float\\\"===e?function fastProdFloat(){return Sk.misceval.iterFor(n,(e=>{if(e.constructor!==Sk.builtin.float_&&e.constructor!==Sk.builtin.int_)return r=Sk.abstr.numberBinOp(r,e,\\\"Mult\\\"),new Sk.misceval.Break(\\\"slow\\\");r=r.nb$multiply(e)}))}():e),(e=>{if(\\\"slow\\\"===e)return function slowProd(){return Sk.misceval.iterFor(n,(e=>{r=Sk.abstr.numberBinOp(r,e,\\\"Mult\\\")}))}()}),(()=>r))},$flags:{FastCall:!0},$textsig:\\\"($module, iterable, /, *, start=1)\\\",$doc:\\\"Calculate the product of all the elements in the input iterable. The default start value for the product is 1.\\\\n\\\\nWhen the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types.\\\"},pow:{$meth:function pow(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if(\\\"number\\\"!=typeof n&&(n=e.nb$float().v),\\\"number\\\"!=typeof i&&(i=t.nb$float().v),0==n&&i<0)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(1==n)return new Sk.builtin.float_(1);if(Number.isFinite(n)&&Number.isFinite(i)&&n<0&&!Number.isInteger(i))throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(-1==n&&(i==-1/0||i==1/0))return new Sk.builtin.float_(1);const r=Math.pow(n,i);if(!Number.isFinite(n)||!Number.isFinite(i))return new Sk.builtin.float_(r);if(r==1/0||r==-1/0)throw new Sk.builtin.OverflowError(\\\"math range error\\\");return new Sk.builtin.float_(r)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Return x**y (x to the power of y).\\\"},radians:{$meth:function radians(e){Sk.builtin.pyCheckType(\\\"deg\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=Math.PI/180*Sk.builtin.asnum$(e);return new Sk.builtin.float_(t)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Convert angle x from degrees to radians.\\\"},remainder:{$meth:function remainder(e,t){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),Sk.builtin.pyCheckType(\\\"y\\\",\\\"number\\\",Sk.builtin.checkNumber(t));let n=e.v,i=t.v;if(\\\"number\\\"!=typeof n&&(n=e.nb$float().v),\\\"number\\\"!=typeof i&&(i=t.nb$float().v),isFinite(n)&&isFinite(i)){let e,t,r,u,l;if(0==i)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(e=Math.abs(n),t=Math.abs(i),u=e%t,r=t-u,ur)l=-r;else{if(u!=r)throw new Sk.builtin.AssertionError;l=u-.5*(e-u)%t*2}return new Sk.builtin.float_(get_sign(n)*l)}if(isNaN(n))return e;if(isNaN(i))return t;if(n==1/0||n==-1/0)throw new Sk.builtin.ValueError(\\\"math domain error\\\");if(i!=1/0&&i!=-1/0)throw new Sk.builtin.AssertionError;return new Sk.builtin.float_(n)},$flags:{MinArgs:2,MaxArgs:2},$textsig:\\\"($module, x, y, /)\\\",$doc:\\\"Difference between x and the closest integer multiple of y.\\\\n\\\\nReturn x - n*y where n*y is the closest integer multiple of y.\\\\nIn the case where x is exactly halfway between two multiples of\\\\ny, the nearest even value of n is used. The result is always exact.\\\"},sin:{$meth:function sin(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.sin(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the sine of x (measured in radians).\\\"},sinh:{$meth:function sinh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),e=Sk.builtin.asnum$(e);const t=Math.E,n=Math.pow(t,e),i=(n-1/n)/2;return new Sk.builtin.float_(i)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic sine of x.\\\"},sqrt:{$meth:function sqrt(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(t<0)throw new Sk.builtin.ValueError(\\\"math domain error\\\");return new Sk.builtin.float_(Math.sqrt(t))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the square root of x.\\\"},tan:{$meth:function tan(e){return Sk.builtin.pyCheckType(\\\"rad\\\",\\\"number\\\",Sk.builtin.checkNumber(e)),new Sk.builtin.float_(Math.tan(Sk.builtin.asnum$(e)))},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the tangent of x (measured in radians).\\\"},tanh:{$meth:function tanh(e){Sk.builtin.pyCheckType(\\\"x\\\",\\\"number\\\",Sk.builtin.checkNumber(e));const t=Sk.builtin.asnum$(e);if(0===t)return new Sk.builtin.float_(t);const n=Math.E,i=Math.pow(n,t),r=1/i,u=(i-r)/2/((i+r)/2);return new Sk.builtin.float_(u)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Return the hyperbolic tangent of x.\\\"},trunc:{$meth:function trunc(e){if(e.ob$type===i)return e.nb$int();const n=o(e,t.$trunc);if(void 0===n)throw new r(`type ${e.tp$name} doesn't define __trunc__ method`);return a(n)},$flags:{OneArg:!0},$textsig:\\\"($module, x, /)\\\",$doc:\\\"Truncates the Real x to the nearest Integral toward 0.\\\\n\\\\nUses the __trunc__ magic method.\\\"}}),s};\",\"src/lib/operator.js\":\"function $builtinmodule(e){const{builtin:{str:t,tuple:a,list:r,int_:o,bool:n,TypeError:s,ValueError:i,none:{none$:m},NotImplemented:{NotImplemented$:d},abs:l,len:h,checkString:u,checkInt:c},abstr:{buildNativeClass:M,checkNoKwargs:b,checkArgsLen:g,checkOneArg:f,numberUnaryOp:p,numberBinOp:A,numberInplaceBinOp:k,objectGetItem:$,objectDelItem:_,objectSetItem:w,sequenceConcat:v,sequenceContains:x,sequenceGetCountOf:j,sequenceGetIndexOf:O,sequenceInPlaceConcat:I,typeName:S,lookupSpecial:y,gattr:q,setUpModuleMethods:R},misceval:{richCompareBool:B,asIndexOrThrow:N,chain:E,callsimArray:T,callsimOrSuspendArray:C,objectRepr:D},generic:{getAttr:G}}=Sk,L=[\\\"abs\\\",\\\"add\\\",\\\"and_\\\",\\\"concat\\\",\\\"contains\\\",\\\"delitem\\\",\\\"eq\\\",\\\"floordiv\\\",\\\"ge\\\",\\\"getitem\\\",\\\"gt\\\",\\\"iadd\\\",\\\"iand\\\",\\\"iconcat\\\",\\\"ifloordiv\\\",\\\"ilshift\\\",\\\"imatmul\\\",\\\"imod\\\",\\\"imul\\\",\\\"index\\\",\\\"inv\\\",\\\"invert\\\",\\\"ior\\\",\\\"ipow\\\",\\\"irshift\\\",\\\"isub\\\",\\\"itruediv\\\",\\\"ixor\\\",\\\"le\\\",\\\"lshift\\\",\\\"lt\\\",\\\"matmul\\\",\\\"mod\\\",\\\"mul\\\",\\\"ne\\\",\\\"neg\\\",\\\"not_\\\",\\\"or_\\\",\\\"pos\\\",\\\"pow\\\",\\\"rshift\\\",\\\"setitem\\\",\\\"sub\\\",\\\"truediv\\\",\\\"xor\\\"],F=[\\\"attrgetter\\\",\\\"countOf\\\",\\\"indexOf\\\",\\\"is_\\\",\\\"is_not\\\",\\\"itemgetter\\\",\\\"length_hint\\\",\\\"methodcaller\\\",\\\"truth\\\",...L].sort(),P={__name__:new t(\\\"operator\\\"),__doc__:new t(\\\"Operator interface.\\\\n\\\\nThis module exports a set of functions implemented in javascript corresponding\\\\nto the intrinsic operators of Python. For example, operator.add(x, y)\\\\nis equivalent to the expression x+y. The function names are those\\\\nused for special methods; variants without leading and trailing\\\\n'__' are also provided for convenience.\\\"),__all__:new r(F.map((e=>new t(e))))};P.itemgetter=M(\\\"operator.itemgetter\\\",{constructor:function itemgetter(e){this.items=e,this.oneitem=1===e.length,this.item=e[0],this.in$repr=!1},slots:{tp$getattr:G,tp$new:(e,t)=>(b(\\\"itemgetter\\\",t),g(\\\"itemgetter\\\",e,1),new P.itemgetter(e)),tp$call(e,t){f(\\\"itemgetter\\\",e,t);const r=e[0];return this.oneitem?$(r,this.item,!0):new a(this.items.map((e=>$(r,e))))},tp$doc:\\\"Return a callable object that fetches the given item(s) from its operand.\\\\n After f = itemgetter(2), the call f(r) returns r[2].\\\\n After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])\\\",$r(){if(this.in$repr)return new t(this.tp$name+\\\"(...)\\\");this.in$repr=!0;const e=this.tp$name+\\\"(\\\"+this.items.map((e=>D(e))).join(\\\", \\\")+\\\")\\\";return this.in$repr=!1,e}}}),P.attrgetter=M(\\\"operator.attrgetter\\\",{constructor:function attrgetter(e){this.attrs=e,this.oneattr=1===e.length,this.attr=e[0],this.in$repr=!1},slots:{tp$getattr:G,tp$new(e,a){b(\\\"attrgetter\\\",a),g(\\\"attrgetter\\\",e,1);const r=[];for(let o=0;onew t(e)))):r.push([a])}return new P.attrgetter(r)},tp$call(e,t){f(\\\"attrgetter\\\",e,t);const r=e[0];if(this.oneattr)return this.attr.reduce(((e,t)=>q(e,t)),r);const o=this.attrs.map((e=>e.reduce(((e,t)=>q(e,t)),r)));return new a(o)},tp$doc:\\\"attrgetter(attr, ...) --\\\\x3e attrgetter object\\\\n\\\\nReturn a callable object that fetches the given attribute(s) from its operand.\\\\nAfter f = attrgetter('name'), the call f(r) returns r.name.\\\\nAfter g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\\\\nAfter h = attrgetter('name.first', 'name.last'), the call h(r) returns\\\\n(r.name.first, r.name.last).\\\",$r(){if(this.in$repr)return new t(this.tp$name+\\\"(...)\\\");this.in$repr=!0;const e=this.tp$name+\\\"(\\\"+this.items.map((e=>D(e))).join(\\\", \\\")+\\\")\\\";return this.in$repr=!1,e}}}),P.methodcaller=M(\\\"operator.methodcaller\\\",{constructor:function methodcaller(e,t,a){this.$name=e,this.args=t,this.kwargs=a||[],this.in$repr=!1},slots:{tp$getattr:G,tp$new(e,t){g(\\\"methodcaller\\\",e,1);const a=e[0];if(!u(a))throw new s(\\\"method name must be a string\\\");return new P.methodcaller(a,e.slice(1),t)},tp$call(e,t){f(\\\"methodcaller\\\",e,t);const a=e[0];return E(q(a,this.$name,!0),(e=>C(e,this.args,this.kwargs)))},tp$doc:\\\"methodcaller(name, ...) --\\\\x3e methodcaller object\\\\n\\\\nReturn a callable object that calls the given method on its operand.\\\\nAfter f = methodcaller('name'), the call f(r) returns r.name().\\\\nAfter g = methodcaller('name', 'date', foo=1), the call g(r) returns\\\\nr.name('date', foo=1).\\\",$r(){if(this.in$repr)return new t(this.tp$name+\\\"(...)\\\");this.in$repr=!0;let e=[D(this.$name)];e.push(...this.args.map((e=>D(e))));for(let t=0;tn(B(e,t,\\\"Lt\\\"))),sameAs(\\\"a < b\\\")),le:makeModuleMethod(((e,t)=>n(B(e,t,\\\"LtE\\\"))),sameAs(\\\"a <= b\\\")),eq:makeModuleMethod(((e,t)=>n(B(e,t,\\\"Eq\\\"))),sameAs(\\\"a == b\\\")),ne:makeModuleMethod(((e,t)=>n(B(e,t,\\\"NotEq\\\"))),sameAs(\\\"a != b\\\")),ge:makeModuleMethod(((e,t)=>n(B(e,t,\\\"GtE\\\"))),sameAs(\\\"a >= b\\\")),gt:makeModuleMethod(((e,t)=>n(B(e,t,\\\"Gt\\\"))),sameAs(\\\"a > b\\\")),not_:makeModuleMethod((e=>p(e,\\\"Not\\\")),sameAs(\\\"not a\\\")),truth:makeModuleMethod((e=>n(e)),\\\"Return True if a is true, False otherwise.\\\"),is_:makeModuleMethod(((e,t)=>n(B(e,t,\\\"Is\\\"))),sameAs(\\\"a is b\\\")),is_not:makeModuleMethod(((e,t)=>n(B(e,t,\\\"IsNot\\\"))),sameAs(\\\"a is not b\\\")),abs:makeModuleMethod((e=>l(e)),sameAs(\\\"abs(a)\\\")),add:makeModuleMethod(((e,t)=>A(e,t,\\\"Add\\\")),sameAs(\\\"a + b\\\")),and_:makeModuleMethod(((e,t)=>A(e,t,\\\"BitAnd\\\")),sameAs(\\\"a & b\\\")),floordiv:makeModuleMethod(((e,t)=>A(e,t,\\\"FloorDiv\\\")),sameAs(\\\"a // b\\\")),index:makeModuleMethod((e=>new o(N(e))),sameAs(\\\"a.__index__()\\\")),inv:makeModuleMethod((e=>p(e,\\\"Invert\\\")),sameAs(\\\"~a\\\")),invert:makeModuleMethod((e=>p(e,\\\"Invert\\\")),sameAs(\\\"~a\\\")),lshift:makeModuleMethod(((e,t)=>A(e,t,\\\"LShift\\\")),sameAs(\\\"a << b\\\")),mod:makeModuleMethod(((e,t)=>A(e,t,\\\"Mod\\\")),sameAs(\\\"a % b\\\")),mul:makeModuleMethod(((e,t)=>A(e,t,\\\"Mult\\\")),sameAs(\\\"a * b\\\")),matmul:makeModuleMethod(((e,t)=>A(e,t,\\\"MatMult\\\")),sameAs(\\\"a @ b\\\")),neg:makeModuleMethod((e=>p(e,\\\"USub\\\")),sameAs(\\\"-a\\\")),or_:makeModuleMethod(((e,t)=>A(e,t,\\\"BitOr\\\")),sameAs(\\\"a | b\\\")),pos:makeModuleMethod((e=>p(e,\\\"UAdd\\\")),sameAs(\\\"+a\\\")),pow:makeModuleMethod(((e,t)=>A(e,t,\\\"Pow\\\")),sameAs(\\\"a ** b\\\")),rshift:makeModuleMethod(((e,t)=>A(e,t,\\\"RShift\\\")),sameAs(\\\"a >> b\\\")),sub:makeModuleMethod(((e,t)=>A(e,t,\\\"Sub\\\")),sameAs(\\\"a - b\\\")),truediv:makeModuleMethod(((e,t)=>A(e,t,\\\"Div\\\")),sameAs(\\\"a / b\\\")),xor:makeModuleMethod(((e,t)=>A(e,t,\\\"BitXor\\\")),sameAs(\\\"a ^ b\\\")),concat:makeModuleMethod(((e,t)=>v(e,t)),sameAs(\\\"a + b, for a and b sequences\\\")),contains:makeModuleMethod(((e,t)=>E(x(e,t),n)),sameAs(\\\"b in a (note reversed operands)\\\")),countOf:makeModuleMethod(((e,t)=>j(e,t)),\\\"Return thenumber of times b occurs in a.\\\"),delitem:makeModuleMethod(((e,t)=>E(_(e,t,!0),(()=>m))),sameAs(\\\"del a[b]\\\")),getitem:makeModuleMethod(((e,t)=>$(e,t,!0)),sameAs(\\\"a[b]\\\")),indexOf:makeModuleMethod(((e,t)=>O(e,t)),\\\"Return the first index of b in a\\\"),setitem:makeModuleMethod(((e,t,a)=>E(w(e,t,a,!0),(()=>m))),sameAs(\\\"a[b] = c\\\")),length_hint:{$meth:function length_hint(e,a){if(void 0===a)a=new o(0);else if(!c(a))throw new s(\\\"'\\\"+S(a)+\\\"' object cannot be interpreted as an integer\\\");try{return h(e)}catch(m){if(!(m instanceof s))throw m}const r=y(e,t.$length_hint);if(void 0===r)return a;let n;try{n=T(r,[])}catch(m){if(!(m instanceof s))throw m;return a}if(n===d)return a;if(!c(n))throw new s(\\\"__length_hint__ must be an integer, not \\\"+S(n));if(n.nb$isnegative())throw new i(\\\"__length_hint__() should return >= 0\\\");return n},$flags:{MinArgs:1,MaxArgs:2},$textsig:\\\"($module, obj, default=0, /)\\\",$doc:\\\"Return an estimate of the number of items in obj.\\\\n\\\\nThis is useful for presizing containers when building from an iterable.\\\\n\\\\nIf the object supports len(), the result will be exact.\\\\nOtherwise, it may over- or under-estimate by an arbitrary amount.\\\\nThe result will be an integer >= 0.\\\"},iadd:makeModuleMethod(((e,t)=>k(e,t,\\\"Add\\\")),sameAs(\\\"a += b\\\")),iand:makeModuleMethod(((e,t)=>k(e,t,\\\"BitAnd\\\")),sameAs(\\\"a &= b\\\")),iconcat:makeModuleMethod(((e,t)=>I(e,t)),sameAs(\\\"a += b, for a and b sequences\\\")),ifloordiv:makeModuleMethod(((e,t)=>k(e,t,\\\"FloorDiv\\\")),sameAs(\\\"a //= b\\\")),ilshift:makeModuleMethod(((e,t)=>k(e,t,\\\"LShift\\\")),sameAs(\\\"a <<= b\\\")),imod:makeModuleMethod(((e,t)=>k(e,t,\\\"Mod\\\")),sameAs(\\\"a %= b\\\")),imul:makeModuleMethod(((e,t)=>k(e,t,\\\"Mult\\\")),sameAs(\\\"a *= b\\\")),imatmul:makeModuleMethod(((e,t)=>k(e,t,\\\"MatMult\\\")),sameAs(\\\"a @= b\\\")),ior:makeModuleMethod(((e,t)=>k(e,t,\\\"BitOr\\\")),sameAs(\\\"a |= b\\\")),ipow:makeModuleMethod(((e,t)=>k(e,t,\\\"Pow\\\")),sameAs(\\\"a **= b\\\")),irshift:makeModuleMethod(((e,t)=>k(e,t,\\\"RShift\\\")),sameAs(\\\"a >>= b\\\")),isub:makeModuleMethod(((e,t)=>k(e,t,\\\"Sub\\\")),sameAs(\\\"a -= b\\\")),itruediv:makeModuleMethod(((e,t)=>k(e,t,\\\"Div\\\")),sameAs(\\\"a /= b\\\")),ixor:makeModuleMethod(((e,t)=>k(e,t,\\\"BitXor\\\")),sameAs(\\\"a ^= b\\\"))}),L.forEach((e=>{P[`__${e.replace(\\\"_\\\",\\\"\\\")}__`]=P[e]})),P.div=P.truediv,P.__div__=P.div,P}\",\"src/lib/platform.js\":\"var $builtinmodule=function(n){var e={},i=\\\"undefined\\\"!=typeof window&&\\\"undefined\\\"!=typeof window.navigator;return e.python_implementation=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"python_implementation\\\",arguments.length,0,0),new Sk.builtin.str(\\\"Skulpt\\\")})),e.node=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"node\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")})),e.version=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"version\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")})),e.python_version=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen(\\\"python_version\\\",arguments.length,0,0),n=Sk.__future__.python_version?\\\"3.2.0\\\":\\\"2.7.0\\\",new Sk.builtin.str(n)})),e.system=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen(\\\"system\\\",arguments.length,0,0),n=i?window.navigator.appCodeName:\\\"\\\",new Sk.builtin.str(n)})),e.machine=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen(\\\"machine\\\",arguments.length,0,0),n=i?window.navigator.platform:\\\"\\\",new Sk.builtin.str(n)})),e.release=new Sk.builtin.func((function(){var n;return Sk.builtin.pyCheckArgsLen(\\\"release\\\",arguments.length,0,0),n=i?window.navigator.appVersion:\\\"\\\",new Sk.builtin.str(n)})),e.architecture=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"architecture\\\",arguments.length,0,0),new Sk.builtin.tuple([new Sk.builtin.str(\\\"64bit\\\"),new Sk.builtin.str(\\\"\\\")])})),e.processor=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"processor\\\",arguments.length,0,0),new Sk.builtin.str(\\\"\\\")})),e};\",\"src/lib/processing.js\":\"var $builtinmodule=function(n){var i,e,t,u,o,s,l,c={__name__:new Sk.builtin.str(\\\"processing\\\")},r=[],v=!0,f=null;c.processing=null,c.p=null,c.X=new Sk.builtin.int_(0),c.Y=new Sk.builtin.int_(1),c.Z=new Sk.builtin.int_(2),c.R=new Sk.builtin.int_(3),c.G=new Sk.builtin.int_(4),c.B=new Sk.builtin.int_(5),c.A=new Sk.builtin.int_(6),c.U=new Sk.builtin.int_(7),c.V=new Sk.builtin.int_(8),c.NX=new Sk.builtin.int_(9),c.NY=new Sk.builtin.int_(10),c.NZ=new Sk.builtin.int_(11),c.EDGE=new Sk.builtin.int_(12),c.SR=new Sk.builtin.int_(13),c.SG=new Sk.builtin.int_(14),c.SB=new Sk.builtin.int_(15),c.SA=new Sk.builtin.int_(16),c.SW=new Sk.builtin.int_(17),c.TX=new Sk.builtin.int_(18),c.TY=new Sk.builtin.int_(19),c.TZ=new Sk.builtin.int_(20),c.VX=new Sk.builtin.int_(21),c.VY=new Sk.builtin.int_(22),c.VZ=new Sk.builtin.int_(23),c.VW=new Sk.builtin.int_(24),c.AR=new Sk.builtin.int_(25),c.AG=new Sk.builtin.int_(26),c.AB=new Sk.builtin.int_(27),c.DR=new Sk.builtin.int_(3),c.DG=new Sk.builtin.int_(4),c.DB=new Sk.builtin.int_(5),c.DA=new Sk.builtin.int_(6),c.SPR=new Sk.builtin.int_(28),c.SPG=new Sk.builtin.int_(29),c.SPB=new Sk.builtin.int_(30),c.SHINE=new Sk.builtin.int_(31),c.ER=new Sk.builtin.int_(32),c.EG=new Sk.builtin.int_(33),c.EB=new Sk.builtin.int_(34),c.BEEN_LIT=new Sk.builtin.int_(35),c.VERTEX_FIELD_COUNT=new Sk.builtin.int_(36),c.CENTER=new Sk.builtin.int_(3),c.RADIUS=new Sk.builtin.int_(2),c.CORNERS=new Sk.builtin.int_(1),c.CORNER=new Sk.builtin.int_(0),c.DIAMETER=new Sk.builtin.int_(3),c.BASELINE=new Sk.builtin.int_(0),c.TOP=new Sk.builtin.int_(101),c.BOTTOM=new Sk.builtin.int_(102),c.NORMAL=new Sk.builtin.int_(1),c.NORMALIZED=new Sk.builtin.int_(1),c.IMAGE=new Sk.builtin.int_(2),c.MODEL=new Sk.builtin.int_(4),c.SHAPE=new Sk.builtin.int_(5),c.AMBIENT=new Sk.builtin.int_(0),c.DIRECTIONAL=new Sk.builtin.int_(1),c.SPOT=new Sk.builtin.int_(3),c.RGB=new Sk.builtin.int_(1),c.ARGB=new Sk.builtin.int_(2),c.HSB=new Sk.builtin.int_(3),c.ALPHA=new Sk.builtin.int_(4),c.CMYK=new Sk.builtin.int_(5),c.TIFF=new Sk.builtin.int_(0),c.TARGA=new Sk.builtin.int_(1),c.JPEG=new Sk.builtin.int_(2),c.GIF=new Sk.builtin.int_(3),c.MITER=new Sk.builtin.str(\\\"miter\\\"),c.BEVEL=new Sk.builtin.str(\\\"bevel\\\"),c.ROUND=new Sk.builtin.str(\\\"round\\\"),c.SQUARE=new Sk.builtin.str(\\\"butt\\\"),c.PROJECT=new Sk.builtin.str(\\\"square\\\"),c.P2D=new Sk.builtin.int_(1),c.JAVA2D=new Sk.builtin.int_(1),c.WEBGL=new Sk.builtin.int_(2),c.P3D=new Sk.builtin.int_(2),c.OPENGL=new Sk.builtin.int_(2),c.PDF=new Sk.builtin.int_(0),c.DXF=new Sk.builtin.int_(0),c.OTHER=new Sk.builtin.int_(0),c.WINDOWS=new Sk.builtin.int_(1),c.MAXOSX=new Sk.builtin.int_(2),c.LINUX=new Sk.builtin.int_(3),c.EPSILON=new Sk.builtin.float_(1e-4),c.MAX_FLOAT=new Sk.builtin.float_(34028235e31),c.MIN_FLOAT=new Sk.builtin.float_(-34028235e31),c.MAX_INT=new Sk.builtin.int_(2147483647),c.MIN_INT=new Sk.builtin.int_(-2147483648),c.HALF_PI=new Sk.builtin.float_(Math.PI/2),c.THIRD_PI=new Sk.builtin.float_(Math.PI/3),c.PI=new Sk.builtin.float_(Math.PI),c.TWO_PI=new Sk.builtin.float_(2*Math.PI),c.TAU=new Sk.builtin.float_(2*Math.PI),c.QUARTER_PI=new Sk.builtin.float_(Math.PI/4),c.DEG_TO_RAD=new Sk.builtin.float_(Math.PI/180),c.RAD_TO_DEG=new Sk.builtin.float_(180/Math.PI),c.WHITESPACE=new Sk.builtin.str(\\\" \\\\t\\\\n\\\\r\\\\f \\\"),c.POINT=new Sk.builtin.int_(2),c.POINTS=new Sk.builtin.int_(2),c.LINE=new Sk.builtin.int_(4),c.LINES=new Sk.builtin.int_(4),c.TRIANGLE=new Sk.builtin.int_(8),c.TRIANGLES=new Sk.builtin.int_(9),c.TRIANGLE_FAN=new Sk.builtin.int_(11),c.TRIANGLE_STRIP=new Sk.builtin.int_(10),c.QUAD=new Sk.builtin.int_(16),c.QUADS=new Sk.builtin.int_(16),c.QUAD_STRIP=new Sk.builtin.int_(17),c.POLYGON=new Sk.builtin.int_(20),c.PATH=new Sk.builtin.int_(21),c.RECT=new Sk.builtin.int_(30),c.ELLIPSE=new Sk.builtin.int_(31),c.ARC=new Sk.builtin.int_(32),c.SPHERE=new Sk.builtin.int_(40),c.BOX=new Sk.builtin.int_(41),c.GROUP=new Sk.builtin.int_(0),c.PRIMITIVE=new Sk.builtin.int_(1),c.GEOMETRY=new Sk.builtin.int_(3),c.VERTEX=new Sk.builtin.int_(0),c.BEZIER_VERTEX=new Sk.builtin.int_(1),c.CURVE_VERTEX=new Sk.builtin.int_(2),c.BREAK=new Sk.builtin.int_(3),c.CLOSESHAPE=new Sk.builtin.int_(4),c.REPLACE=new Sk.builtin.int_(0),c.BLEND=new Sk.builtin.int_(1),c.ADD=new Sk.builtin.int_(2),c.SUBTRACT=new Sk.builtin.int_(4),c.LIGHTEST=new Sk.builtin.int_(8),c.DARKEST=new Sk.builtin.int_(16),c.DIFFERENCE=new Sk.builtin.int_(32),c.EXCLUSION=new Sk.builtin.int_(64),c.MULTIPLY=new Sk.builtin.int_(128),c.SCREEN=new Sk.builtin.int_(256),c.OVERLAY=new Sk.builtin.int_(512),c.HARD_LIGHT=new Sk.builtin.int_(1024),c.SOFT_LIGHT=new Sk.builtin.int_(2048),c.DODGE=new Sk.builtin.int_(4096),c.BURN=new Sk.builtin.int_(8192),c.ALPHA_MASK=new Sk.builtin.int_(4278190080),c.RED_MASK=new Sk.builtin.int_(16711680),c.GREEN_MASK=new Sk.builtin.int_(65280),c.BLUE_MASK=new Sk.builtin.int_(255),c.CUSTOM=new Sk.builtin.int_(0),c.ORTHOGRAPHIC=new Sk.builtin.int_(2),c.PERSPECTIVE=new Sk.builtin.int_(3),c.ARROW=new Sk.builtin.str(\\\"default\\\"),c.CROSS=new Sk.builtin.str(\\\"crosshair\\\"),c.HAND=new Sk.builtin.str(\\\"pointer\\\"),c.MOVE=new Sk.builtin.str(\\\"move\\\"),c.TEXT=new Sk.builtin.str(\\\"text\\\"),c.WAIT=new Sk.builtin.str(\\\"wait\\\"),c.NOCURSOR=Sk.builtin.assk$(\\\"url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto\\\"),c.DISABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(1),c.ENABLE_OPENGL_2X_SMOOTH=new Sk.builtin.int_(-1),c.ENABLE_OPENGL_4X_SMOOTH=new Sk.builtin.int_(2),c.ENABLE_NATIVE_FONTS=new Sk.builtin.int_(3),c.DISABLE_DEPTH_TEST=new Sk.builtin.int_(4),c.ENABLE_DEPTH_TEST=new Sk.builtin.int_(-4),c.ENABLE_DEPTH_SORT=new Sk.builtin.int_(5),c.DISABLE_DEPTH_SORT=new Sk.builtin.int_(-5),c.DISABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(6),c.ENABLE_OPENGL_ERROR_REPORT=new Sk.builtin.int_(-6),c.ENABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(7),c.DISABLE_ACCURATE_TEXTURES=new Sk.builtin.int_(-7),c.HINT_COUNT=new Sk.builtin.int_(10),c.OPEN=new Sk.builtin.int_(1),c.CLOSE=new Sk.builtin.int_(2),c.BLUR=new Sk.builtin.int_(11),c.GRAY=new Sk.builtin.int_(12),c.INVERT=new Sk.builtin.int_(13),c.OPAQUE=new Sk.builtin.int_(14),c.POSTERIZE=new Sk.builtin.int_(15),c.THRESHOLD=new Sk.builtin.int_(16),c.ERODE=new Sk.builtin.int_(17),c.DILATE=new Sk.builtin.int_(18),c.BACKSPACE=new Sk.builtin.int_(8),c.TAB=new Sk.builtin.int_(9),c.ENTER=new Sk.builtin.int_(10),c.RETURN=new Sk.builtin.int_(13),c.ESC=new Sk.builtin.int_(27),c.DELETE=new Sk.builtin.int_(127),c.CODED=new Sk.builtin.int_(65535),c.SHIFT=new Sk.builtin.int_(16),c.CONTROL=new Sk.builtin.int_(17),c.ALT=new Sk.builtin.int_(18),c.CAPSLK=new Sk.builtin.int_(20),c.PGUP=new Sk.builtin.int_(33),c.PGDN=new Sk.builtin.int_(34),c.END=new Sk.builtin.int_(35),c.HOME=new Sk.builtin.int_(36),c.LEFT=new Sk.builtin.int_(37),c.UP=new Sk.builtin.int_(38),c.RIGHT=new Sk.builtin.int_(39),c.DOWN=new Sk.builtin.int_(40),c.F1=new Sk.builtin.int_(112),c.F2=new Sk.builtin.int_(113),c.F3=new Sk.builtin.int_(114),c.F4=new Sk.builtin.int_(115),c.F5=new Sk.builtin.int_(116),c.F6=new Sk.builtin.int_(117),c.F7=new Sk.builtin.int_(118),c.F8=new Sk.builtin.int_(119),c.F9=new Sk.builtin.int_(120),c.F10=new Sk.builtin.int_(121),c.F11=new Sk.builtin.int_(122),c.F12=new Sk.builtin.int_(123),c.NUMLK=new Sk.builtin.int_(144),c.META=new Sk.builtin.int_(157),c.INSERT=new Sk.builtin.int_(155),c.SINCOS_LENGTH=new Sk.builtin.int_(720),c.PRECISIONB=new Sk.builtin.int_(15),c.PRECISIONF=new Sk.builtin.int_(32768),c.PREC_MAXVAL=new Sk.builtin.int_(32767),c.PREC_ALPHA_SHIFT=new Sk.builtin.int_(9),c.PREC_RED_SHIFT=new Sk.builtin.int_(1),c.NORMAL_MODE_AUTO=new Sk.builtin.int_(0),c.NORMAL_MODE_SHAPE=new Sk.builtin.int_(1),c.NORMAL_MODE_VERTEX=new Sk.builtin.int_(2),c.MAX_LIGHTS=new Sk.builtin.int_(8),c.line=new Sk.builtin.func((function(n,i,e,t){c.processing.line(n.v,i.v,e.v,t.v)})),c.ellipse=new Sk.builtin.func((function(n,i,e,t){c.processing.ellipse(n.v,i.v,e.v,t.v)})),c.circle=new Sk.builtin.func((function(n,i,e){c.processing.ellipse(n.v,i.v,e.v,e.v)})),c.text=new Sk.builtin.func((function(n,i,e){c.processing.text(n.v,i.v,e.v)})),c.point=new Sk.builtin.func((function(n,i){c.processing.point(n.v,i.v)})),c.arc=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.arc(n.v,i.v,e.v,t.v,u.v,o.v)})),c.quad=new Sk.builtin.func((function(n,i,e,t,u,o,s,l){c.processing.quad(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v)})),c.rect=new Sk.builtin.func((function(n,i,e,t,u){\\\"undefined\\\"==typeof u?c.processing.rect(n.v,i.v,e.v,t.v):c.processing.rect(n.v,i.v,e.v,t.v,u.v)})),c.triangle=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.triangle(n.v,i.v,e.v,t.v,u.v,o.v)})),c.bezier=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v,f,S){\\\"undefined\\\"==typeof r?c.processing.bezier(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.bezier(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v,S.v)})),c.alpha=new Sk.builtin.func((function(n,i,e){return\\\"undefined\\\"==typeof i?new Sk.builtin.float_(c.processing.alpha(n.v)):\\\"undefined\\\"==typeof e?new Sk.builtin.float_(c.processing.alpha(n.v,i.v)):new Sk.builtin.float_(c.processing.alpha(n.v,i.v,e.v))})),c.ambient=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof i?c.processing.ambient(n.v):\\\"undefined\\\"==typeof e?c.processing.ambient(n.v,i.v):c.processing.ambient(n.v,i.v,e.v)})),c.ambientLight=new Sk.builtin.func((function(n,i,e,t,u,o){\\\"undefined\\\"==typeof t?c.processing.ambientLight(n.v,i.v,e.v):\\\"undefined\\\"==typeof u?c.processing.ambientLight(n.v,i.v,e.v,t.v):\\\"undefined\\\"==typeof o?c.processing.ambientLight(n.v,i.v,e.v,t.v,u.v):c.processing.ambientLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.beginCamera=new Sk.builtin.func((function(){c.processing.beginCamera()})),c.beginShape=new Sk.builtin.func((function(n){\\\"undefined\\\"==typeof n&&(n=c.POLYGON),c.processing.beginShape(n.v)})),c.bezierDetail=new Sk.builtin.func((function(n){n=\\\"undefined\\\"!=typeof n?n.v:20,c.processing.bezierDetail(n)})),c.bezierPoint=new Sk.builtin.func((function(n,i,e,t,u){c.processing.bezierPoint(n.v,i.v,e.v,t.v,u.v)})),c.bezierTangent=new Sk.builtin.func((function(n,i,e,t,u){c.processing.bezierTangent(n.v,i.v,e.v,t.v,u.v)})),c.bezierVertex=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){\\\"undefined\\\"==typeof s?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v):\\\"undefined\\\"==typeof l?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v):\\\"undefined\\\"==typeof r?c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.bezierVertex(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.blend=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v){n instanceof Sk.builtin.int_||n instanceof Sk.builtin.float_?c.processing.blend(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v):c.processing.blend(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v)})),c.blendColor=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return t.v=c.processing.blendColor(n.v,i.v,e.v),t})),c.brightness=new Sk.builtin.func((function(n,i,e){return\\\"undefined\\\"==typeof i?new Sk.builtin.float_(c.processing.brightness(n.v)):\\\"undefined\\\"==typeof e?new Sk.builtin.float_(c.processing.brightness(n.v,i.v)):new Sk.builtin.float_(c.processing.brightness(n.v,i.v,e.v))})),c.camera=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){\\\"undefined\\\"==typeof n?c.processing.camera():c.processing.camera(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.constrain=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.constrain(n.v,i.v,e.v))})),c.copy=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r){n instanceof Sk.builtin.int_||n instanceof Sk.builtin.float_?c.processing.copy(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):c.processing.copy(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v)})),c.createFont=new Sk.builtin.func((function(n,i,e,t){var u=Sk.misceval.callsimArray(c.PFont);return u.v=\\\"undefined\\\"==typeof e?c.processing.createFont(n.v,i.v):\\\"undefined\\\"==typeof t?c.processing.createFont(n.v,i.v,e.v):c.processing.createFont(n.v,i.v,e.v,t.v),u})),c.createGraphics=new Sk.builtin.func((function(n,i,e,t){var u=Sk.misceval.callsimArray(c.PGraphics);return u.v=\\\"undefined\\\"==typeof t?c.processing.createGraphics(n.v,i.v,e.v):c.processing.createGraphics(n.v,i.v,e.v,t.v),u})),c.createImage=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.PImage);return t.v=c.processing.createImage(n.v,i.v,e.v),t})),c.cursor=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof n?c.processing.cursor():\\\"undefined\\\"==typeof i?c.processing.cursor(n.v):\\\"undefined\\\"==typeof e?c.processing.cursor(n.v,i.v):c.processing.cursor(n.v,i.v,e.v)})),c.curve=new Sk.builtin.func((function(n,i,e,t,u,o,s,l,r,v,f,S){\\\"undefined\\\"==typeof r?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v):\\\"undefined\\\"==typeof v?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v):\\\"undefined\\\"==typeof f?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v):\\\"undefined\\\"==typeof S?c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v):c.processing.curve(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v,r.v,v.v,f.v,S.v)})),c.curveDetail=new Sk.builtin.func((function(n){c.processing.curveDetail(n.v)})),c.curvePoint=new Sk.builtin.func((function(n,i,e,t,u){c.processing.curvePoint(n.v,i.v,e.v,t.v,u.v)})),c.curveTangent=new Sk.builtin.func((function(n,i,e,t,u){c.processing.curveTangent(n.v,i.v,e.v,t.v,u.v)})),c.curveTightness=new Sk.builtin.func((function(n){c.processing.curveTightness(n.v)})),c.curveVertex=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof e?c.processing.curveVertex(n.v,i.v):c.processing.curveVertex(n.v,i.v,e.v)})),c.day=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.day())})),c.degrees=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.degrees(n.v))})),c.directionalLight=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.directionalLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.dist=new Sk.builtin.func((function(n,i,e,t,u,o){return\\\"undefined\\\"==typeof u?new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v)):\\\"undefined\\\"==typeof o?new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v,u.v)):new Sk.builtin.float_(c.processing.dist(n.v,i.v,e.v,t.v,u.v,o.v))})),c.emissive=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof i?c.processing.emissive(n.v):\\\"undefined\\\"==typeof e?c.processing.emissive(n.v,i.v):c.processing.emissive(n.v,i.v,e.v)})),c.endCamera=new Sk.builtin.func((function(){c.processing.endCamera()})),c.endShape=new Sk.builtin.func((function(n){\\\"undefined\\\"==typeof n?c.processing.endShape():c.processing.endShape(n.v)})),c.filter=new Sk.builtin.func((function(n,i){\\\"undefined\\\"==typeof i?c.processing.filter(n.v):c.processing.filter(n.v,i.v)})),c.frustum=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.frustum(n,i,e,t,u,o)})),c.hint=new Sk.builtin.func((function(n){c.processing.hint(n)})),c.hour=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.hour())})),c.hue=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.hue(n.v))})),c.imageMode=new Sk.builtin.func((function(n){c.processing.imageMode(n.v)})),c.lerp=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.lerp(n.v,i.v,e.v))})),c.lerpColor=new Sk.builtin.func((function(n,i,e){var t=Sk.misceval.callsimArray(c.color,[new Sk.builtin.int_(0),new Sk.builtin.int_(0),new Sk.builtin.int_(0)]);return t.v=c.processing.lerpColor(n.v,i.v,e.v),t})),c.lightFalloff=new Sk.builtin.func((function(n,i,e){c.processing.lightFalloff(n.v,i.v,e.v)})),c.lights=new Sk.builtin.func((function(){c.processing.lights()})),c.lightSpecular=new Sk.builtin.func((function(n,i,e){c.processing.lightSpecular(n.v,i.v,e.v)})),c.loadBytes=new Sk.builtin.func((function(n){return new Sk.builtin.list(c.processing.loadBytes(n.v))})),c.loadFont=new Sk.builtin.func((function(n){var i=Sk.misceval.callsimArray(c.PFont);return i.v=c.processing.loadFont(n.v),i})),c.loadShape=new Sk.builtin.func((function(n){return Sk.misceval.callsimArray(c.PShapeSVG,[new Sk.builtin.str(\\\"string\\\"),n])})),c.loadStrings=new Sk.builtin.func((function(n){return new Sk.builtin.list(c.processing.loadStrings(n.v))})),c.mag=new Sk.builtin.func((function(n,i,e){return\\\"undefined\\\"==typeof e?new Sk.builtin.float_(c.processing.mag(n.v,i.v)):new Sk.builtin.float_(c.processing.mag(n.v,i.v,e.v))})),c.map=new Sk.builtin.func((function(n,i,e,t,u){return new Sk.builtin.float_(c.processing.map(n.v,i.v,e.v,t.v,u.v))})),c.millis=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.millis())})),c.minute=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.minute())})),c.modelX=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelX(n.v,i.v,e.v))})),c.modelY=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelY(n.v,i.v,e.v))})),c.modelZ=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.modelZ(n.v,i.v,e.v))})),c.month=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.month())})),c.noCursor=new Sk.builtin.func((function(){c.processing.noCursor()})),c.noise=new Sk.builtin.func((function(n,i,e){return\\\"undefined\\\"==typeof i?new Sk.builtin.float_(c.processing.noise(n.v)):\\\"undefined\\\"==typeof e?new Sk.builtin.float_(c.processing.noise(n.v,i.v)):new Sk.builtin.float_(c.processing.noise(n.v,i.v,e.v))})),c.noiseDetail=new Sk.builtin.func((function(n,i){c.processing.noiseDetail(n.v,i.v)})),c.noiseSeed=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.noiseSeed(n.v))})),c.noLights=new Sk.builtin.func((function(){c.processing.noLights()})),c.norm=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.norm(n.v,i.v,e.v))})),c.normal=new Sk.builtin.func((function(n,i,e){c.processing.normal(n.v,i.v,e.v)})),c.noTint=new Sk.builtin.func((function(){c.processing.noTint()})),c.ortho=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.ortho(n.v,i.v,e.v,t.v,u.v,o.v)})),c.perspective=new Sk.builtin.func((function(n,i,e,t){\\\"undefined\\\"==typeof n?c.processing.perspective():\\\"undefined\\\"==typeof i?c.processing.perspective(n.v):\\\"undefined\\\"==typeof e?c.processing.perspective(n.v,i.v):\\\"undefined\\\"==typeof t?c.processing.perspective(n.v,i.v,e.v):c.processing.perspective(n.v,i.v,e.v,t.v)})),c.pointLight=new Sk.builtin.func((function(n,i,e,t,u,o){c.processing.pointLight(n.v,i.v,e.v,t.v,u.v,o.v)})),c.printCamera=new Sk.builtin.func((function(){c.processing.printCamera()})),c.println=new Sk.builtin.func((function(n){c.processing.println(n.v)})),c.printProjection=new Sk.builtin.func((function(){c.processing.printProjection()})),c.radians=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.radians(n.v))})),c.randomSeed=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.randomSeed(n.v))})),c.random=new Sk.builtin.func((function(n,i){return\\\"undefined\\\"==typeof n?new Sk.builtin.float_(c.processing.random()):\\\"undefined\\\"==typeof i?new Sk.builtin.float_(c.processing.random(n.v)):new Sk.builtin.float_(c.processing.random(n.v,i.v))})),c.requestImage=new Sk.builtin.func((function(n,i){var e=Sk.misceval.callsimArray(c.PImage);return e.v=\\\"undefined\\\"==typeof i?c.processing.requestImage(n.v):c.processing.requestImage(n.v,i.v),e})),c.saturation=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.saturation(n.v))})),c.save=new Sk.builtin.func((function(n){c.processing.save(n.v)})),c.saveFrame=new Sk.builtin.func((function(n){\\\"undefined\\\"==typeof n?c.processing.saveFrame():c.processing.saveFrame(n.v)})),c.saveStrings=new Sk.builtin.func((function(n,i){c.processing.saveStrings(n.v,i.v)})),c.screenX=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenX(n.v,i.v,e.v))})),c.screenY=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenY(n.v,i.v,e.v))})),c.screenZ=new Sk.builtin.func((function(n,i,e){return new Sk.builtin.float_(c.processing.screenZ(n.v,i.v,e.v))})),c.second=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.second())})),c.shape=new Sk.builtin.func((function(n,i,e,t,u){\\\"undefined\\\"==typeof i?c.processing.shape(n.v):\\\"undefined\\\"==typeof e?c.processing.shape(n.v,i.v):\\\"undefined\\\"==typeof t?c.processing.shape(n.v,i.v,e.v):\\\"undefined\\\"==typeof u?c.processing.shape(n.v,i.v,e.v,t.v):c.processing.shape(n.v,i.v,e.v,t.v,u.v)})),c.shapeMode=new Sk.builtin.func((function(n){c.processing.shapeMode(n.v)})),c.shininess=new Sk.builtin.func((function(n){c.processing.shininess(n.v)})),c.specular=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof i?c.processing.specular(n.v):\\\"undefined\\\"==typeof e?c.processing.specular(n.v,i.v):c.processing.specular(n.v,i.v,e.v)})),c.spotLight=new Sk.builtin.func((function(n,i,e,t,u,o,s,l){c.processing.spotLight(n.v,i.v,e.v,t.v,u.v,o.v,s.v,l.v)})),c.sq=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.sq(n))})),c.status=new Sk.builtin.func((function(n){c.processing.status(n.v)})),c.textAlign=new Sk.builtin.func((function(n,i){\\\"undefined\\\"==typeof i?c.processing.textAlign(n.v):c.processing.textAlign(n.v,i.v)})),c.textAscent=new Sk.builtin.func((function(){return new Sk.builtin.float_(c.processing.textAscent())})),c.textDescent=new Sk.builtin.func((function(){return new Sk.builtin.float_(c.processing.textDescent())})),c.textFont=new Sk.builtin.func((function(n,i){\\\"undefined\\\"==typeof i?c.processing.textFont(n.v):c.processing.textFont(n.v,i.v)})),c.textLeading=new Sk.builtin.func((function(n){c.processing.textLeading(n.v)})),c.textMode=new Sk.builtin.func((function(n){c.processing.textMode(n.v)})),c.textSize=new Sk.builtin.func((function(n){c.processing.textSize(n.v)})),c.texture=new Sk.builtin.func((function(n){c.processing.texture(n.v)})),c.textureMode=new Sk.builtin.func((function(n){c.processing.textureMode(n.v)})),c.textWidth=new Sk.builtin.func((function(n){return new Sk.builtin.float_(c.processing.textWidth(n.v))})),c.tint=new Sk.builtin.func((function(n,i,e,t){\\\"undefined\\\"==typeof i?c.processing.tint(n.v):\\\"undefined\\\"==typeof e?c.processing.tint(n.v,i.v):\\\"undefined\\\"==typeof t?c.processing.tint(n.v,i.v,e.v):c.processing.tint(n.v,i.v,e.v,t.v)})),c.updatePixels=new Sk.builtin.func((function(){c.processing.updatePixels()})),c.vertex=new Sk.builtin.func((function(n,i,e,t,u){\\\"undefined\\\"==typeof e?c.processing.vertex(n.v,i.v):\\\"undefined\\\"==typeof t?c.processing.vertex(n.v,i.v,e.v):\\\"undefined\\\"==typeof u?c.processing.vertex(n.v,i.v,e.v,t.v):c.processing.vertex(n.v,i.v,e.v,t.v,u.v)})),c.year=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.year())})),c.box=new Sk.builtin.func((function(n){c.processing.box(n.v)})),c.sphere=new Sk.builtin.func((function(n){c.processing.sphere(n.v)})),c.sphereDetail=new Sk.builtin.func((function(n,i){\\\"undefined\\\"==typeof i?c.processing.sphereDetail(n.v):c.processing.sphereDetail(n.v,i.v)})),c.background=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"!=typeof i&&(i=i.v),\\\"undefined\\\"!=typeof e&&(e=e.v),c.processing.background(n.v,i,e)})),c.fill=new Sk.builtin.func((function(n,i,e,t){\\\"undefined\\\"!=typeof i&&(i=i.v),\\\"undefined\\\"!=typeof e&&(e=e.v),\\\"undefined\\\"!=typeof t&&(t=t.v),c.processing.fill(n.v,i,e,t)})),c.stroke=new Sk.builtin.func((function(n,i,e,t){\\\"undefined\\\"!=typeof i&&(i=i.v),\\\"undefined\\\"!=typeof e&&(e=e.v),\\\"undefined\\\"!=typeof t&&(t=t.v),c.processing.stroke(n.v,i,e,t)})),c.noStroke=new Sk.builtin.func((function(){c.processing.noStroke()})),c.colorMode=new Sk.builtin.func((function(n,i,e,t,u){i=\\\"undefined\\\"==typeof i?255:i.v,\\\"undefined\\\"!=typeof e&&(e=e.v),\\\"undefined\\\"!=typeof t&&(t=t.v),\\\"undefined\\\"!=typeof u&&(u=u.v),c.processing.colorMode(n.v,i,e,t,u)})),c.noFill=new Sk.builtin.func((function(){c.processing.noFill()})),c.loop=new Sk.builtin.func((function(){if(null===c.processing)throw new Sk.builtin.Exception(\\\"loop() should be called after run()\\\");v=!0,c.processing.loop()})),c.noLoop=new Sk.builtin.func((function(){if(null===c.processing)throw new Sk.builtin.Exception(\\\"noLoop() should be called after run()\\\");v=!1,c.processing.noLoop()})),c.frameRate=new Sk.builtin.func((function(n){c.processing.frameRate(n.v)})),c.width=new Sk.builtin.int_(0),c.height=new Sk.builtin.int_(0),c.renderMode=c.P2D,c.size=new Sk.builtin.func((function(n,i,e){\\\"undefined\\\"==typeof e&&(e=c.P2D),c.processing.size(n.v,i.v,e.v),c.width=new Sk.builtin.int_(c.processing.width),c.height=new Sk.builtin.int_(c.processing.height),c.renderMode=e})),c.exitp=new Sk.builtin.func((function(){c.processing.exit()})),c.mouseX=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.mouseX)})),c.mouseY=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.mouseY)})),c.pmouseX=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.pmouseX)})),c.pmouseY=new Sk.builtin.func((function(){return new Sk.builtin.int_(c.processing.pmouseY)})),c.rectMode=new Sk.builtin.func((function(n){c.processing.rectMode(n.v)})),c.strokeWeight=new Sk.builtin.func((function(n){c.processing.strokeWeight(n.v)})),c.smooth=new Sk.builtin.func((function(){c.processing.smooth()})),c.noSmooth=new Sk.builtin.func((function(){c.processing.noSmooth()})),c.ellipseMode=new Sk.builtin.func((function(n){c.processing.ellipseMode(n.v)})),c.strokeCap=new Sk.builtin.func((function(n){c.processing.strokeCap(n.v)})),c.strokeJoin=new Sk.builtin.func((function(n){c.processing.strokeJoin(n.v)})),c.rotate=new Sk.builtin.func((function(n){c.processing.rotate(n.v)})),c.rotateX=new Sk.builtin.func((function(n){c.processing.rotateX(n.v)})),c.rotateY=new Sk.builtin.func((function(n){c.processing.rotateY(n.v)})),c.rotateZ=new Sk.builtin.func((function(n){c.processing.rotateZ(n.v)})),c.scale=new Sk.builtin.func((function(n,i,e){i=\\\"undefined\\\"==typeof i?1:i.v,e=\\\"undefined\\\"==typeof e?1:e.v,c.processing.scale(n.v,i,e)})),c.translate=new Sk.builtin.func((function(n,i,e){i=\\\"undefined\\\"==typeof i?1:i.v,e=\\\"undefined\\\"==typeof e?1:e.v,c.processing.translate(n.v,i,e)})),c.popMatrix=new Sk.builtin.func((function(){c.processing.popMatrix()})),c.pushMatrix=new Sk.builtin.func((function(){c.processing.pushMatrix()})),c.applyMatrix=new Sk.builtin.func((function(){var n,i=Array.prototype.slice.call(arguments,0,16);for(n=0;nnew pyStr(e))))},_value2member={},RegexFlagMeta=buildNativeClass(\\\"RegexFlagMeta\\\",{constructor:function RegexFlagMeta(){},base:pyType,slots:{tp$iter(){const e=Object.values(_members)[Symbol.iterator]();return new pyIterator((()=>e.next().value))},sq$contains(e){if(!(e instanceof this))throw new TypeError(\\\"unsupported operand type(s) for 'in': '\\\"+typeName(e)+\\\"' and '\\\"+typeName(this)+\\\"'\\\");return Object.values(_members).includes(e)}}});re.RegexFlag=buildNativeClass(\\\"RegexFlag\\\",{meta:RegexFlagMeta,base:pyInt,constructor:function RegexFlag(e){const t=_value2member[e];if(t)return t;this.v=e,_value2member[e]=this},slots:{tp$new(e,t){checkOneArg(\\\"RegexFlag\\\",e,t);const r=e[0].valueOf();if(!checkInt(r))throw new ValueError(objectRepr(r)+\\\" is not a valid RegexFlag\\\");return new re.RegexFlag(r)},$r(){let e=this.valueOf();const t=e<0;e=t?~e:e;const r=[];Object.entries(_members).forEach((([t,n])=>{const s=n.valueOf();e&s&&(e&=~s,r.push(\\\"re.\\\"+t))})),e&&r.push(hex(e).toString());let n=r.join(\\\"|\\\");return t&&(n=r.length>1?\\\"~(\\\"+n+\\\")\\\":\\\"~\\\"+n),new pyStr(n)},sq$contains(e){if(!(e instanceof re.RegexFlag))throw new TypeError(\\\"'in' requires a RegexFlag not \\\"+typeName(e));return this.nb$and(e)===e},nb$and:flagBitSlot(((e,t)=>e&t),JSBI.bitwiseAnd),nb$or:flagBitSlot(((e,t)=>e|t),JSBI.bitwiseOr),nb$xor:flagBitSlot(((e,t)=>e^t),JSBI.bitwiseXor),nb$invert:function(){const e=this.v;return\\\"number\\\"==typeof e?new re.RegexFlag(~e):new re.RegexFlag(JSBI.bitwiseNot(e))}},proto:{valueOf(){return this.v}},flags:{sk$unacceptableBase:!0}}),re.TEMPLATE=re.T=new re.RegexFlag(1),re.IGNORECASE=re.I=new re.RegexFlag(2),re.LOCALE=re.L=new re.RegexFlag(4),re.MULTILINE=re.M=new re.RegexFlag(8),re.DOTALL=re.S=new re.RegexFlag(16),re.UNICODE=re.U=new re.RegexFlag(32),re.VERBOSE=re.X=new re.RegexFlag(64),re.DEBUG=new re.RegexFlag(128),re.ASCII=re.A=new re.RegexFlag(256);const _members={ASCII:re.A,IGNORECASE:re.I,LOCALE:re.L,UNICODE:re.U,MULTILINE:re.M,DOTALL:re.S,VERBOSE:re.X,TEMPLATE:re.T,DEBUG:re.DEBUG};function flagBitSlot(e,t){return function(r){if(r instanceof re.RegexFlag||r instanceof pyInt){let n=this.v,s=r.v;if(\\\"number\\\"==typeof n&&\\\"number\\\"==typeof s){let t=e(n,s);return t<0&&(t+=4294967296),new re.RegexFlag(t)}return n=JSBI.BigUp(n),s=JSBI.BigUp(s),new re.RegexFlag(JSBI.numberIfSafe(t(n,s)))}return pyNotImplemented}}const jsFlags={i:re.I,m:re.M,s:re.S,u:re.U},jsInlineFlags={i:re.I,a:re.A,s:re.S,L:re.L,m:re.M,u:re.U,x:re.X};RegExp.prototype.hasOwnProperty(\\\"sticky\\\")||delete jsFlags.s,RegExp.prototype.hasOwnProperty(\\\"unicode\\\")||delete jsFlags.u;const flagFails=Object.entries({\\\"cannot use LOCALE flag with a str pattern\\\":re.L,\\\"ASCII and UNICODE flags are incompatible\\\":new re.RegexFlag(re.A.valueOf()|re.U.valueOf())}),inline_regex=/\\\\(\\\\?([isamux]+)\\\\)/g;function adjustFlags(e,t){let r=e.toString(),n=\\\"g\\\",s=0;return r=r.replace(inline_regex,((e,t)=>{for(let r of t){const e=jsInlineFlags[r];s|=e.valueOf()}return\\\"\\\"})),flagFails.forEach((([e,t])=>{if((t.valueOf()&s)===t.valueOf())throw new re.error(\\\"bad bad inline flags: \\\"+e)})),t=numberBinOp(new re.RegexFlag(s),t,\\\"BitOr\\\"),flagFails.forEach((([e,r])=>{if(numberBinOp(r,t,\\\"BitAnd\\\")===r)throw new ValueError(e)})),numberBinOp(re.A,t,\\\"BitAnd\\\")!==re.A&&(t=numberBinOp(re.U,t,\\\"BitOr\\\")),Object.entries(jsFlags).forEach((([e,r])=>{numberBinOp(r,t,\\\"BitAnd\\\")===r&&(n+=e)})),t=new re.RegexFlag(t.valueOf()),[r,n,t]}let neg_lookbehind_A=\\\"(?)(?!(?:\\\\]|[^\\\\[]*[^\\\\\\\\]\\\\]))/g,py_to_js_unicode_escape=/\\\\\\\\[\\\\t\\\\r\\\\n \\\\v\\\\f#&~\\\"'!:,;`<>]|\\\\\\\\-(?!(?:\\\\]|[^\\\\[]*[^\\\\\\\\]\\\\]))/g,quantifierErrors=/Incomplete quantifier|Lone quantifier/g,_compiled_patterns=Object.create(null);function compile_pattern(e,t){let r,n;[r,n,t]=adjustFlags(e,t);const s=_compiled_patterns[e.toString()];if(s&&s.$flags===t)return s;const i={};let o,a;r=\\\"_\\\"+r,r=r.replace(initialUnescapedBracket,\\\"$1$2\\\\\\\\]$3\\\"),r=r.replace(py_to_js_regex,((t,r,n,s,o,a)=>{switch(n){case\\\"\\\\\\\\A\\\":return r+neg_lookbehind_A+\\\"^\\\";case\\\"\\\\\\\\Z\\\":return r+\\\"$(?!\\\\\\\\n)\\\";case\\\"{,\\\":return r+\\\"{0,\\\";case\\\"$\\\":return r+\\\"(?:(?=\\\\\\\\n$)|$)\\\";default:if(n.endsWith(\\\">\\\"))return i[o]=!0,r+\\\"(?<\\\"+o+\\\">\\\";if(!i[s])throw new re.error(\\\"unknown group name \\\"+s+\\\" at position \\\"+a+1,e,new pyInt(a+1));return r+\\\"\\\\\\\\k<\\\"+s+\\\">\\\"}})),r=r.slice(1);let l=r;n.includes(\\\"u\\\")&&(l=r.replace(py_to_js_unicode_escape,(e=>{switch(e){case\\\"\\\\\\\\ \\\":return\\\" \\\";case\\\"\\\\\\\\\\\\t\\\":return\\\"\\\\\\\\t\\\";case\\\"\\\\\\\\\\\\n\\\":return\\\"\\\\\\\\n\\\";case\\\"\\\\\\\\\\\\v\\\":return\\\"\\\\\\\\v\\\";case\\\"\\\\\\\\\\\\f\\\":return\\\"\\\\\\\\f\\\";case\\\"\\\\\\\\r\\\":return\\\"\\\\\\\\r\\\";default:return e.slice(1)}})));try{o=new RegExp(l,n)}catch(g){if(!quantifierErrors.test(g.message))throw a=g.message.substring(g.message.lastIndexOf(\\\":\\\")+2)+\\\" in pattern: \\\"+e.toString(),new re.error(a,e);try{o=new RegExp(r,n.replace(\\\"u\\\",\\\"\\\"))}catch(g){throw a=g.message.substring(g.message.lastIndexOf(\\\":\\\")+2)+\\\" in pattern: \\\"+e.toString(),new re.error(a,e)}}const p=new re.Pattern(o,e,t);return _compiled_patterns[e.toString()]=p,p}function _compile(e,t){if(e instanceof re.Pattern){if(t!==zero||t.valueOf())throw new ValueError(\\\"cannot process flags argument with compiled pattern\\\");return e}if(!checkString(e))throw new TypeError(\\\"first argument must be string or compiled pattern\\\");return compile_pattern(e,t)}re.error=buildNativeClass(\\\"re.error\\\",{base:Exception,constructor:function error(e,t,r){this.$pattern=t,this.$msg=e,this.$pos=r||pyNone,Exception.call(this,e)},slots:{tp$doc:\\\"Exception raised for invalid regular expressions.\\\\n\\\\n Attributes:\\\\n\\\\n msg: The unformatted error message\\\\n pattern: The regular expression pattern\\\\n\\\",tp$init(e,t){const[r,n,s]=copyKeywordToNamedArgs(\\\"re.error\\\",[\\\"msg\\\",\\\"pattern\\\",\\\"pos\\\"],e,t,[pyNone,pyNone]);this.$pattern=n,this.$pos=s,this.$msg=r}},getsets:{msg:{$get(){return this.$msg}},pattern:{$get(){return this.$pattern}},pos:{$get(){return this.$pos}}}});const zero=new pyInt(0),maxsize=Number.MAX_SAFE_INTEGER;re.Pattern=buildNativeClass(\\\"re.Pattern\\\",{constructor:function(e,t,r){this.v=e,this.str=t,this.$flags=r,this.$groups=null,this.$groupindex=null},slots:{$r(){const e=objectRepr(this.str).slice(0,200),t=objectRepr(this.$flags.nb$and(re.U.nb$invert()));return new pyStr(\\\"re.compile(\\\"+e+(t?\\\", \\\"+t:\\\"\\\")+\\\")\\\")},tp$richcompare(e,t){if(\\\"Eq\\\"!==t&&\\\"NotEq\\\"!==t||!(e instanceof re.Pattern))return pyNotImplemented;const r=this.str===e.str&&this.$flags===e.$flags;return\\\"Eq\\\"===t?r:!r},tp$hash(){},tp$doc:\\\"Compiled regular expression object.\\\"},methods:{match:{$meth:function match(e,t,r){return this.$match(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:\\\"Matches zero or more characters at the beginning of the string.\\\"},fullmatch:{$meth:function fullmatch(e,t,r){return this.full$match(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:\\\"Matches against all of the string.\\\"},search:{$meth:function search(e,t,r){return this.$search(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:\\\"Scan through string looking for a match, and return a corresponding match object instance.\\\\n\\\\nReturn None if no position in the string matches.\\\"},sub:{$meth:function sub(e,t,r){return this.$sub(e,t,r)},$flags:{NamedArgs:[\\\"repl\\\",\\\"string\\\",\\\"count\\\"],Defaults:[zero]},$textsig:\\\"($self, /, repl, string, count=0)\\\",$doc:\\\"Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl.\\\"},subn:{$meth:function(e,t,r){return this.$subn(e,t,r)},$flags:{NamedArgs:[\\\"repl\\\",\\\"string\\\",\\\"count\\\"],Defaults:[zero]},$textsig:\\\"($self, /, repl, string, count=0)\\\",$doc:\\\"Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl.\\\"},findall:{$meth:function findall(e,t,r){return this.find$all(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:\\\"Return a list of all non-overlapping matches of pattern in string.\\\"},split:{$meth:function split(e,t){return this.$split(e,t)},$flags:{NamedArgs:[\\\"string\\\",\\\"maxsplit\\\"],Defaults:[zero]},$textsig:\\\"($self, /, string, maxsplit=0)\\\",$doc:\\\"Split string by the occurrences of pattern.\\\"},finditer:{$meth:function finditer(e,t,r){return this.find$iter(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:\\\"Return an iterator over all non-overlapping matches for the RE pattern in string.\\\\n\\\\nFor each match, the iterator returns a match object.\\\"},scanner:{$meth:function scanner(e,t,r){return this.$scanner(e,t,r)},$flags:{NamedArgs:[\\\"string\\\",\\\"pos\\\",\\\"endpos\\\"],Defaults:[zero,maxsize]},$textsig:\\\"($self, /, string, pos=0, endpos=sys.maxsize)\\\",$doc:null},__copy__:{$meth:function copy(){return this},$flags:{NoArgs:!0},$textsig:\\\"($self, /)\\\",$doc:null},__deepcopy__:{$meth:function(){return this},$flags:{OneArg:!0},$textsig:\\\"($self, memo, /)\\\",$doc:null}},getsets:{pattern:{$get(){return this.str},$doc:\\\"The pattern string from which the RE object was compiled.\\\"},flags:{$get(){return this.$flags},$doc:\\\"The regex matching flags.\\\"},groups:{$get(){if(null===this.$groups){const e=(this.str.v.match(this.group$regex)||[]).length;this.$groups=new pyInt(e)}return this.$groups},$doc:\\\"The number of capturing groups in the pattern.\\\"},groupindex:{$get(){if(null===this.$groupindex){const e=this.str.v.matchAll(this.group$regex),t=[];let r=1;for(const n of e)n[1]&&(t.push(new pyStr(n[1])),t.push(new pyInt(r))),r++;this.$groupindex=new pyMappingProxy(new pyDict(t))}return this.$groupindex},$doc:\\\"A dictionary mapping group names to group numbers.\\\"}},proto:{group$regex:/\\\\((?!\\\\?(?!P<).*)(?:\\\\?P<([^\\\\d\\\\W]\\\\w*)>)?(?![^\\\\[]*\\\\])/g,get$count:e=>(e=asIndexSized(e,OverflowError))||Number.POSITIVE_INFINITY,get$jsstr(e,t,r){if(!checkString(e))throw new TypeError(\\\"expected string or bytes-like object\\\");if(t===zero&&r===maxsize||void 0===t&&void 0===r)return{jsstr:e.toString(),pos:zero.valueOf(),endpos:e.sq$length()};const{start:n,end:s}=pySlice.startEnd$wrt(e,t,r);return{jsstr:e.toString().slice(n,s),pos:n,endpos:s}},find$all(e,t,r){let{jsstr:n}=this.get$jsstr(e,t,r);const s=this.v,i=n.matchAll(s),o=[];for(let a of i)o.push(1===a.length?new pyStr(a[0]):2===a.length?new pyStr(a[1]):new pyTuple(a.slice(1).map((e=>new pyStr(e)))));return new pyList(o)},$split(e,t){t=(t=asIndexSized(t))||Number.POSITIVE_INFINITY;let{jsstr:r}=this.get$jsstr(e);const n=this.v,s=[];let i,o=0,a=0;for(;null!==(i=n.exec(r))&&o1&&s.push(...i.slice(1).map((e=>void 0===e?pyNone:new pyStr(e)))),o++,a=n.lastIndex,i.index===n.lastIndex){if(!r)break;r=r.slice(i.index),a=0,n.lastIndex=1}return n.lastIndex=0,s.push(new pyStr(r.slice(a))),new pyList(s)},match$from_repl(e,t,r,n){let s;const i=e[e.length-1];return\\\"object\\\"==typeof i?(s=e.slice(0,e.length-3),Object.assign(s,{groups:i}),s.index=e[e.length-3]):(s=e.slice(0,e.length-2),s.groups=void 0,s.index=e[e.length-2]),new re.Match(s,this.str,t,r,n)},do$sub(e,t,r){const{jsstr:n,pos:s,endpos:i}=this.get$jsstr(t);let o;checkCallable(e)?o=t=>{const r=pyCall(e,[t]);if(!checkString(r))throw new TypeError(\\\"expected str instance, \\\"+typeName(r)+\\\" found\\\");return r.toString()}:(e=this.get$jsstr(e).jsstr,o=t=>t.template$repl(e)),r=this.get$count(r);let a=0;const l=n.replace(this.v,((...e)=>{if(a>=r)return e[0];a++;const n=this.match$from_repl(e,t,s,i);return o(n)}));return[new pyStr(l),new pyInt(a)]},$sub(e,t,r){const[n]=this.do$sub(e,t,r);return n},$subn(e,t,r){return new pyTuple(this.do$sub(e,t,r))},do$match(e,t,r,n){let s;({jsstr:s,pos:r,endpos:n}=this.get$jsstr(t,r,n));const i=s.match(e);return null===i?pyNone:new re.Match(i,this,t,r,n)},$search(e,t,r){var n=new RegExp(this.v.source,this.v.flags.replace(\\\"g\\\",\\\"\\\"));return this.do$match(n,e,t,r)},$match(e,t,r){let n=this.v.source,s=this.v.flags.replace(\\\"g\\\",\\\"\\\").replace(\\\"m\\\",\\\"\\\");n=\\\"^\\\"+n;var i=new RegExp(n,s);return this.do$match(i,e,t,r)},full$match(e,t,r){let n=this.v.source,s=this.v.flags.replace(\\\"g\\\",\\\"\\\").replace(\\\"m\\\",\\\"\\\");n=\\\"^(?:\\\"+n+\\\")$\\\";var i=new RegExp(n,s);return this.do$match(i,e,t,r)},find$iter(e,t,r){let n;({jsstr:n,pos:t,endpos:r}=this.get$jsstr(e,t,r));const s=n.matchAll(this.v);return new pyIterator((()=>{const n=s.next().value;if(void 0!==n)return new re.Match(n,this,e,t,r)}))}},flags:{sk$unacceptableBase:!0}}),re.Match=buildNativeClass(\\\"re.Match\\\",{constructor:function(e,t,r,n,s){this.v=e,this.$match=new pyStr(this.v[0]),this.str=r,this.$re=t,this.$pos=n,this.$endpos=s,this.$groupdict=null,this.$groups=null,this.$lastindex=null,this.$lastgroup=null,this.$regs=null},slots:{tp$doc:\\\"The result of re.match() and re.search().\\\\nMatch objects always have a boolean value of True.\\\",$r(){let e=\\\"\\\",new pyStr(e)},tp$as_squence_or_mapping:!0,mp$subscript(e){const t=this.get$group(e);return void 0===t?pyNone:new pyStr(t)}},methods:{group:{$meth:function group(...e){let t;return e.length<=1?(t=this.get$group(e[0]),void 0===t?pyNone:new pyStr(t)):(t=[],e.forEach((e=>{e=this.get$group(e),t.push(void 0===e?pyNone:new pyStr(e))})),new pyTuple(t))},$flags:{MinArgs:0},$textsig:null,$doc:\\\"group([group1, ...]) -> str or tuple.\\\\n Return subgroup(s) of the match by indices or names.\\\\n For 0 returns the entire match.\\\"},start:{$meth:function start(e){const t=this.get$group(e);return new pyInt(void 0===t?-1:this.str.v.indexOf(t,this.v.index+this.$pos))},$flags:{MinArgs:0,MaxArgs:1},$textsig:\\\"($self, group=0, /)\\\",$doc:\\\"Return index of the start of the substring matched by group.\\\"},end:{$meth:function end(e){const t=this.get$group(e);return new pyInt(void 0===t?-1:this.str.v.indexOf(t,this.v.index+this.$pos)+[...t].length)},$flags:{MinArgs:0,MaxArgs:1},$textsig:\\\"($self, group=0, /)\\\",$doc:\\\"Return index of the end of the substring matched by group.\\\"},span:{$meth:function span(e){return this.$span(e)},$flags:{MinArgs:0,MaxArgs:1},$textsig:\\\"($self, group=0, /)\\\",$doc:\\\"For match object m, return the 2-tuple (m.start(group), m.end(group)).\\\"},groups:{$meth:function groups(e){return null!==this.$groups||(this.$groups=Array.from(this.v.slice(1),(t=>void 0===t?e:new pyStr(t))),this.$groups=new pyTuple(this.$groups)),this.$groups},$flags:{NamedArgs:[\\\"default\\\"],Defaults:[pyNone]},$textsig:\\\"($self, /, default=None)\\\",$doc:\\\"Return a tuple containing all the subgroups of the match, from 1.\\\\n\\\\n default\\\\n Is used for groups that did not participate in the match.\\\"},groupdict:{$meth:function groupdict(e){if(null!==this.$groupdict)return this.$groupdict;if(void 0===this.v.groups)this.$groupdict=new pyDict;else{const t=[];Object.entries(this.v.groups).forEach((([r,n])=>{t.push(new pyStr(r)),t.push(void 0===n?e:new pyStr(n))})),this.$groupdict=new pyDict(t)}return this.$groupdict},$flags:{NamedArgs:[\\\"default\\\"],Defaults:[pyNone]},$textsig:\\\"($self, /, default=None)\\\",$doc:\\\"Return a dictionary containing all the named subgroups of the match, keyed by the subgroup name.\\\\n\\\\n default\\\\n Is used for groups that did not participate in the match.\\\"},expand:{$meth:function expand(e){if(!checkString(e))throw new TypeError(\\\"expected str instance got \\\"+typeName(e));return e=e.toString(),e=this.template$repl(e),new pyStr(e)},$flags:{OneArg:!0},$textsig:\\\"($self, /, template)\\\",$doc:\\\"Return the string obtained by doing backslash substitution on the string template, as done by the sub() method.\\\"},__copy__:{$meth:function __copy__(){return this},$flags:{NoArgs:!0},$textsig:\\\"($self, /)\\\",$doc:null},__deepcopy__:{$meth:function __deepcopy__(){return this},$flags:{OneArg:!0},$textsig:\\\"($self, memo, /)\\\",$doc:null}},getsets:{lastindex:{$get(){if(null!==this.$lastindex)return this.$lastindex;let e,t=0;return this.v.forEach(((r,n)=>{n&&void 0!==r&&e!==r&&(t=n,e=r)})),this.$lastindex=t?new pyInt(t):pyNone,this.$lastindex},$doc:\\\"The integer index of the last matched capturing group.\\\"},lastgroup:{$get(){if(null!==this.$lastgroup)return this.$lastgroup;if(void 0===this.v.groups)this.$lastgroup=pyNone;else{let e;Object.entries(this.v.groups).forEach((([t,r])=>{void 0!==r&&(e=t)})),this.$lastgroup=void 0===e?pyNone:new pyStr(e)}return this.$lastgroup},$doc:\\\"The name of the last matched capturing group.\\\"},regs:{$get(){if(null!==this.$regs)return this.$regs;const e=[];return this.v.forEach(((t,r)=>{e.push(this.$span(r))})),this.$regs=new pyTuple(e),this.$regs}},string:{$get(){return this.str},$doc:\\\"The string passed to match() or search().\\\"},re:{$get(){return this.$re},$doc:\\\"The regular expression object.\\\"},pos:{$get(){return new pyInt(this.$pos)},$doc:\\\"The index into the string at which the RE engine started looking for a match.\\\"},endpos:{$get(){return new pyInt(this.$endpos)},$doc:\\\"The index into the string beyond which the RE engine will not go.\\\"}},proto:{get$group(e){if(void 0===e)return this.v[0];if(checkString(e)){if(e=e.toString(),this.v.groups&&Object.prototype.hasOwnProperty.call(this.v.groups,e))return this.v.groups[e]}else if(isIndex(e)&&(e=asIndexSized(e))>=0&&e|\\\\\\\\g<([^\\\\d\\\\W]\\\\w*)>|\\\\\\\\g?/g,template$repl(e){return e.replace(this.template$regex,((e,t,r,n,s,i)=>{let o;if(void 0!==(t=t||r)?o=t{delete _compiled_patterns[e]})),pyNone},$flags:{NoArgs:!0},$textsig:\\\"($module, / )\\\",$doc:\\\"Clear the regular expression caches\\\"},template:{$meth:function template(e,t){return _compile(e,numberBinOp(re.T,t,\\\"BitOr\\\"))},$flags:{NamedArgs:[\\\"pattern\\\",\\\"flags\\\"],Defaults:[zero]},$textsig:\\\"($module, / , pattern, flags=0)\\\",$doc:\\\"Compile a template pattern, returning a Pattern object\\\"},escape:{$meth:function(e){if(!checkString(e))throw new TypeError(\\\"expected a str instances, got \\\"+typeName(e));return e=(e=e.toString()).replace(escape_chrs,\\\"\\\\\\\\$&\\\"),new pyStr(e)},$flags:{NamedArgs:[\\\"pattern\\\"],Defaults:[]},$textsig:\\\"($module, / , pattern)\\\",$doc:\\\"\\\\n Escape special characters in a string.\\\\n \\\"}});const escape_chrs=/[\\\\&\\\\~\\\\#.*+\\\\-?^${}()|[\\\\]\\\\\\\\\\\\t\\\\r\\\\v\\\\f\\\\n ]/g;return re}\",\"src/lib/signal.js\":\"var $builtinmodule=function(n){var i={};return i.SIG_DFL=new Sk.builtin.int_(0),i.SIG_IGN=new Sk.builtin.int_(1),i.CTRL_C_EVENT=new Sk.builtin.int_(0),i.CTRL_BREAK_EVENT=new Sk.builtin.int_(0),i.NSIG=new Sk.builtin.int_(23),i.SIGHUP=new Sk.builtin.int_(1),i.SIGNINT=new Sk.builtin.int_(2),i.SIGILL=new Sk.builtin.int_(4),i.SIGFPE=new Sk.builtin.int_(8),i.SIGKILL=new Sk.builtin.int_(9),i.SIGSEGV=new Sk.builtin.int_(11),i.SIGTERM=new Sk.builtin.int_(15),i.SIGBREAK=new Sk.builtin.int_(21),i.SIGABRT=new Sk.builtin.int_(22),i.pause=new Sk.builtin.func((function(){Sk.builtin.pyCheckArgsLen(\\\"pause\\\",arguments.length,0,0);var n=new Sk.misceval.Suspension;return n.resume=function(){return Sk.builtin.none.none$},n.data={type:\\\"Sk.promise\\\",promise:new Promise((function(n,i){if(null!=Sk.signals&&Sk.signals.addEventListener){Sk.signals.addEventListener((function handleSignal(i){Sk.signals.removeEventListener(handleSignal),n()}))}else console.warn(\\\"signal.pause() not supported\\\"),Sk.misceval.print_(\\\"signal.pause() not supported\\\"),n()}))},n})),i.signal=new Sk.builtin.func((function(){throw new Sk.builtin.NotImplementedError(\\\"signal.signal is not supported.\\\")})),i};\",\"src/lib/string.js\":\"var $builtinmodule=function(i){var t={};return t.ascii_lowercase=new Sk.builtin.str(\\\"abcdefghijklmnopqrstuvwxyz\\\"),t.ascii_uppercase=new Sk.builtin.str(\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"),t.ascii_letters=new Sk.builtin.str(t.ascii_lowercase.v+t.ascii_uppercase.v),t.lowercase=new Sk.builtin.str(\\\"abcdefghijklmnopqrstuvwxyz\\\"),t.uppercase=new Sk.builtin.str(\\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"),t.letters=new Sk.builtin.str(t.lowercase.v+t.uppercase.v),t.digits=new Sk.builtin.str(\\\"0123456789\\\"),t.hexdigits=new Sk.builtin.str(\\\"0123456789abcdefABCDEF\\\"),t.octdigits=new Sk.builtin.str(\\\"01234567\\\"),t.punctuation=new Sk.builtin.str(\\\"!\\\\\\\"#$%&'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~\\\"),t.whitespace=new Sk.builtin.str(\\\"\\\\t\\\\n\\\\v\\\\f\\\\r \\\"),t.printable=new Sk.builtin.str(t.digits.v+t.letters.v+t.punctuation.v+\\\" \\\\t\\\\n\\\\r\\\\v\\\\f\\\"),t.split=new Sk.builtin.func((function(...i){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.split,i)})),t.capitalize=new Sk.builtin.func((function(i){return Sk.misceval.callsimArray(Sk.builtin.str.prototype.capitalize,[i])})),t.join=new Sk.builtin.func((function(i,t){return void 0===t&&(t=new Sk.builtin.str(\\\" \\\")),Sk.misceval.callsimArray(Sk.builtin.str.prototype.join,[t,i])})),t.capwords=new Sk.builtin.func((function(i,n){if(Sk.builtin.pyCheckArgsLen(\\\"capwords\\\",arguments.length,1,2),!Sk.builtin.checkString(i))throw new Sk.builtin.TypeError(\\\"s must be a string\\\");if(void 0===n&&(n=new Sk.builtin.str(\\\" \\\")),!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError(\\\"sep must be a string\\\");for(var e=Sk.misceval.callsimArray(t.split,[i,n]).v,r=[],l=0;l1&&function isLeapYear(t){return 0==(3&t)&&(t%100!=0||t%400==0)}(e?t.getUTCFullYear():t.getFullYear())&&u++,u}function stdTimezoneOffset(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return Math.max(t.getTimezoneOffset(),e.getTimezoneOffset())}function dst(t){return t.getTimezoneOffset()1)return n[1];if(void 0===e)return null;try{return(n=t.toLocaleString(e,{timeZoneName:\\\"short\\\"}).split(\\\" \\\"))[n.length-1]}catch(i){return null}}function from_seconds(t,e){var i=new Date;if(t){Sk.builtin.pyCheckType(\\\"secs\\\",\\\"number\\\",Sk.builtin.checkNumber(t));var u=Sk.builtin.asnum$(t);i.setTime(1e3*u)}return function date_to_struct_time(t,e){let i;if(e=e||!1)i=[new Sk.builtin.str(\\\"UTC\\\"),new Sk.builtin.int_(0)];else{var u=-t.getTimezoneOffset()/60,r=(u<0?\\\"-\\\":\\\"+\\\")+(\\\"\\\"+Math.abs(u)).padStart(2,\\\"0\\\");i=[new Sk.builtin.str(r),new Sk.builtin.int_(3600*u)]}return new n([Sk.builtin.assk$(e?t.getUTCFullYear():t.getFullYear()),Sk.builtin.assk$((e?t.getUTCMonth():t.getMonth())+1),Sk.builtin.assk$(e?t.getUTCDate():t.getDate()),Sk.builtin.assk$(e?t.getUTCHours():t.getHours()),Sk.builtin.assk$(e?t.getUTCMinutes():t.getMinutes()),Sk.builtin.assk$(e?t.getUTCSeconds():t.getSeconds()),Sk.builtin.assk$(((e?t.getUTCDay():t.getDay())+6)%7),Sk.builtin.assk$(getDayOfYear(t,e)),Sk.builtin.assk$(e?0:dst(t)?1:0)],i)}(i,e)}e.struct_time=n,e.time=new Sk.builtin.func((function(){return Sk.builtin.pyCheckArgsLen(\\\"time\\\",arguments.length,0,0),new Sk.builtin.float_(Date.now()/1e3)})),e.sleep=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen(\\\"sleep\\\",arguments.length,1,1),Sk.builtin.pyCheckType(\\\"delay\\\",\\\"float\\\",Sk.builtin.checkNumber(t)),new Sk.misceval.promiseToSuspension(new Promise((function(e){Sk.setTimeout((function(){e(Sk.builtin.none.none$)}),1e3*Sk.ffi.remapToJs(t))})))})),e.localtime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen(\\\"localtime\\\",arguments.length,0,1),from_seconds(t,!1)})),e.gmtime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen(\\\"gmtime\\\",arguments.length,0,1),from_seconds(t,!0)}));var i=[\\\"Jan\\\",\\\"Feb\\\",\\\"Mar\\\",\\\"Apr\\\",\\\"May\\\",\\\"Jun\\\",\\\"Jul\\\",\\\"Aug\\\",\\\"Sep\\\",\\\"Oct\\\",\\\"Nov\\\",\\\"Dec\\\"],u=[\\\"Mon\\\",\\\"Tue\\\",\\\"Wed\\\",\\\"Thu\\\",\\\"Fri\\\",\\\"Sat\\\",\\\"Sun\\\"];function asctime_f(t){if(Sk.builtin.pyCheckArgsLen(\\\"asctime\\\",arguments.length,0,1),!t||Sk.builtin.checkNone(t)?t=from_seconds():t instanceof n||(t=new n(t)),t instanceof Sk.builtin.tuple&&9==t.v.length){var e=[];return e.push(u[Sk.builtin.asnum$(t.v[6])]),e.push(i[Sk.builtin.asnum$(t.v[1])-1]),e.push(padLeft(Sk.builtin.asnum$(t.v[2]).toString(),2,\\\"0\\\")),e.push(padLeft(Sk.builtin.asnum$(t.v[3]).toString(),2,\\\"0\\\")+\\\":\\\"+padLeft(Sk.builtin.asnum$(t.v[4]).toString(),2,\\\"0\\\")+\\\":\\\"+padLeft(Sk.builtin.asnum$(t.v[5]).toString(),2,\\\"0\\\")),e.push(padLeft(Sk.builtin.asnum$(t.v[0]).toString(),4,\\\"0\\\")),new Sk.builtin.str(e.join(\\\" \\\"))}}function mktime_f(t){if(Sk.builtin.pyCheckArgsLen(\\\"mktime\\\",arguments.length,1,1),t instanceof Sk.builtin.tuple&&9==t.v.length){var e=new Date(Sk.builtin.asnum$(t.v[0]),Sk.builtin.asnum$(t.v[1])-1,Sk.builtin.asnum$(t.v[2]),Sk.builtin.asnum$(t.v[3]),Sk.builtin.asnum$(t.v[4]),Sk.builtin.asnum$(t.v[5]));return Sk.builtin.assk$(e.getTime()/1e3,void 0)}throw new Sk.builtin.TypeError(\\\"mktime() requires a struct_time or 9-tuple\\\")}e.asctime=new Sk.builtin.func(asctime_f),e.ctime=new Sk.builtin.func((function(t){return Sk.builtin.pyCheckArgsLen(\\\"ctime\\\",arguments.length,0,1),asctime_f(from_seconds(t))})),e.mktime=new Sk.builtin.func(mktime_f),e.timezone=new Sk.builtin.int_(60*stdTimezoneOffset()),e.altzone=new Sk.builtin.int_(60*function altTimezoneOffset(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return Math.min(t.getTimezoneOffset(),e.getTimezoneOffset())}()),e.daylight=new Sk.builtin.int_(function daylight_check(){const t=new Date(2002,0,1),e=new Date(2002,6,1);return t.getTimezoneOffset()!=e.getTimezoneOffset()}()?1:0),e.tzname=new Sk.builtin.tuple(function timeZoneNames(){var t=new Date(2002,0,1),e=new Date(2002,6,1);return dst(t)?[new Sk.builtin.str(timeZoneName(e)),new Sk.builtin.str(timeZoneName(t))]:[new Sk.builtin.str(timeZoneName(t)),new Sk.builtin.str(timeZoneName(e))]}()),e.accept2dyear=Sk.builtin.assk$(1),e.clock=new Sk.builtin.func((function(){var t=0;return t=Sk.global.performance&&Sk.global.performance.now?performance.now()/1e3:(new Date).getTime()/1e3,new Sk.builtin.float_(t)})),e.strftime=new Sk.builtin.func((function strftime_f(t,e){var i;if(Sk.builtin.pyCheckArgsLen(\\\"strftime\\\",arguments.length,1,2),!Sk.builtin.checkString(t))throw new Sk.builtin.TypeError(\\\"format must be a string\\\");return e?e instanceof n||(e=new n(e)):e=from_seconds(),function check_struct_time(t){if(!(t instanceof n))throw new Sk.builtin.TypeError(\\\"Required argument 'struct_time' must be of type: 'struct_time'\\\");var e,i=t.v.length,u=t.v;for(e=0;e(r=e.tp$getattr(new Sk.builtin.str(\\\"_strptime_time\\\")),r.tp$call(t)))):r.tp$call(t)})),e};\",\"src/lib/token.js\":\"var $builtinmodule=function(n){var e={};e.__file__=new Sk.builtin.str(\\\"/src/lib/token.py\\\");const t=[];for(let i in Sk.token.tok_name){const n=Sk.token.tok_name[i].slice(2),k=parseInt(i,10);t.push(Sk.ffi.remapToPy(k)),t.push(Sk.ffi.remapToPy(n)),e[n]=Sk.ffi.remapToPy(k)}return e.tok_name=new Sk.builtin.dict(t),e.ISTERMINAL=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen(\\\"ISTERMINAL\\\",arguments.length,1,1),Sk.token.ISTERMINAL(Sk.ffi.remapToJs(n))})),e.ISNONTERMINAL=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen(\\\"ISNONTERMINAL\\\",arguments.length,1,1),Sk.token.ISNONTERMINAL(Sk.ffi.remapToJs(n))})),e.ISEOF=new Sk.builtin.func((function(n){return Sk.builtin.pyCheckArgsLen(\\\"ISEOF\\\",arguments.length,1,1),Sk.token.ISEOF(Sk.ffi.remapToJs(n))})),e};\",\"src/lib/tokenize.js\":\"var $builtinmodule=function(e){var i={};return i.tokenize=new Sk.builtin.func((function(e){Sk.builtin.pyCheckArgsLen(\\\"tokenize\\\",1,1),Sk.builtin.checkFunction(e);const i=[];return Sk._tokenize(\\\"\\\",(function jsReadline(){const i=Sk.misceval.callsimArray(e);return Sk.ffi.remapToJs(i)}),\\\"UTF-8\\\",(function receiveToken(e){i.push(new Sk.builtin.tuple([Sk.ffi.remapToPy(e.type),Sk.ffi.remapToPy(e.string),new Sk.builtin.tuple([Sk.ffi.remapToPy(e.start[0]),Sk.ffi.remapToPy(e.start[1])]),new Sk.builtin.tuple([Sk.ffi.remapToPy(e.end[0]),Sk.ffi.remapToPy(e.end[1])]),Sk.ffi.remapToPy(e.line)]))})),new Sk.builtin.list(i)})),i};\",\"src/lib/turtle.js\":\"var $builtinmodule=function(e){\\\"use strict\\\";var t=function getConfiguredTarget(){var e,t;for(t=\\\"string\\\"==typeof(e=Sk.TurtleGraphics&&Sk.TurtleGraphics.target||\\\"turtle\\\")?document.getElementById(e):e;t.firstChild;)t.removeChild(t.firstChild);return t}();return t.turtleInstance?t.turtleInstance.reset():t.turtleInstance=function generateTurtleModule(e){var t,n,r,i,s,a,o,l,u={__name__:new Sk.builtin.str(\\\"turtle\\\")},c=!0,h=1e3/30,d={},f={},_={target:\\\"turtle\\\",width:400,height:400,worldWidth:0,worldHeight:0,animate:!0,bufferSize:0,allowUndo:!0,assets:{}};function getAsset(e){var t=i.assets,n=\\\"function\\\"==typeof t?t(e):t[e];return\\\"string\\\"==typeof n?new Promise((function(t,r){var s=new Image;s.onload=function(){i.assets[e]=this,t(s)},s.onerror=function(){r(new Error(\\\"Missing asset: \\\"+n))},s.src=n})):new InstantPromise(void 0,n)}function InstantPromise(e,t){this.lastResult=t,this.lastError=e}function FrameManager(){this.reset()}function getFrameManager(){return o||(o=new FrameManager),o}function MouseHandler(){var e=this;for(var t in this._target=getTarget(),this._managers={},this._handlers={mousedown:function(t){e.onEvent(\\\"mousedown\\\",t)},mouseup:function(t){e.onEvent(\\\"mouseup\\\",t)},mousemove:function(t){e.onEvent(\\\"mousemove\\\",t)}},this._handlers)this._target.addEventListener(t,this._handlers[t])}function EventManager(e,t){this._type=e,this._target=t,this._handlers=void 0,function getMouseHandler(){return a||(a=new MouseHandler),a}().addManager(e,this)}function Turtle(e){if(getFrameManager().addTurtle(this),this._screen=getScreen(),this._managers={},this._shape=e.v,!d.hasOwnProperty(this._shape))throw new Sk.builtin.ValueError(\\\"Shape:'\\\"+this._shape+\\\"' not in default shape, please check shape again!\\\");this.reset()}function Screen(){var e,t;this._frames=1,this._delay=void 0,this._bgcolor=\\\"none\\\",this._mode=\\\"standard\\\",this._managers={},this._keyLogger={},e=(i.worldWidth||i.width||getWidth())/2,t=(i.worldHeight||i.height||getHeight())/2,this.setUpWorld(-e,-t,e,t)}function ensureAnonymous(){return s||(s=Sk.misceval.callsimArray(u.Turtle)),s.instance}function getTarget(){return e}function getScreen(){return r||(r=new Screen),r}function getWidth(){return 0|(r&&r._width||i.width||getTarget().clientWidth||_.width)}function getHeight(){return 0|(r&&r._height||i.height||getTarget().clientHeight||_.height)}function createLayer(e,t){var n,r=document.createElement(\\\"canvas\\\"),i=getWidth(),s=getHeight(),a=getTarget().firstChild?-s+\\\"px\\\":\\\"0\\\";return r.width=i,r.height=s,r.style.position=\\\"relative\\\",r.style.display=\\\"block\\\",r.style.setProperty(\\\"margin-top\\\",a),r.style.setProperty(\\\"z-index\\\",e),t&&(r.style.display=\\\"none\\\"),getTarget().appendChild(r),(n=r.getContext(\\\"2d\\\")).lineCap=\\\"round\\\",n.lineJoin=\\\"round\\\",applyWorld(getScreen(),n),n}function cancelAnimationFrame(){t&&((window.cancelAnimationFrame||window.mozCancelAnimationFrame)(t),t=void 0),n&&(window.clearTimeout(n),n=void 0)}function applyWorld(e,t){var n=e.llx,r=(e.lly,e.urx,e.ury),i=e.xScale,s=e.yScale;t&&(clearLayer(t),t.restore(),t.save(),t.scale(1/i,1/s),t.translate(-n,-r))}function pushUndo(e){var t,n,r;if(i.allowUndo&&e._bufferSize){for(e._undoBuffer||(e._undoBuffer=[]);e._undoBuffer.length>e._bufferSize;)e._undoBuffer.shift();for(n={},t=\\\"x y angle radians color fill down filling shown shape size\\\".split(\\\" \\\"),r=0;r=0;)this._turtles[e].reset();this._turtles=[],this._frames=[],this._frameCount=0,this._buffer=1,this._rate=0,this._animationFrame=animationFrame()},e.addFrame=function(e,t){return t&&(this._frameCount+=1),this.frames().push(e),!i.animate||this._buffer&&this._frameCount===this.frameBuffer()?this.update():new InstantPromise},e.frames=function(){return this._frames},e.frameBuffer=function(e){return\\\"number\\\"==typeof e&&(this._buffer=0|e,e&&e<=this._frameCount)?this.update():this._buffer},e.refreshInterval=function(e){return\\\"number\\\"==typeof e&&(this._rate=0|e,this._animationFrame=animationFrame(e)),this._rate},e.update=function(){return this._frames&&this._frames.length?this.requestAnimationFrame():new InstantPromise},e.requestAnimationFrame=function(){var e,t,n=this._frames,r=this._animationFrame,i=this._turtles,s=getScreen().spriteLayer();return this._frames=[],this._frameCount=0,new Promise((function(a){r((function paint(){for(t=0;t=0;)l[a].test(n,r,i,s)&&l[a].canMove(\\\"mousedown\\\"===e);if(o&&o.length)for(computeCoordinates(),a=o.length;--a>=0;)(\\\"mousemove\\\"===e&&o[a].canMove()&&o[a].test(n,r,i,s)||\\\"mousedown\\\"===e&&o[a].test(n,r,i,s))&&o[a].trigger([i,s])},l.reset=function(){this._managers={}},l.addManager=function(e,t){this._managers[e]||(this._managers[e]=[]),this._managers[e].push(t)},function(e){e.reset=function(){this._handlers=void 0},e.canMove=function(e){return!(!this._target||!this._target.hitTest)&&(void 0!==e&&(this._target.hitTest.hit=e),this._target.hitTest.hit)},e.test=function(e,t,n,r){return this._target&&this._target.hitTest?this._target.hitTest(e,t,n,r):!!this._target},e.trigger=function(e){var t,n=this._handlers;if(n&&n.length)for(t=0;t.5&&e<10.5?Sk.builtin.asnum$(Sk.builtin.round(Sk.builtin.assk$(e))):0,this._speed=e,this._computed_speed=2*e,this.addUpdate(void 0,!1,{speed:this._computed_speed})},e.$speed.minArgs=0,e.$speed.co_varnames=[\\\"speed\\\"],e.$pencolor=function(e,t,n,r){return void 0!==e?(this._color=createColor(this._colorMode,e,t,n,r),this.addUpdate(void 0,this._shown,{color:this._color})):hexToRGB(this._color)},e.$pencolor.co_varnames=[\\\"r\\\",\\\"g\\\",\\\"b\\\",\\\"a\\\"],e.$pencolor.minArgs=0,e.$pencolor.returnType=f.COLOR,e.$fillcolor=function(e,t,n,r){return void 0!==e?(this._fill=createColor(this._colorMode,e,t,n,r),this.addUpdate(void 0,this._shown,{fill:this._fill})):hexToRGB(this._fill)},e.$fillcolor.co_varnames=[\\\"r\\\",\\\"g\\\",\\\"b\\\",\\\"a\\\"],e.$fillcolor.minArgs=0,e.$fillcolor.returnType=f.COLOR,e.$color=function(e,t,n,r){return void 0!==e?(void 0===t||void 0!==n?(this._color=createColor(this._colorMode,e,t,n,r),this._fill=this._color):(this._color=createColor(this._colorMode,e),this._fill=createColor(this._colorMode,t)),this.addUpdate(void 0,this._shown,{color:this._color,fill:this._fill})):[this.$pencolor(),this.$fillcolor()]},e.$color.minArgs=0,e.$color.co_varnames=[\\\"color\\\",\\\"fill\\\",\\\"b\\\",\\\"a\\\"],e.$color.returnType=function(e){return new Sk.builtin.tuple([f.COLOR(e[0]),f.COLOR(e[1])])},e.$fill=function(e){if(void 0!==e){if((e=!!e)===this._filling)return;return this._filling=e,e?(pushUndo(this),this.addUpdate(void 0,!1,{filling:!0,fillBuffer:[{x:this._x,y:this._y}]})):(pushUndo(this),this.addUpdate((function(){this.fillBuffer.push(this),drawFill.call(this)}),!0,{filling:!1,fillBuffer:void 0}))}return this._filling},e.$fill.co_varnames=[\\\"flag\\\"],e.$fill.minArgs=0,e.$begin_fill=function(){return this.$fill(!0)},e.$end_fill=function(){return this.$fill(!1)},e.$stamp=function(){return pushUndo(this),this.addUpdate((function(){drawTurtle(this,this.context())}),!0)},e.$dot=function(e,t,n,r,i){return pushUndo(this),e=\\\"number\\\"==typeof(e=Sk.builtin.asnum$(e))?Math.max(1,0|Math.abs(e)):Math.max(this._size+4,2*this._size),t=void 0!==t?createColor(this._colorMode,t,n,r,i):this._color,this.addUpdate(drawDot,!0,void 0,e,t)},e.$dot.co_varnames=[\\\"size\\\",\\\"color\\\",\\\"g\\\",\\\"b\\\",\\\"a\\\"],e.$write=function(e,t,n,r){var i,s,a,o,l,u=this;return pushUndo(this),e=String(e),r&&r.constructor===Array&&(s=\\\"string\\\"==typeof r[0]?r[0]:\\\"Arial\\\",a=String(r[1]||\\\"12pt\\\"),o=\\\"string\\\"==typeof r[2]?r[2]:\\\"normal\\\",/^\\\\d+$/.test(a)&&(a+=\\\"pt\\\"),r=[o,a,s].join(\\\" \\\")),n||(n=\\\"left\\\"),i=this.addUpdate(drawText,!0,void 0,e,n,r),!t||\\\"left\\\"!==n&&\\\"center\\\"!==n||(l=function measureText(e,t){return t&&(p.font=t),p.measureText(e).width}(e,r),\\\"center\\\"===n&&(l/=2),i=i.then((function(){var e=u.getState();return u.translate(e.x,e.y,l,0,!0)}))),i},e.$write.co_varnames=[\\\"message\\\",\\\"move\\\",\\\"align\\\",\\\"font\\\"],e.$write.minArgs=1,e.$pensize=e.$width=function(e){return void 0!==e?(this._size=e,this.addUpdate(void 0,this._shown,{size:e})):this._size},e.$pensize.minArgs=e.$width.minArgs=0,e.$pensize.co_varnames=e.$width.co_varnames=[\\\"width\\\"],e.$showturtle=e.$st=function(){return this._shown=!0,this.addUpdate(void 0,!0,{shown:!0})},e.$hideturtle=e.$ht=function(){return this._shown=!1,this.addUpdate(void 0,!0,{shown:!1})},e.$isvisible=function(){return this._shown},e.$shape=function(e){return e&&d[e]?(this._shape=e,this.addUpdate(void 0,this._shown,{shape:e})):this._shape},e.$shape.minArgs=0,e.$shape.co_varnames=[\\\"name\\\"],e.$window_width=function(){return this._screen.$window_width()},e.$window_height=function(){return this._screen.$window_height()},e.$tracer=function(e,t){return this._screen.$tracer(e,t)},e.$tracer.minArgs=0,e.$tracer.co_varnames=[\\\"n\\\",\\\"delay\\\"],e.$update=function(){return this._screen.$update()},e.$delay=function(e){return this._screen.$delay(e)},e.$delay.minArgs=0,e.$delay.co_varnames=[\\\"delay\\\"],e.$reset=function(){return this.reset(),this.$clear()},e.$mainloop=e.$done=function(){return this._screen.$mainloop()},e.$clear=function(){return this.addUpdate((function(){clearLayer(this.context())}),!0)},e.$dot.minArgs=0,e.$onclick=function(e,t,n){this.getManager(\\\"mousedown\\\").addHandler(e,n)},e.$onclick.minArgs=1,e.$onclick.co_varnames=[\\\"method\\\",\\\"btn\\\",\\\"add\\\"],e.$onrelease=function(e,t,n){this.getManager(\\\"mouseup\\\").addHandler(e,n)},e.$onrelease.minArgs=1,e.$onrelease.co_varnames=[\\\"method\\\",\\\"btn\\\",\\\"add\\\"],e.$ondrag=function(e,t,n){this.getManager(\\\"mousemove\\\").addHandler(e,n)},e.$ondrag.minArgs=1,e.$ondrag.co_varnames=[\\\"method\\\",\\\"btn\\\",\\\"add\\\"],e.$getscreen=function(){return Sk.misceval.callsimArray(u.Screen)},e.$getscreen.isSk=!0,e.$clone=function(){var e=Sk.misceval.callsimOrSuspendArray(u.Turtle);return e.instance._x=this._x,e.instance._y=this._y,e.instance._angle=this._angle,e.instance._radians=this._radians,e.instance._shape=this._shape,e.instance._color=this._color,e.instance._fill=this._fill,e.instance._filling=this._filling,e.instance._size=this._size,e.instance._computed_speed=this._computed_speed,e.instance._down=this._down,e.instance._shown=this._shown,e.instance._colorMode=this._colorMode,e.instance._isRadians=this._isRadians,e.instance._fullCircle=this._fullCircle,e.instance._bufferSize=this._bufferSize,e.instance._undoBuffer=this._undoBuffer,e._clonedFrom=this,e},e.$clone.returnType=function(e){return e},e.$getturtle=e.$getpen=function(){return this.skInstance},e.$getturtle.isSk=!0}(Turtle.prototype),function(e){e.spriteLayer=function(){return this._sprites||(this._sprites=createLayer(3))},e.bgLayer=function(){return this._background||(this._background=createLayer(1))},e.hitTestLayer=function(){return this._hitTest||(this._hitTest=createLayer(0,!0))},e.getManager=function(e){return this._managers[e]||(this._managers[e]=new EventManager(e,this)),this._managers[e]},e.reset=function(){var e;for(e in this._keyListeners=void 0,this._keyLogger)window.clearInterval(this._keyLogger[e]),window.clearTimeout(this._keyLogger[e]),delete this._keyLogger[e];for(e in this._keyDownListener&&(getTarget().removeEventListener(\\\"keydown\\\",this._keyDownListener),this._keyDownListener=void 0),this._keyUpListener&&(getTarget().removeEventListener(\\\"keyup\\\",this._keyUpListener),this._keyUpListener=void 0),this._timer&&(window.clearTimeout(this._timer),this._timer=void 0),this._managers)this._managers[e].reset();this._mode=\\\"standard\\\",removeLayer(this._sprites),this._sprites=void 0,removeLayer(this._background),this._background=void 0},e.setUpWorld=function(e,t,n,r){var i=this;i.llx=e,i.lly=t,i.urx=n,i.ury=r,i.xScale=(n-e)/getWidth(),i.yScale=-1*(r-t)/getHeight(),i.lineScale=Math.min(Math.abs(i.xScale),Math.abs(i.yScale))},e.$setup=function(e,t,n,r){return isNaN(parseFloat(e))&&(e=getWidth()),isNaN(parseFloat(t))&&(t=getHeight()),e<=1&&(e=getWidth()*e),t<=1&&(t=getHeight()*t),this._width=e,this._height=t,this._xOffset=void 0===n||isNaN(parseInt(n))?0:parseInt(n),this._yOffset=void 0===r||isNaN(parseInt(r))?0:parseInt(r),\\\"world\\\"===this._mode?this._setworldcoordinates(this.llx,this.lly,this.urx,this.ury):this._setworldcoordinates(-e/2,-t/2,e/2,t/2)},e.$setup.minArgs=0,e.$setup.co_varnames=[\\\"width\\\",\\\"height\\\",\\\"startx\\\",\\\"starty\\\"],e.$register_shape=e.$addshape=function(e,t){if(!t)return getAsset(e).then((function(t){d[e]=t}));d[e]=t},e.$register_shape.minArgs=1,e.$register_shape.co_varnames=[\\\"name\\\",\\\"shape\\\"],e.$getshapes=function(){return Object.keys(d)},e.$tracer=function(e,t){return void 0!==e||void 0!==t?(\\\"number\\\"==typeof t&&(this._delay=t,getFrameManager().refreshInterval(t)),\\\"number\\\"==typeof e?(this._frames=e,getFrameManager().frameBuffer(e)):void 0):this._frames},e.$tracer.co_varnames=[\\\"frames\\\",\\\"delay\\\"],e.$tracer.minArgs=0,e.$delay=function(e){return void 0!==e?this.$tracer(void 0,e):void 0===this._delay?h:this._delay},e.$delay.co_varnames=[\\\"delay\\\"],e._setworldcoordinates=function(e,t,n,r){return getFrameManager().turtles(),this.setUpWorld(e,t,n,r),this._sprites&&applyWorld(this,this._sprites),this._background&&applyWorld(this,this._background),this.$clear()},e.$setworldcoordinates=function(e,t,n,r){return this._mode=\\\"world\\\",this._setworldcoordinates(e,t,n,r)},e.$setworldcoordinates.co_varnames=[\\\"llx\\\",\\\"lly\\\",\\\"urx\\\",\\\"ury\\\"],e.minArgs=4,e.$clear=e.$clearscreen=function(){return this.reset(),this.$reset()},e.$update=function(){return getFrameManager().update()},e.$reset=e.$resetscreen=function(){var e=this,t=getFrameManager().turtles();return getFrameManager().addFrame((function(){applyWorld(e,e._sprites),applyWorld(e,e._background);for(var n=0;n1&&t[s]&&t[s].test(r),r===a||i){e._keyListeners[r](),e._createKeyRepeater(r,s),n.preventDefault();break}}},getTarget().addEventListener(\\\"keydown\\\",this._keyDownListener))},e._createKeyUpListener=function(){var e=this;this._keyUpListener||(this._keyUpListener=function(t){var n=e._keyLogger[t.charCode||t.keyCode];void 0!==n&&(t.preventDefault(),window.clearInterval(n),window.clearTimeout(n),delete e._keyLogger[t.charCode||t.keyCode])},getTarget().addEventListener(\\\"keyup\\\",this._keyUpListener))},e.$title=function(e){document.title=e},e.$title.minArgs=1,e.$title.co_varnames=[\\\"title\\\"],e.$listen=function(){this._createKeyUpListener(),this._createKeyDownListener()},e.$onkey=function(e,t){if(\\\"function\\\"==typeof t){var n=e;e=t,t=n}t=String(t).toLowerCase(),e&&\\\"function\\\"==typeof e?(this._keyListeners||(this._keyListeners={}),this._keyListeners[t]=e):delete this._keyListeners[t]},e.$onkey.minArgs=2,e.$onkey.co_varnames=[\\\"method\\\",\\\"keyValue\\\"],e.$onscreenclick=function(e,t,n){this.getManager(\\\"mousedown\\\").addHandler(e,n)},e.$onscreenclick.minArgs=1,e.$onscreenclick.co_varnames=[\\\"method\\\",\\\"btn\\\",\\\"add\\\"],e.$ontimer=function(e,t){this._timer&&(window.clearTimeout(this._timer),this._timer=void 0),e&&\\\"number\\\"==typeof t&&(this._timer=window.setTimeout(e,Math.max(0,0|t)))},e.$ontimer.minArgs=0,e.$ontimer.co_varnames=[\\\"method\\\",\\\"interval\\\"]}(Screen.prototype);var g=new Image;function removeLayer(e){e&&e.canvas&&e.canvas.parentNode&&e.canvas.parentNode.removeChild(e.canvas)}function clearLayer(e,t,n){e&&(e.save(),e.setTransform(1,0,0,1,0,0),t?(e.fillStyle=t,e.fillRect(0,0,e.canvas.width,e.canvas.height)):e.clearRect(0,0,e.canvas.width,e.canvas.height),n&&e.drawImage(n,0,0),e.restore())}function drawTurtle(e,t){var n,r,i,s=d[e.shape],a=getScreen(),o=(getWidth(),getHeight(),a.xScale),l=a.yScale;if(t){if(n=Math.cos(e.radians)/o,r=Math.sin(e.radians)/l,i=Math.atan2(r,n)-Math.PI/2,t.save(),t.translate(e.x,e.y),t.scale(o,l),s.nodeName){var u=s.naturalWidth,c=s.naturalHeight;t.drawImage(s,0,0,u,c,-u/2,-c/2,u,c)}else{t.rotate(i),t.beginPath(),t.lineWidth=1,t.strokeStyle=e.color,t.fillStyle=e.fill,t.moveTo(-s[0][0],s[0][1]);for(var h=1;ho)throw u=l===o?\\\"exactly \\\"+o:\\\"between \\\"+l+\\\" and \\\"+o,new Sk.builtin.TypeError(a+\\\"() takes \\\"+u+\\\" positional argument(s) (\\\"+d.length+\\\" given)\\\");for(e=d.length;--e>=0;)void 0!==d[e]&&(d[e]instanceof Sk.builtin.func?d[e]=pythonToJavascriptFunction(d[e]):d[e]instanceof Sk.builtin.method?d[e]=pythonToJavascriptFunction(d[e].im_func,d[e].im_self):d[e]&&d[e].$d instanceof Sk.builtin.dict&&d[e].instance?d[e]=d[e].instance:d[e]=Sk.ffi.remapToJs(d[e]));var _=d.slice(0);for(d=[],e=_.length;e>=0;--e)null!==_[e]&&(d[e]=_[e]);try{t=f[n].apply(f,d)}catch(g){throw window&&window.console&&(window.console.log(\\\"wrapped method failed\\\"),window.console.log(g.stack)),g}return t instanceof InstantPromise&&(t=t.lastResult),t instanceof Promise?(t=t.catch((function(e){throw window&&window.console&&(window.console.log(\\\"promise failed\\\"),window.console.log(e.stack)),e})),(i=new Sk.misceval.Suspension).resume=function(){return void 0===s?Sk.builtin.none.none$:Sk.ffi.remapToPy(s)},i.data={type:\\\"Sk.promise\\\",promise:t.then((function(e){return s=e,e}))},i):void 0===t?Sk.builtin.none.none$:h?t:\\\"function\\\"==typeof c?c(t):Sk.ffi.remapToPy(t)},i.co_name=new Sk.builtin.str(a),i.co_varnames=u.slice(),i.$defaults=[];for(var d=l;d\\\")})),e.__iter__=new Sk.builtin.func((function(n){var e=n.lineList;return Sk.builtin.makeGenerator((function(){if(!(this.$index>=this.$lines.length))return new Sk.builtin.str(this.$lines[this.$index++])}),{$obj:n,$index:0,$lines:e})})),e.read=new Sk.builtin.func((function(n,e){if(n.closed)throw new Sk.builtin.ValueError(\\\"I/O operation on closed file\\\");var i=n.data$.length;void 0===e&&(e=i);var t=new Sk.builtin.str(n.data$.substr(n.pos$,e));return n.pos$+=e,n.pos$>=i&&(n.pos$=i),t})),e.readline=new Sk.builtin.func((function(n,e){var i=\\\"\\\";return n.currentLinee===o)).length)throw new i(\\\"one of the hex, bytes, bytes_le, fields, or int arguments must be given\\\");if(u!==o){u=u.toString().replace(\\\"urn:\\\",\\\"\\\").replace(\\\"uuid:\\\",\\\"\\\");let e=0,i=u.length-1;for(;\\\"{}\\\".indexOf(u[e])>=0;)e++;for(;\\\"{}\\\".indexOf(u[i])>=0;)i--;if(u=u.slice(e,i+1),u=u.replace(S,\\\"\\\"),32!==u.length)throw new s(\\\"badly formed hexadecimal UUID string\\\");f=d(n,[new t(u),U])}if(c!==o){if(!(c instanceof e))throw new i(\\\"bytes_le should be a bytes instance\\\");if(c=c.valueOf(),16!==c.length)throw new s(\\\"bytes_le is not a 16-char string\\\");h=switchBytesBytesLe(c),h=new e(h)}if(h!==o){if(!(h instanceof e))throw new i(\\\"bytes_le should be a bytes instance\\\");if(16!==h.valueOf().length)throw new s(\\\"bytes is not a 16-char string\\\");f=d(w,[h],[\\\"byteorder\\\",v])}if(p!==o)throw new r(\\\"fields argument is not yet supported\\\");if(f!==o&&(g(f,_,\\\"Lt\\\")||((e,t)=>g(e,t,\\\"GtE\\\"))(f,y)))throw new s(\\\"int is out of range (need a 128-bit value)\\\");this.$int=f,this.$isSafe=I},tp$str(){const e=E.nb$remainder(this.$int).toString();return new t(`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`)},$r(){const e=u(this.ob$type,t.$name),n=c(this.tp$str());return new t(`${e}(${n})`)},tp$hash(){return this.$int.tp$hash()},tp$richcompare(e,t){return e instanceof R?this.$int.tp$richcompare(e.$int,t):l},tp$as_number:!0,nb$int(){return this.$int}},getsets:{int:{$get(){return this.$int}},is_safe:{$get(){return this.$isSafe}},bytes:{$get(){return d(b,[this.$int,U,v])}},bytes_le:{$get(){const n=this.tp$getattr(new t(\\\"bytes\\\")).valueOf();return new e(switchBytesBytesLe(n))}},fields:{$get:()=>notImplemented()},time_low:{$get:()=>notImplemented()},time_mid:{$get:()=>notImplemented()},time_hi_version:{$get:()=>notImplemented()},clock_seq_hi_variant:{$get:()=>notImplemented()},clock_seq_low:{$get:()=>notImplemented()},time:{$get:()=>notImplemented()},clock_seq:{$get:()=>notImplemented()},node:{$get:()=>notImplemented()},hex:{$get(){return E.nb$remainder(this.$int)}},urn:{$get(){return new t(`urn:uuid:${this}`)}},variant:{$get:()=>notImplemented()},version:{$get:()=>notImplemented()}}});return h(\\\"uuid\\\",p,{uuid1:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid2:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid3:{$meth(){notImplemented()},$flags:{FastCall:!0}},uuid4:{$meth(){const t=new e(f.getRandomValues(new Uint8Array(16)));return d(R,[],[\\\"bytes\\\",t,\\\"version\\\",I])},$flags:{NoArgs:!0}},uuid5:{$meth(){notImplemented()},$flags:{FastCall:!0}}}),p}\",\"src/lib/webbrowser.js\":\"var $builtinmodule=function(n){var e={},t=\\\"undefined\\\"!=typeof window&&\\\"undefined\\\"!=typeof window.navigator;function open_tab(n){return Sk.builtin.pyCheckType(\\\"url\\\",\\\"string\\\",Sk.builtin.checkString(n)),t?(n=n.$jsstr(),window.open(n,\\\"_blank\\\"),Sk.builtin.bool.true$):Sk.builtin.bool.false$}return e.__name__=new Sk.builtin.str(\\\"webbrowser\\\"),e.open=new Sk.builtin.func((function open(n){return Sk.builtin.pyCheckArgsLen(\\\"open\\\",arguments.length+1,1,3),open_tab(n)})),e.open_new=new Sk.builtin.func((function open_new(n){return Sk.builtin.pyCheckArgsLen(\\\"open_new\\\",arguments.length,1,1),open_tab(n)})),e.open_new_tab=new Sk.builtin.func((function open_new_tab(n){return Sk.builtin.pyCheckArgsLen(\\\"open_new_tab\\\",arguments.length,1,1),open_tab(n)})),e.DefaultBrowser=Sk.misceval.buildClass(e,(function dflbrowser(n,e){e.__init__=new Sk.builtin.func((function __init__(n){return Sk.builtin.none.none$})),e.open=new Sk.builtin.func((function open(n,e){return Sk.builtin.pyCheckArgsLen(\\\"open\\\",arguments.length,2,4),open_tab(e)})),e.open_new=new Sk.builtin.func((function open_new(n,e){return Sk.builtin.pyCheckArgsLen(\\\"open_new\\\",arguments.length,2,2),open_tab(e)})),e.open_new_tab=new Sk.builtin.func((function open_new_tab(n,e){return Sk.builtin.pyCheckArgsLen(\\\"open_new_tab\\\",arguments.length,2,2),open_tab(e)}))}),\\\"DefaultBrowser\\\",[]),e.get=new Sk.builtin.func((function get(){return Sk.builtin.pyCheckArgsLen(\\\"get\\\",arguments.length,0,1),Sk.misceval.callsimArray(e.DefaultBrowser,[])})),e};\",\"src/lib/webgl/__init__.js\":\"var $builtinmodule=function(n){var t={__name__:new Sk.builtin.str(\\\"webgl\\\")},makeFailHTML=function(n){return'
    '+n+\\\"
    \\\"},e='This page requires a browser that supports WebGL.
    Click here to upgrade your browser.';return t.Context=Sk.misceval.buildClass(t,(function(n,t){t.__init__=new Sk.builtin.func((function(n,t){var i=document.getElementById(t.v),r=function(n,t){var i=document.getElementById(n);if(t||(t=i.getElementsByTagName(\\\"canvas\\\")[0]),t){var r=function(n){for(var t=[\\\"webgl\\\",\\\"experimental-webgl\\\",\\\"webkit-3d\\\",\\\"moz-webgl\\\"],e=null,i=0;i7||7==a.Chrome[0]&&a.Chrome[1]>0||7==a.Chrome[0]&&0==a.Chrome[1]&&a.Chrome[2]>=521)?i.innerHTML=makeFailHTML('It doesn\\\\'t appear your computer can support WebGL.
    Click here for more information.'):i.innerHTML=makeFailHTML(e)}return r}i.innerHTML=makeFailHTML(e)}(t.v,i);if(!r)throw new Error(\\\"Your browser does not appear to support WebGL.\\\");for(var u in n.gl=r,r.__proto__)if(\\\"number\\\"==typeof r.__proto__[u])Sk.abstr.objectSetItem(n.$d,new Sk.builtin.str(u),r.__proto__[u]);else if(\\\"function\\\"==typeof r.__proto__[u])switch(u){case\\\"bufferData\\\":case\\\"clearColor\\\":case\\\"drawArrays\\\":case\\\"getAttribLocation\\\":case\\\"getUniformLocation\\\":case\\\"shaderSource\\\":case\\\"uniformMatrix4fv\\\":case\\\"vertexAttribPointer\\\":case\\\"viewport\\\":break;default:!function(t){Sk.abstr.objectSetItem(n.$d,new Sk.builtin.str(u),new Sk.builtin.func((function(){return r.__proto__[t].apply(r,arguments)})))}(u)}r.clearColor(100/255,149/255,237/255,1),r.clear(r.COLOR_BUFFER_BIT)})),t.tp$getattr=Sk.generic.getAttr,t.bufferData=new Sk.builtin.func((function(n,t,e,i){n.gl.bufferData(t,e.v,i)})),t.clearColor=new Sk.builtin.func((function(n,t,e,i,r){n.gl.clearColor(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),Sk.builtin.asnum$(r))})),t.getAttribLocation=new Sk.builtin.func((function(n,t,e){return n.gl.getAttribLocation(t,e.v)})),t.getUniformLocation=new Sk.builtin.func((function(n,t,e){return n.gl.getUniformLocation(t,e.v)})),t.shaderSource=new Sk.builtin.func((function(n,t,e){n.gl.shaderSource(t,e.v)})),t.drawArrays=new Sk.builtin.func((function(n,t,e,i){n.gl.drawArrays(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i))})),t.vertexAttribPointer=new Sk.builtin.func((function(n,t,e,i,r,u,a){n.gl.vertexAttribPointer(t,Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),r,Sk.builtin.asnum$(u),Sk.builtin.asnum$(a))})),t.viewport=new Sk.builtin.func((function(n,t,e,i,r){n.gl.viewport(Sk.builtin.asnum$(t),Sk.builtin.asnum$(e),Sk.builtin.asnum$(i),Sk.builtin.asnum$(r))})),t.uniformMatrix4fv=new Sk.builtin.func((function(n,t,e,i){n.gl.uniformMatrix4fv(Sk.builtin.asnum$(t),e,i.v)})),t.setDrawFunc=new Sk.builtin.func((function(n,t){var e=(new Date).getTime();setInterval((function(){Sk.misceval.callsimArray(t,[n,(new Date).getTime()-e])}),1e3/60)}))}),\\\"Context\\\",[]),t.Float32Array=Sk.misceval.buildClass(t,(function(n,t){t.__init__=new Sk.builtin.func((function(n,t){n.v=\\\"number\\\"==typeof t?new Float32Array(t):new Float32Array(Sk.ffi.remapToJs(t))})),t.__repr__=new Sk.builtin.func((function(n){for(var t=[],e=0;e0&&(i=(l/=v)*l,a=(s/=v)*s,c=(m/=v)*m,u=l*s,r=s*m,f=m*l,o=l*_,k=s*_,S=m*_,y=1-w,(b=Sk.misceval.callsimArray(n.Mat44)).elements[0]=y*i+w,b.elements[1]=y*u-S,b.elements[2]=y*f+k,b.elements[3]=0,b.elements[4]=y*u+S,b.elements[5]=y*a+w,b.elements[6]=y*r-o,b.elements[7]=0,b.elements[8]=y*f-k,b.elements[9]=y*r+o,b.elements[10]=y*c+w,b.elements[11]=0,b.elements[12]=0,b.elements[13]=0,b.elements[14]=0,b.elements[15]=1,b=b.multiply(e),e.elements=b.elements);return e})),t.multiply=new Sk.builtin.func((function(e,t){for(var l=Sk.misceval.callsimArray(n.Mat44),s=0;s<4;s++)l.elements[4*s+0]=e.elements[4*s+0]*t.elements[0]+e.elements[4*s+1]*t.elements[4]+e.elements[4*s+2]*t.elements[8]+e.elements[4*s+3]*t.elements[12],l.elements[4*s+1]=e.elements[4*s+0]*t.elements[1]+e.elements[4*s+1]*t.elements[5]+e.elements[4*s+2]*t.elements[9]+e.elements[4*s+3]*t.elements[13],l.elements[4*s+2]=e.elements[4*s+0]*t.elements[2]+e.elements[4*s+1]*t.elements[6]+e.elements[4*s+2]*t.elements[10]+e.elements[4*s+3]*t.elements[14],l.elements[4*s+3]=e.elements[4*s+0]*t.elements[3]+e.elements[4*s+1]*t.elements[7]+e.elements[4*s+2]*t.elements[11]+e.elements[4*s+3]*t.elements[15];return e.elements=l.elements,e})),t.lookAt=new Sk.builtin.func((function(e,t,l,s,m,i,a,c,u,r){var f=[t-m,l-i,s-a],o=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);o&&(f[0]/=o,f[1]/=o,f[2]/=o);var k=[c,u,r],S=[];S[0]=k[1]*f[2]-k[2]*f[1],S[1]=-k[0]*f[2]+k[2]*f[0],S[2]=k[0]*f[1]-k[1]*f[0],k[0]=f[1]*S[2]-f[2]*S[1],k[1]=-f[0]*S[2]+f[2]*S[0],k[2]=f[0]*S[1]-f[1]*S[0],(o=Math.sqrt(S[0]*S[0]+S[1]*S[1]+S[2]*S[2]))&&(S[0]/=o,S[1]/=o,S[2]/=o),(o=Math.sqrt(k[0]*k[0]+k[1]*k[1]+k[2]*k[2]))&&(k[0]/=o,k[1]/=o,k[2]/=o);var y=Sk.misceval.callsimArray(n.Mat44);return y.elements[0]=S[0],y.elements[4]=S[1],y.elements[8]=S[2],y.elements[12]=0,y.elements[1]=k[0],y.elements[5]=k[1],y.elements[9]=k[2],y.elements[13]=0,y.elements[2]=f[0],y.elements[6]=f[1],y.elements[10]=f[2],y.elements[14]=0,y.elements[3]=0,y.elements[7]=0,y.elements[11]=0,y.elements[15]=1,y=y.multiply(e),e.elements=y.elements,e.translate(-t,-l,-s),e}))}),\\\"Mat44\\\",[]),n.Mat33=Sk.misceval.buildClass(n,(function(e,n){n.__init__=new Sk.builtin.func((function(e){Sk.misceval.callsimArray(n.loadIdentity,[e])})),n.loadIdentity=new Sk.builtin.func((function(e){e.elements=[1,0,0,0,1,0,0,0,1]}))}),\\\"Mat33\\\",[]),n.Vec3=Sk.misceval.buildClass(n,(function(e,t){t.__init__=new Sk.builtin.func((function(e,n,t,l){e.x=n,e.y=t,e.z=l})),t.__sub__=new Sk.builtin.func((function(e,t){return Sk.misceval.callsimArray(n.Vec3,[e.x-t.x,e.y-t.y,e.z-t.z])}))}),\\\"Vec3\\\",[]),n.cross=new Sk.builtin.func((function(e,t){return Sk.asserts.assert(e instanceof n.Vec3&&t instanceof n.Vec3),Sk.misceval.callsimArray(n.Vec3,[e.y*t.z-e.z*t.y,e.z*t.x-e.x*t.z,e.x*t.y-e.y*t.x])})),n};\",\"src/lib/webgl/matrix4.js\":\"var $builtinmodule=function(n){var r={},t=new Float32Array(3),a=new Float32Array(3),u=new Float32Array(3),e=(new Float32Array(4),new Float32Array(4),new Float32Array(4),new Float32Array(16),new Float32Array(16),new Float32Array(16),function(n,r){for(var t=0,a=r.length,u=0;u1e-5)for(u=0;u{const n=e.$d;var r={},Buffer=function(t,e){var r=e||n.ARRAY_BUFFER,i=n.createBuffer();if(this.target=r,this.buf=i,this.set(t),this.numComponents_=t.numComponents,this.numElements_=t.numElements,this.totalComponents_=this.numComponents_*this.numElements_,t.buffer instanceof Float32Array)this.type_=n.FLOAT;else if(t.buffer instanceof Uint8Array)this.type_=n.UNSIGNED_BYTE;else if(t.buffer instanceof Int8Array)this.type_=n._BYTE;else if(t.buffer instanceof Uint16Array)this.type_=n.UNSIGNED_SHORT;else{if(!(t.buffer instanceof Int16Array))throw\\\"unhandled type:\\\"+typeof t.buffer;this.type_=n.SHORT}};return Buffer.prototype.set=function(t){n.bindBuffer(this.target,this.buf),n.bufferData(this.target,t.buffer,n.STATIC_DRAW)},Buffer.prototype.type=function(){return this.type_},Buffer.prototype.numComponents=function(){return this.numComponents_},Buffer.prototype.numElements=function(){return this.numElements_},Buffer.prototype.totalComponents=function(){return this.totalComponents_},Buffer.prototype.buffer=function(){return this.buf},Buffer.prototype.stride=function(){return 0},Buffer.prototype.offset=function(){return 0},r.Model=Sk.misceval.buildClass(r,(function(e,r){r.__init__=new Sk.builtin.func((function(e,r,i,f){e.buffers={};var setBuffer=function(t,r){var i=\\\"indices\\\"==t?n.ELEMENT_ARRAY_BUFFER:n.ARRAY_BUFFER;let f=e.buffers[t];f?f.set(r):f=new Buffer(r,i),e.buffers[t]=f};for(t in i)setBuffer(t,i[t]);var o={},s=0;for(var u in f)o[u]=s++;e.mode=n.TRIANGLES,e.textures=f.v,e.textureUnits=o,e.shader=r})),r.drawPrep=new Sk.builtin.func((function(t,e){var r=t.shader,i=t.buffers,f=t.textures;for(var o in e=Sk.ffi.remapToJs(e),Sk.misceval.callsimArray(r.use,[r]),i){var s=i[o];if(\\\"indices\\\"==o)n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,s.buffer());else{var u=r.attrib[o];u&&u(s)}}for(var a in f){var m=t.textureUnits[a];r.setUniform$impl(r,f,m),f[a].bindToUnit(m)}for(var p in e)r.setUniform$impl(r,p,e[p])})),r.draw=new Sk.builtin.func((function(t,e,r){var i=t.shader;e=Sk.ffi.remapToJs(e);for(let n in e)i.setUniform$impl(i,n,e[n]);if(r)for(var f in r){var o=t.textureUnits[f];i.setUniform$impl(i,f,o),r[f].bindToUnit(o)}var s=t.buffers;n.drawElements(t.mode,s.indices.totalComponents(),n.UNSIGNED_SHORT,0)}))}),\\\"Model\\\",[]),r}))};\",\"src/lib/webgl/primitives.js\":\"var $builtinmodule=function(t){var n={},AttribBuffer=function(t,n,e){e=e||\\\"Float32Array\\\";var r=window[e];n.length?(this.buffer=new r(n),n=this.buffer.length/t,this.cursor=n):(this.buffer=new r(t*n),this.cursor=0),this.numComponents=t,this.numElements=n,this.type=e};return AttribBuffer.prototype.stride=function(){return 0},AttribBuffer.prototype.offset=function(){return 0},AttribBuffer.prototype.getElement=function(t){for(var n=t*this.numComponents,e=[],r=0;r\";\n };\n this.saveCode = await this.manage_scrubber(saveCode);\n $(this.eContainer).remove();\n $(this.output).text(\"\");\n $(this.outDiv).show({ duration: 700, queue: false });\n try {\n eval(prog);\n this.errinfo = \"success\";\n } catch (e) {\n this.addErrorMessage(e);\n this.errinfo = e;\n }\n }\n\n addErrorMessage(err) {\n // Add the error message\n this.errLastRun = true;\n var errHead = $(\"

    \").html(\"Error\");\n this.eContainer = this.outerDiv.appendChild(\n document.createElement(\"div\")\n );\n this.eContainer.setAttribute(\"aria-live\", \"polite\");\n this.eContainer.setAttribute(\"aria-atomic\", \"true\");\n this.eContainer.setAttribute(\"role\", \"log\");\n this.eContainer.className = \"error alert alert-danger\";\n this.eContainer.id = this.divid + \"_errinfo\";\n this.eContainer.appendChild(errHead[0]);\n var errText = this.eContainer.appendChild(\n document.createElement(\"pre\")\n );\n var errString = err.toString();\n // screenreaders seem to miss error message without the delay\n setTimeout(() => {\n errText.innerHTML = errString;\n }, 10);\n console.log(\"Runtime Error: \" + err.toString());\n }\n}\n","// var testString = `[doctest] doctest version is \"2.4.11\"\n// [doctest] run with \"--help\" for options\n// asdf===============================================================================\n// prog.c:11:\n// TEST CASE: Factorials are computed\n\n// prog.c:15: ERROR: CHECK( factorial( 3) == 16 ) is NOT correct!\n// values: CHECK( 6 == 16 )\n\n// ===============================================================================\n// [doctest] test cases: 1 | 0 passed | 1 failed | 0 skipped\n// [doctest] assertions: 6 | 5 passed | 1 failed |\n// [doctest] Status: FAILURE!\n// `;\n\n\nexport default class DoctestTestParser {\n constructor(output, parentId) {\n const sep = \"===============================================================================\";\n\n // Split the output into the program output, the test output, and the test results\n // If all tests pass, there are no testDetails\n let parts = output.split(sep);\n\n let pre, testDetails, report;\n if (parts.length > 2) {\n pre = parts[0];\n testDetails = parts[1];\n report = parts[2];\n } else {\n pre = parts[0];\n testDetails = \"\";\n report = parts[1];\n }\n\n // Produce the output that we will display to the user - their output and the test output\n let cleanedOutput = \"\\n\";\n let programOutLines = pre.split(\"\\n\").slice(2); // Trim doxygen cruft\n cleanedOutput = \"Program output:\\n\";\n for (let line of programOutLines) {\n cleanedOutput += line + \"\\n\";\n }\n cleanedOutput += sep + \"\\n\";\n\n // If there are test details, add them to the output\n if (testDetails.trim() != \"\") {\n let testOutputLines = testDetails.split(\"\\n\");\n cleanedOutput += \"Test messages:\";\n for (let line of testOutputLines) {\n cleanedOutput += line + \"\\n\";\n }\n cleanedOutput += sep + \"\\n\";\n }\n\n let reportLines = report.split(\"\\n\");\n cleanedOutput += \"Test results:\";\n for (let line of reportLines) {\n cleanedOutput += line + \"\\n\";\n }\n\n cleanedOutput = cleanedOutput.trim();\n this.stdout = cleanedOutput;\n\n // Parse the test results for use by autograder\n let patt = new RegExp(\n \"\\\\[doctest\\\\] assertions: (?\\\\d+?) \\\\| (?\\\\d+?) passed \\\\| (?\\\\d+?) failed\",\n \"g\"\n );\n\n let matches = [...report.matchAll(patt)];\n if (matches.length > 0) {\n let match = matches[0];\n this.pct = 100 * match.groups.passed / match.groups.tests;\n\n let pctString = document.createElement(\"span\");\n pctString.innerHTML = match[0].replace(\"[doctest] \", \"\");\n this.pctString = pctString;\n\n this.passed = parseInt(match.groups.passed);\n this.failed = parseInt(match.groups.failed);\n\n // Make a pretty results table\n let parent = document.createElement(\"div\");\n parent.classList.add(\"unittest-results\");\n let tbl = document.createElement(\"table\");\n tbl.classList.add(\"ac-feedback\");\n parent.appendChild(tbl);\n parent.setAttribute(\"id\", `${parentId}_unit_results`);\n let trh = document.createElement(\"tr\");\n trh.innerHTML =\n `Result${$.i18n(\"msg_activecode_assertions_checked\")}Passed:Failed:`;\n tbl.appendChild(trh);\n let tr = document.createElement(\"tr\");\n let td = document.createElement(\"td\");\n td.classList.add(\"ac-feedback\");\n if (this.pct == 100) {\n td.innerHTML = $.i18n(\"msg_activecode_passed\");\n td.classList.add(\"ac-feedback-pass\");\n } else {\n td.innerHTML = $.i18n(\"msg_activecode_failed\");\n td.classList.add(\"ac-feedback-fail\");\n }\n tr.appendChild(td);\n tbl.appendChild(tr);\n\n td = document.createElement(\"td\");\n td.innerHTML = this.passed + this.failed;\n td.classList.add(\"ac-feedback\");\n tr.appendChild(td);\n\n td = document.createElement(\"td\");\n td.innerHTML = this.passed;\n td.classList.add(\"ac-feedback\");\n tr.appendChild(td);\n\n td = document.createElement(\"td\");\n td.innerHTML = this.failed;\n td.classList.add(\"ac-feedback\");\n tr.appendChild(td);\n\n tbl.appendChild(tr);\n this.table = parent;\n }\n }\n}\n\n// let x = new DoctestTestParser(testString);\n// console.log(x);\n","$.i18n().load({\n \"pt-br\": {\n msg_activecode_load_history: \"Carregar histórico\",\n msg_activecode_audio_tour: \"Tour de áudio\",\n msg_activecode_loaded_code: \"Código salvo carregado.\",\n msg_activecode_no_saved_code: \"Não há código salvo.\",\n msg_activecode_run_code: \"Executar\",\n msg_activecode_show_feedback: \"Exibir Feedbacks\",\n msg_activecode_show_code: \"Mostrar Código\",\n msg_activecode_hide_code: \"Ocultar Código\",\n msg_activecode_show_codelens: \"Mostrar CodeLens\",\n msg_activecode_show_in_codelens: \"Mostrar em CodeLens\",\n msg_activecode_hide_codelens: \"Ocultar Codelens\",\n msg_activecode_reformat: \"Reformatar\",\n\n msg_activecode_parse_error:\n \"Um erro de Parse significa que Python não entende a sintaxe da linha que a mensagem de erro aponta. Exemplos comuns são esquecer vírgulas entre argumentos ou esquecer ':' em um comando for.\",\n msg_activecode_parse_error_fix:\n \"Para corrigir um erro de Parse, você só precisa olhar cuidadosamente a linha com o erro e possivelmente a linha antes dela. Tenha certeza que estão de acordo com todas as regras de Python.\",\n msg_activecode_type_error:\n \"Erros de tipagem ocorrem mais frequentemente quando uma expressão tenta combinar dois objetos com tipos que não deveriam ser combinados. Como elevar uma String a uma potência.\",\n msg_activecode_type_error_fix:\n \"Para corrigir um erro de tipagem você provavelmente precisará percorrer seu código e ter certeza de que as variáveis possuem os tipos que você espera que elas tenham. Pode ser útil imprimir cada variável ao longo do caminho para checar se elas possuem o valor que você acha que deveriam ter.\",\n msg_activecode_name_error:\n \"Um erro de nome quase sempre significa que você usou uma variável antes dela ter um valor. Frequentemente isso pode ser um erro de digitação, então cheque a ortografia cuidadosamente.\",\n msg_activecode_name_error_fix:\n \"Cheque o lado direito das atribuições e suas chamadas de funções, são os lugares mais prováveis de encontrar um erro de nome.\",\n msg_activecode_value_error:\n \"Um erro de valor ocorre mais frequentemente quando uma função está esperando um tipo mas você passa um parâmetro de outro tipo.\",\n msg_activecode_value_error_fix:\n \"A mensagem de erro te dá uma boa dica sobre o nome da função e o valor incorreto. Leia atentamente a mensagem de erro e volte à variável que contém o valor problemático.\",\n msg_activecode_attribute_error:\n \"Essa mensagem de erro está te dizendo que o objeto do lado esquerdo do ponto não tem o atributo ou método do seu lado direito.\",\n msg_activecode_attribute_error_fix:\n \"A variante mais comum dessa mensagem é que o objeto indefinido não tem o atributo X. Isso diz que o objeto do lado esquerdo do ponto não é o que você pensa. Rastreie essa variável e imprima-a em vários lugares até descobrir onde ela se torna indefinida. Caso contrário, cheque se há erro de digitação no atributo do lado direito do ponto.\",\n msg_activecode_token_error:\n \"Na maioria das vezes este erro indica que você esqueceu de fechar um parênteses ou aspas.\",\n msg_activecode_token_error_fix:\n \"Cheque cada linha do seu programa e certifique-se de que todos os parênteses estão fechados.\",\n msg_activecode_time_limit_error:\n \"Seu programa está demorando muito. Os programas deste livro deveriam rodar em menos de 10 segundos. Isso provavelmente indica que seu programa está em um loop infinito.\",\n msg_activecode_time_limit_error_fix:\n \"Imprima mensagens em algumas linhas para descobrir se seu programa está em um loop infinito. Caso não esteja, você pode aumentar o tempo limite de execução com o comando sys.setExecutionLimit(ms)\",\n msg_activecode_general_error:\n \"Seu programa está demorando muito. Os programas deste livro deveriam rodar em menos de 30 segundos. Isso provavelmente indica que seu programa está em um loop infinito.\",\n msg_activecode_general_error_fix:\n \"Imprima mensagens em algumas linhas para descobrir se seu programa está em um loop infinito. Caso não esteja, você pode aumentar o tempo limite de execução com o comando sys.setExecutionLimit(ms)\",\n msg_activecode_syntax_error:\n \"Esta mensagem indica que Python não entendeu a sintaxe de um comando. Alguns exemplos são atribuição de um literal, ou uma chamada de função\",\n msg_activecode_syntax_error_fix:\n \"Cheque as atribuições de seu programa e certifique-se de que o lado esquerdo é uma variável, e não um literal ou função.\",\n msg_activecode_key_error:\n \"Esta mensagem indica que você está tentando acessar um elemento cuja chave não existe no dicionário.\",\n msg_activecode_key_error_fix:\n \"Você pode ter um erro de digitação no nome da sua chave. É uma boa prática checar se a chave existe usando um comando 'if (chave) in meu_dicionario'. Você também pode usar o comando 'meu_dicionario.get(chave, valorPadrão)' para obter o valor padrão ao invés de um erro caso a chave não exista.\",\n msg_activecode_index_error:\n \"Você está tentando acessar um índice além do final de uma string ou lista. Por exemplo, se sua lista possui 3 elementos nela e você tenta acessar o item na posição 3 ou mais.\",\n msg_activecode_index_error_fix:\n \"Lembre-se que o primeiro elemento de uma lista ou string está no índice 0, normalmente esta mensagem é exibida porque você errou o índice por 1. Em uma lista de tamanho 3, o último índice válido é 2\",\n msg_activecode_uri_error: \"\",\n msg_activecode_uri_error_fix: \"\",\n msg_activecode_import_error:\n \"Esta mensagem indica que você está tentando importar um módulo que não existe\",\n msg_activecode_import_error_fix:\n \"Um problema pode ser apenas um erro de digitação. Também pode ser que você está tentando importar um módulo que existe em Python 'real', mas não existe neste livro. Se este é o caso, por favor envie um pedido para ter esse módulo adicionado.\",\n msg_activecode_reference_error:\n \"Isso parece ser um erro interno, especialmente se a mensagem faz referência ao console.\",\n msg_activecode_reference_error_fix:\n \"Tente atualizar a página. Se o erro persistir, envie um relatório de bug junto com seu código\",\n msg_activecode_zero_division_error:\n \"Isso diz que você está tentando dividir por 0. Normalmente é porque o valor da variável no denominador de uma divisão tem o valor 0\",\n msg_activecode_zero_division_error_fix:\n \"Você pode proteger contra dividir por 0 com um comando 'if', ou você pode precisar reavaliar suas suposições sobre os valores das variáveis, pois um comando anterior pode ter inesperadamente atribuído o valor 0 a essa variável.\",\n msg_activecode_range_error:\n \"Esta mensagem quase sempre aparece na forma de 'Tamanho máximo da pilha de chamadas excedido'.\",\n msg_activecode_range_error_fix:\n \"Isso sempre ocorre quando uma função chama ela mesma. Provavelmente você não está fazendo isso de propósito, exceto no capítulo sobre recursão. Se você está nesse capítulo, então provavelmente ainda não identificou um bom caso base.\",\n msg_activecode_internal_error:\n \"Um erro interno pode significar que você desencadeou um bug no nosso Python\",\n msg_activecode_internal_error_fix:\n \"Reporte este erro como um bug, juntamente com seu código\",\n msg_activecode_indentation_error:\n \"Este erro ocorre quando você não indentou seu código devidamente. Isso é mais provável de ocorrer como parte de um comando if, for, while ou def.\",\n msg_activecode_indentation_error_fix:\n \"Cheque seus comandos if, def, for e while para ter certeza de que as linhas estão devidamente indentadas abaixo delas. Outra fonte deste erro é copiar e colar código em que você acidentalmente deixou restos de código que não pertencem mais ali.\",\n msg_activecode_not_implemented_error:\n \"Este erro ocorre quando você tenta usar uma função embutida de Python que não foi implementada nesta versão browser de Python.\",\n msg_activecode_not_implemented_error_fix:\n \"Por enquanto a única maneira de consertar isso é não usando a função. Podem haver soluções alternativas. Se você realmente precisa desta função embutida, envie-nos um relatório de bug e digac omo está tentando usar a função.\",\n\n msg_activecode_file_not_found: \"Arquivo não encontrado: '$1'\",\n msg_activecode_no_file_or_dir:\n \"[Erro nº 2] Arquivo ou diretório inexistente: '$1'\",\n msg_activecode_starting: \"Clique no botão de execução para começar $1\",\n msg_activecode_playing: \"Executando $1\",\n msg_activecode_loading_audio:\n \"Carregando áudio. Por favor, espere. Se o tour não começar logo, clique em 'Stop Tour' e tente novamente.\",\n msg_activecode_pause_current_audio: \"Pausar áudio atual\",\n msg_activecode_pause_audio: \"Pausar áudio\",\n msg_activecode_play_paused_audio: \"Reproduzir áudio pausado\",\n msg_activecode_audio_paused:\n \"$1 foi pausado. Clique no botão de execução para retomar o tour.\",\n msg_activecode_input_prg: \"Entrada para o programa\",\n msg_activecode_were_compiling_err:\n \"Houveram erros ao compilar seu código. Veja abaixo.\",\n msg_activecode_time_limit_exc: \"Limite de tempo excedido no seu programa\",\n msg_activecode_server_err: \"Um erro de servidor ocorreu\",\n msg_activecode_compiling_running:\n \"Compilando e executando seu código...\",\n msg_activecode_server_comm_err: \"Erro ao comunicar com o servidor.\",\n msg_activecode_save_run: \"Salvar & Executar\",\n msg_activecode_render: \"Salvar & Renderizar\",\n msg_activecode_assertion_error:\n \"Um erro de asserção ocorre quando python encontra um comando 'assert'. Python avalia a expressão do lado direito; se é verdadeira, o programa continua normalmente. Se é falsa, python gera um erro e para a execução.\" ,\n msg_activecode_assertion_error_fix:\n \"Cheque a expressão do lado direito de 'assert'. Essa expressão é falsa e é preciso verificar o motivo. Você pode querer imprimir cada parte da expressão e entender porque é falsa.\",\n msg_activecode_load_db: \"Carregando banco de dados...\",\n },\n});\n","var map = {\n\t\"./af\": 25177,\n\t\"./af.js\": 25177,\n\t\"./ar\": 61509,\n\t\"./ar-dz\": 41488,\n\t\"./ar-dz.js\": 41488,\n\t\"./ar-kw\": 58676,\n\t\"./ar-kw.js\": 58676,\n\t\"./ar-ly\": 42353,\n\t\"./ar-ly.js\": 42353,\n\t\"./ar-ma\": 24496,\n\t\"./ar-ma.js\": 24496,\n\t\"./ar-sa\": 82682,\n\t\"./ar-sa.js\": 82682,\n\t\"./ar-tn\": 89756,\n\t\"./ar-tn.js\": 89756,\n\t\"./ar.js\": 61509,\n\t\"./az\": 95533,\n\t\"./az.js\": 95533,\n\t\"./be\": 28959,\n\t\"./be.js\": 28959,\n\t\"./bg\": 47777,\n\t\"./bg.js\": 47777,\n\t\"./bm\": 54903,\n\t\"./bm.js\": 54903,\n\t\"./bn\": 61290,\n\t\"./bn.js\": 61290,\n\t\"./bo\": 31545,\n\t\"./bo.js\": 31545,\n\t\"./br\": 11470,\n\t\"./br.js\": 11470,\n\t\"./bs\": 44429,\n\t\"./bs.js\": 44429,\n\t\"./ca\": 7306,\n\t\"./ca.js\": 7306,\n\t\"./cs\": 56464,\n\t\"./cs.js\": 56464,\n\t\"./cv\": 73635,\n\t\"./cv.js\": 73635,\n\t\"./cy\": 64226,\n\t\"./cy.js\": 64226,\n\t\"./da\": 93601,\n\t\"./da.js\": 93601,\n\t\"./de\": 77853,\n\t\"./de-at\": 26111,\n\t\"./de-at.js\": 26111,\n\t\"./de-ch\": 54697,\n\t\"./de-ch.js\": 54697,\n\t\"./de.js\": 77853,\n\t\"./dv\": 60708,\n\t\"./dv.js\": 60708,\n\t\"./el\": 54691,\n\t\"./el.js\": 54691,\n\t\"./en-au\": 53872,\n\t\"./en-au.js\": 53872,\n\t\"./en-ca\": 28298,\n\t\"./en-ca.js\": 28298,\n\t\"./en-gb\": 56195,\n\t\"./en-gb.js\": 56195,\n\t\"./en-ie\": 66584,\n\t\"./en-ie.js\": 66584,\n\t\"./en-nz\": 79402,\n\t\"./en-nz.js\": 79402,\n\t\"./eo\": 32934,\n\t\"./eo.js\": 32934,\n\t\"./es\": 97650,\n\t\"./es-do\": 20838,\n\t\"./es-do.js\": 20838,\n\t\"./es-us\": 56575,\n\t\"./es-us.js\": 56575,\n\t\"./es.js\": 97650,\n\t\"./et\": 3035,\n\t\"./et.js\": 3035,\n\t\"./eu\": 3508,\n\t\"./eu.js\": 3508,\n\t\"./fa\": 119,\n\t\"./fa.js\": 119,\n\t\"./fi\": 90527,\n\t\"./fi.js\": 90527,\n\t\"./fo\": 52477,\n\t\"./fo.js\": 52477,\n\t\"./fr\": 85498,\n\t\"./fr-ca\": 26435,\n\t\"./fr-ca.js\": 26435,\n\t\"./fr-ch\": 37892,\n\t\"./fr-ch.js\": 37892,\n\t\"./fr.js\": 85498,\n\t\"./fy\": 37071,\n\t\"./fy.js\": 37071,\n\t\"./gd\": 70217,\n\t\"./gd.js\": 70217,\n\t\"./gl\": 77329,\n\t\"./gl.js\": 77329,\n\t\"./gom-latn\": 93383,\n\t\"./gom-latn.js\": 93383,\n\t\"./gu\": 95050,\n\t\"./gu.js\": 95050,\n\t\"./he\": 11713,\n\t\"./he.js\": 11713,\n\t\"./hi\": 43861,\n\t\"./hi.js\": 43861,\n\t\"./hr\": 26308,\n\t\"./hr.js\": 26308,\n\t\"./hu\": 90609,\n\t\"./hu.js\": 90609,\n\t\"./hy-am\": 17160,\n\t\"./hy-am.js\": 17160,\n\t\"./id\": 74063,\n\t\"./id.js\": 74063,\n\t\"./is\": 89374,\n\t\"./is.js\": 89374,\n\t\"./it\": 88383,\n\t\"./it.js\": 88383,\n\t\"./ja\": 23827,\n\t\"./ja.js\": 23827,\n\t\"./jv\": 89722,\n\t\"./jv.js\": 89722,\n\t\"./ka\": 41794,\n\t\"./ka.js\": 41794,\n\t\"./kk\": 27088,\n\t\"./kk.js\": 27088,\n\t\"./km\": 96870,\n\t\"./km.js\": 96870,\n\t\"./kn\": 84451,\n\t\"./kn.js\": 84451,\n\t\"./ko\": 63164,\n\t\"./ko.js\": 63164,\n\t\"./ky\": 78474,\n\t\"./ky.js\": 78474,\n\t\"./lb\": 79680,\n\t\"./lb.js\": 79680,\n\t\"./lo\": 15867,\n\t\"./lo.js\": 15867,\n\t\"./lt\": 45766,\n\t\"./lt.js\": 45766,\n\t\"./lv\": 69532,\n\t\"./lv.js\": 69532,\n\t\"./me\": 58076,\n\t\"./me.js\": 58076,\n\t\"./mi\": 41848,\n\t\"./mi.js\": 41848,\n\t\"./mk\": 30306,\n\t\"./mk.js\": 30306,\n\t\"./ml\": 73739,\n\t\"./ml.js\": 73739,\n\t\"./mr\": 86169,\n\t\"./mr.js\": 86169,\n\t\"./ms\": 73386,\n\t\"./ms-my\": 92297,\n\t\"./ms-my.js\": 92297,\n\t\"./ms.js\": 73386,\n\t\"./mt\": 77075,\n\t\"./mt.js\": 77075,\n\t\"./my\": 72264,\n\t\"./my.js\": 72264,\n\t\"./nb\": 22274,\n\t\"./nb.js\": 22274,\n\t\"./ne\": 8235,\n\t\"./ne.js\": 8235,\n\t\"./nl\": 92572,\n\t\"./nl-be\": 43784,\n\t\"./nl-be.js\": 43784,\n\t\"./nl.js\": 92572,\n\t\"./nn\": 54566,\n\t\"./nn.js\": 54566,\n\t\"./pa-in\": 29849,\n\t\"./pa-in.js\": 29849,\n\t\"./pl\": 94418,\n\t\"./pl.js\": 94418,\n\t\"./pt\": 79834,\n\t\"./pt-br\": 48303,\n\t\"./pt-br.js\": 48303,\n\t\"./pt.js\": 79834,\n\t\"./ro\": 24457,\n\t\"./ro.js\": 24457,\n\t\"./ru\": 82271,\n\t\"./ru.js\": 82271,\n\t\"./sd\": 1221,\n\t\"./sd.js\": 1221,\n\t\"./se\": 33478,\n\t\"./se.js\": 33478,\n\t\"./si\": 17538,\n\t\"./si.js\": 17538,\n\t\"./sk\": 5784,\n\t\"./sk.js\": 5784,\n\t\"./sl\": 46637,\n\t\"./sl.js\": 46637,\n\t\"./sq\": 86794,\n\t\"./sq.js\": 86794,\n\t\"./sr\": 45719,\n\t\"./sr-cyrl\": 3322,\n\t\"./sr-cyrl.js\": 3322,\n\t\"./sr.js\": 45719,\n\t\"./ss\": 56000,\n\t\"./ss.js\": 56000,\n\t\"./sv\": 41011,\n\t\"./sv.js\": 41011,\n\t\"./sw\": 40748,\n\t\"./sw.js\": 40748,\n\t\"./ta\": 11025,\n\t\"./ta.js\": 11025,\n\t\"./te\": 11885,\n\t\"./te.js\": 11885,\n\t\"./tet\": 28861,\n\t\"./tet.js\": 28861,\n\t\"./th\": 55802,\n\t\"./th.js\": 55802,\n\t\"./tl-ph\": 29231,\n\t\"./tl-ph.js\": 29231,\n\t\"./tlh\": 31052,\n\t\"./tlh.js\": 31052,\n\t\"./tr\": 85096,\n\t\"./tr.js\": 85096,\n\t\"./tzl\": 79846,\n\t\"./tzl.js\": 79846,\n\t\"./tzm\": 81765,\n\t\"./tzm-latn\": 97711,\n\t\"./tzm-latn.js\": 97711,\n\t\"./tzm.js\": 81765,\n\t\"./uk\": 16618,\n\t\"./uk.js\": 16618,\n\t\"./ur\": 57777,\n\t\"./ur.js\": 57777,\n\t\"./uz\": 57609,\n\t\"./uz-latn\": 72475,\n\t\"./uz-latn.js\": 72475,\n\t\"./uz.js\": 57609,\n\t\"./vi\": 21135,\n\t\"./vi.js\": 21135,\n\t\"./x-pseudo\": 64051,\n\t\"./x-pseudo.js\": 64051,\n\t\"./yo\": 82218,\n\t\"./yo.js\": 82218,\n\t\"./zh-cn\": 52648,\n\t\"./zh-cn.js\": 52648,\n\t\"./zh-hk\": 1632,\n\t\"./zh-hk.js\": 1632,\n\t\"./zh-tw\": 50304,\n\t\"./zh-tw.js\": 50304\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 35358;","/*\n\nhighlight v4\n\nHighlights arbitrary terms.\n\n\n\nMIT license.\n\nJohann Burkard\n\n\n\n*/\n\njQuery.fn.highlight = function(pat) {\n function innerHighlight(node, pat) {\n var skip = 0;\n if (node.nodeType == 3) {\n var pos = node.data.toUpperCase().indexOf(pat);\n if (pos >= 0) {\n var spannode = document.createElement('span');\n spannode.className = 'highlight';\n var middlebit = node.splitText(pos);\n var endbit = middlebit.splitText(pat.length);\n var middleclone = middlebit.cloneNode(true);\n spannode.appendChild(middleclone);\n middlebit.parentNode.replaceChild(spannode, middlebit);\n skip = 1;\n }\n }\n else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {\n for (var i = 0; i < node.childNodes.length; ++i) {\n i += innerHighlight(node.childNodes[i], pat);\n }\n }\n return skip;\n }\n return this.length && pat && pat.length ? this.each(function() {\n innerHighlight(this, pat.toUpperCase());\n }) : this;\n};\n\njQuery.fn.removeHighlight = function() {\n return this.find(\"span.highlight\").each(function() {\n this.parentNode.firstChild.nodeName;\n with (this.parentNode) {\n replaceChild(this.firstChild, this);\n normalize();\n }\n }).end();\n};\n","(function(){/*\n unicode_hack.js\n Copyright (C) 2010-2012 Marcelo Gibson de Castro Gonçalves. All rights reserved.\n\n Copying and distribution of this file, with or without modification,\n are permitted in any medium without royalty provided the copyright\n notice and this notice are preserved. This file is offered as-is,\n without any warranty.\n*/\n'use strict';var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1;$jscomp.FORCE_POLYFILL_PROMISE=!1;$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(D,R,a){if(D==Array.prototype||D==Object.prototype)return D;D[R]=a.value;return D};\n$jscomp.getGlobal=function(D){D=[\"object\"==typeof globalThis&&globalThis,D,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof global&&global];for(var R=0;Ra&&(a=Math.max(a+c,0));a\\\\|~\\\\xAC\\\\xB1\\\\xD7\\\\xF7\\\\u03F6\\\\u0606-\\\\u0608\\\\u2044\\\\u2052\\\\u207A-\\\\u207C\\\\u208A-\\\\u208C\\\\u2118\\\\u2140-\\\\u2144\\\\u214B\\\\u2190-\\\\u2194\\\\u219A\\\\u219B\\\\u21A0\\\\u21A3\\\\u21A6\\\\u21AE\\\\u21CE\\\\u21CF\\\\u21D2\\\\u21D4\\\\u21F4-\\\\u22FF\\\\u2320\\\\u2321\\\\u237C\\\\u239B-\\\\u23B3\\\\u23DC-\\\\u23E1\\\\u25B7\\\\u25C1\\\\u25F8-\\\\u25FF\\\\u266F\\\\u27C0-\\\\u27C4\\\\u27C7-\\\\u27E5\\\\u27F0-\\\\u27FF\\\\u2900-\\\\u2982\\\\u2999-\\\\u29D7\\\\u29DC-\\\\u29FB\\\\u29FE-\\\\u2AFF\\\\u2B30-\\\\u2B44\\\\u2B47-\\\\u2B4C\\\\uFB29\\\\uFE62\\\\uFE64-\\\\uFE66\\\\uFF0B\\\\uFF1C-\\\\uFF1E\\\\uFF5C\\\\uFF5E\\\\uFFE2\\\\uFFE9-\\\\uFFEC\",\nSo:\"\\\\xA6\\\\xA9\\\\xAE\\\\xB0\\\\u0482\\\\u058D\\\\u058E\\\\u060E\\\\u060F\\\\u06DE\\\\u06E9\\\\u06FD\\\\u06FE\\\\u07F6\\\\u09FA\\\\u0B70\\\\u0BF3-\\\\u0BF8\\\\u0BFA\\\\u0C7F\\\\u0D4F\\\\u0D79\\\\u0F01-\\\\u0F03\\\\u0F13\\\\u0F15-\\\\u0F17\\\\u0F1A-\\\\u0F1F\\\\u0F34\\\\u0F36\\\\u0F38\\\\u0FBE-\\\\u0FC5\\\\u0FC7-\\\\u0FCC\\\\u0FCE\\\\u0FCF\\\\u0FD5-\\\\u0FD8\\\\u109E\\\\u109F\\\\u1390-\\\\u1399\\\\u166D\\\\u1940\\\\u19DE-\\\\u19FF\\\\u1B61-\\\\u1B6A\\\\u1B74-\\\\u1B7C\\\\u2100\\\\u2101\\\\u2103-\\\\u2106\\\\u2108\\\\u2109\\\\u2114\\\\u2116\\\\u2117\\\\u211E-\\\\u2123\\\\u2125\\\\u2127\\\\u2129\\\\u212E\\\\u213A\\\\u213B\\\\u214A\\\\u214C\\\\u214D\\\\u214F\\\\u218A\\\\u218B\\\\u2195-\\\\u2199\\\\u219C-\\\\u219F\\\\u21A1\\\\u21A2\\\\u21A4\\\\u21A5\\\\u21A7-\\\\u21AD\\\\u21AF-\\\\u21CD\\\\u21D0\\\\u21D1\\\\u21D3\\\\u21D5-\\\\u21F3\\\\u2300-\\\\u2307\\\\u230C-\\\\u231F\\\\u2322-\\\\u2328\\\\u232B-\\\\u237B\\\\u237D-\\\\u239A\\\\u23B4-\\\\u23DB\\\\u23E2-\\\\u2426\\\\u2440-\\\\u244A\\\\u249C-\\\\u24E9\\\\u2500-\\\\u25B6\\\\u25B8-\\\\u25C0\\\\u25C2-\\\\u25F7\\\\u2600-\\\\u266E\\\\u2670-\\\\u2767\\\\u2794-\\\\u27BF\\\\u2800-\\\\u28FF\\\\u2B00-\\\\u2B2F\\\\u2B45\\\\u2B46\\\\u2B4D-\\\\u2B73\\\\u2B76-\\\\u2B95\\\\u2B97-\\\\u2BFF\\\\u2CE5-\\\\u2CEA\\\\u2E50\\\\u2E51\\\\u2E80-\\\\u2E99\\\\u2E9B-\\\\u2EF3\\\\u2F00-\\\\u2FD5\\\\u2FF0-\\\\u2FFB\\\\u3004\\\\u3012\\\\u3013\\\\u3020\\\\u3036\\\\u3037\\\\u303E\\\\u303F\\\\u3190\\\\u3191\\\\u3196-\\\\u319F\\\\u31C0-\\\\u31E3\\\\u3200-\\\\u321E\\\\u322A-\\\\u3247\\\\u3250\\\\u3260-\\\\u327F\\\\u328A-\\\\u32B0\\\\u32C0-\\\\u33FF\\\\u4DC0-\\\\u4DFF\\\\uA490-\\\\uA4C6\\\\uA828-\\\\uA82B\\\\uA836\\\\uA837\\\\uA839\\\\uAA77-\\\\uAA79\\\\uFDFD\\\\uFFE4\\\\uFFE8\\\\uFFED\\\\uFFEE\\\\uFFFC\\\\uFFFD\",\nZl:\"\\\\u2028\",Zp:\"\\\\u2029\",Zs:\" \\\\xA0\\\\u1680\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000\"};D.C=D.Cc+D.Cf+D.Cs+D.Co+D.Cn;D.L=D.Lu+D.Ll+D.Lt+D.Lm+D.Mn+D.Lo;D.LC=D.Lu+D.Ll+D.Lt;D.M=D.Mn+D.Mc+D.Me;D.N=D.Nd+D.Nl+D.No;D.P=D.Pc+D.Pd+D.Ps+D.Pe+D.Pi+D.Pf+D.Po;D.S=D.Sm+D.Sc+D.Sk+D.So;D.Z=D.Zs+D.Zl+D.Zp;D.w=\"_\"+D.L+D.N;D.b=\"(?:[\"+D.w+\"](?:[^\"+D.w+\"]|$)|(?:^|[^\"+D.w+\"])[\"+D.w+\"])\";D.bOut=\"(?=[^\"+D.w+\"]|$)\";D.bIn=\"(?:^|[^\"+D.w+\"])\";D.bInCapture=\"(?:^|([^\"+D.w+\"]))\";D.B=\"(?:[\"+D.w+\"][\"+D.w+\"]|[^\"+D.w+\"][^\"+D.w+\"])\";D.d=\nD.N;R[\"default\"]=D},function(D,R,a){a(3);Sk.global.strftime=a(4);a(5);a(7);a(8);a(10);a(11);a(12);a(13);a(14);a(15);a(16);a(17);a(18);a(19);[Sk.builtin.object,Sk.builtin.type].forEach(d=>{Sk.abstr.setUpSlots(d);Sk.abstr.setUpMethods(d);Sk.abstr.setUpGetSets(d);Sk.abstr.setUpClassMethods(d)});a(20);a(21);a(22);[Sk.builtin.str,Sk.builtin.none,Sk.builtin.NotImplemented,Sk.builtin.object].forEach(d=>{d=d.prototype;d.__doc__=d.hasOwnProperty(\"tp$doc\")?new Sk.builtin.str(d.tp$doc):Sk.builtin.none.none$});\na(23);a(24);a(25);a(26);a(27);a(28);a(29);a(30);a(32);a(33);a(34);a(35);a(36);a(37);a(38);a(39);a(40);a(41);a(42);a(43);a(44);a(45);a(46);a(47);a(48);a(49);a(50);a(51);a(52);a(53);a(54);a(55);a(56);a(57);a(58);a(59);a(60);a(61);a(62);a(63);a(64);a(65);a(66);a(67)},function(D,R,a){(function(d){var c={build:{githash:\"0fe28593db57ef5bdfe04e372d61c5fb2b10d235\",date:\"2025-07-31T16:07:07.506Z\"}};c.global=\"undefined\"!==typeof d?d:\"undefined\"!==typeof self?self:\"undefined\"!==typeof window?window:{};c.exportSymbol=\nfunction(e,k){e=e.split(\".\");var p=c.global,h;for(h=0;hG.getHours()?K.am:K.pm;break;case 82:U+=q(K.formats.R,G,K,S);break;case 83:U+=d(G.getSeconds(),r);break;case 84:U+=q(K.formats.T,G,K,S);break;case 85:U+=d(k(G,\"sunday\"),r);break;case 87:U+=d(k(G,\"monday\"),r);break;case 88:U+=q(K.formats.X,G,K,S);break;case 89:U+=\nG.getFullYear();break;case 90:v&&0===x?U+=\"GMT\":(r=G,r=(r=r.toString().match(/\\(([\\w\\s]+)\\)/))&&r[1],U+=r||\"\");break;case 97:U+=K.shortDays[G.getDay()];break;case 98:U+=K.shortMonths[G.getMonth()];break;case 99:U+=q(K.formats.c,G,K,S);break;case 100:U+=d(G.getDate(),r);break;case 101:U+=d(G.getDate(),null==r?\" \":r);break;case 104:U+=K.shortMonths[G.getMonth()];break;case 106:r=new Date(G.getFullYear(),0,1);r=Math.ceil((G.getTime()-r.getTime())/864E5);U+=c(r);break;case 107:U+=d(G.getHours(),null==\nr?\" \":r);break;case 108:U+=d(e(G.getHours()),null==r?\" \":r);break;case 109:U+=d(G.getMonth()+1,r);break;case 110:U+=\"\\n\";break;case 111:r=G.getDate();U=K.ordinalSuffixes?U+(String(r)+(K.ordinalSuffixes[r-1]||p(r))):U+(String(r)+p(r));break;case 112:U+=12>G.getHours()?K.AM:K.PM;break;case 114:U+=q(K.formats.r,G,K,S);break;case 115:U+=Math.floor(S/1E3);break;case 116:U+=\"\\t\";break;case 117:r=G.getDay();U+=0===r?7:r;break;case 118:U+=q(K.formats.v,G,K,S);break;case 119:U+=G.getDay();break;case 120:U+=\nq(K.formats.x,G,K,S);break;case 121:y=G.getFullYear()%100;U+=d(y,r);break;case 122:v&&0===x?U+=J?\"+00:00\":\"+0000\":(r=0!==x?x/6E4:-G.getTimezoneOffset(),y=J?\":\":\"\",X=Math.abs(r%60),U+=(0>r?\"-\":\"+\")+d(Math.floor(Math.abs(r/60)))+y+d(X));break;default:y&&(U+=\"%\"),U+=z[Q]}r=null;y=!1}else 37===X?y=!0:U+=z[Q]}return U}var w=g||b,x=t||0,v=l||!1,C=0,E,L=function(z,G){if(G){var K=G.getTime();if(v){var S=6E4*(G.getTimezoneOffset()||0);G=new Date(K+S+x);6E4*(G.getTimezoneOffset()||0)!==S&&(G=6E4*(G.getTimezoneOffset()||\n0),G=new Date(K+G+x))}}else K=Date.now(),K>C?(C=K,E=new Date(C),K=C,v&&(E=new Date(C+6E4*(E.getTimezoneOffset()||0)+x))):K=C,G=E;return q(z,G,w,K)};L.localize=function(z){return new a(z||w,x,v)};L.localizeByIdentifier=function(z){var G=f[z];return G?L.localize(G):(h('[WARNING] No locale found with identifier \"'+z+'\".'),L)};L.timezone=function(z){var G=x,K=v,S=typeof z;if(\"number\"===S||\"string\"===S)K=!0,\"string\"===S?(G=\"-\"===z[0]?-1:1,S=parseInt(z.slice(1,3),10),z=parseInt(z.slice(3,5),10),G=G*(60*\nS+z)*6E4):\"number\"===S&&(G=6E4*z);return new a(w,G,K)};L.utc=function(){return new a(w,x,!0)};return L}function d(g,t){if(\"\"===t||9=g||0===t||4<=t)return\"th\";switch(t){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\"}}function h(g){\"undefined\"!==typeof console&&\"function\"==typeof console.warn&&console.warn(g)}var f={de_DE:{identifier:\"de-DE\",days:\"Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag\".split(\" \"),shortDays:\"So Mo Di Mi Do Fr Sa\".split(\" \"),months:\"Januar Februar M\\u00e4rz April Mai Juni Juli August September Oktober November Dezember\".split(\" \"),shortMonths:\"Jan Feb M\\u00e4r Apr Mai Jun Jul Aug Sep Okt Nov Dez\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d.%m.%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},en_CA:{identifier:\"en-CA\",days:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),shortDays:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),ordinalSuffixes:\"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}},en_US:{identifier:\"en-US\",days:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),shortDays:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),ordinalSuffixes:\"st nd rd th th th th th th th th th th th th th th th th th st nd rd th th th th th th th st\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%m/%d/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}},es_MX:{identifier:\"es-MX\",days:\"domingo lunes martes mi\\u00e9rcoles jueves viernes s\\u00e1bado\".split(\" \"),shortDays:\"dom lun mar mi\\u00e9 jue vie s\\u00e1b\".split(\" \"),months:\"enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre\".split(\" \"),shortMonths:\"ene feb mar abr may jun jul ago sep oct nov dic\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},fr_FR:{identifier:\"fr-FR\",days:\"dimanche lundi mardi mercredi jeudi vendredi samedi\".split(\" \"),shortDays:\"dim. lun. mar. mer. jeu. ven. sam.\".split(\" \"),months:\"janvier f\\u00e9vrier mars avril mai juin juillet ao\\u00fbt septembre octobre novembre d\\u00e9cembre\".split(\" \"),shortMonths:\"janv. f\\u00e9vr. mars avril mai juin juil. ao\\u00fbt sept. oct. nov. d\\u00e9c.\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},it_IT:{identifier:\"it-IT\",days:\"domenica luned\\u00ec marted\\u00ec mercoled\\u00ec gioved\\u00ec venerd\\u00ec sabato\".split(\" \"),shortDays:\"dom lun mar mer gio ven sab\".split(\" \"),months:\"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre\".split(\" \"),shortMonths:\"gen feb mar apr mag giu lug ago set ott nov dic\".split(\" \"),\nAM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},nl_NL:{identifier:\"nl-NL\",days:\"zondag maandag dinsdag woensdag donderdag vrijdag zaterdag\".split(\" \"),shortDays:\"zo ma di wo do vr za\".split(\" \"),months:\"januari februari maart april mei juni juli augustus september oktober november december\".split(\" \"),shortMonths:\"jan feb mrt apr mei jun jul aug sep okt nov dec\".split(\" \"),AM:\"AM\",PM:\"PM\",\nam:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d-%m-%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},pt_BR:{identifier:\"pt-BR\",days:\"domingo segunda ter\\u00e7a quarta quinta sexta s\\u00e1bado\".split(\" \"),shortDays:\"Dom Seg Ter Qua Qui Sex S\\u00e1b\".split(\" \"),months:\"janeiro fevereiro mar\\u00e7o abril maio junho julho agosto setembro outubro novembro dezembro\".split(\" \"),shortMonths:\"Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez\".split(\" \"),AM:\"AM\",PM:\"PM\",\nam:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d-%m-%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},ru_RU:{identifier:\"ru-RU\",days:\"\\u0412\\u043e\\u0441\\u043a\\u0440\\u0435\\u0441\\u0435\\u043d\\u044c\\u0435 \\u041f\\u043e\\u043d\\u0435\\u0434\\u0435\\u043b\\u044c\\u043d\\u0438\\u043a \\u0412\\u0442\\u043e\\u0440\\u043d\\u0438\\u043a \\u0421\\u0440\\u0435\\u0434\\u0430 \\u0427\\u0435\\u0442\\u0432\\u0435\\u0440\\u0433 \\u041f\\u044f\\u0442\\u043d\\u0438\\u0446\\u0430 \\u0421\\u0443\\u0431\\u0431\\u043e\\u0442\\u0430\".split(\" \"),\nshortDays:\"\\u0412\\u0441 \\u041f\\u043d \\u0412\\u0442 \\u0421\\u0440 \\u0427\\u0442 \\u041f\\u0442 \\u0421\\u0431\".split(\" \"),months:\"\\u042f\\u043d\\u0432\\u0430\\u0440\\u044c \\u0424\\u0435\\u0432\\u0440\\u0430\\u043b\\u044c \\u041c\\u0430\\u0440\\u0442 \\u0410\\u043f\\u0440\\u0435\\u043b\\u044c \\u041c\\u0430\\u0439 \\u0418\\u044e\\u043d\\u044c \\u0418\\u044e\\u043b\\u044c \\u0410\\u0432\\u0433\\u0443\\u0441\\u0442 \\u0421\\u0435\\u043d\\u0442\\u044f\\u0431\\u0440\\u044c \\u041e\\u043a\\u0442\\u044f\\u0431\\u0440\\u044c \\u041d\\u043e\\u044f\\u0431\\u0440\\u044c \\u0414\\u0435\\u043a\\u0430\\u0431\\u0440\\u044c\".split(\" \"),\nshortMonths:\"\\u044f\\u043d\\u0432 \\u0444\\u0435\\u0432 \\u043c\\u0430\\u0440 \\u0430\\u043f\\u0440 \\u043c\\u0430\\u0439 \\u0438\\u044e\\u043d \\u0438\\u044e\\u043b \\u0430\\u0432\\u0433 \\u0441\\u0435\\u043d \\u043e\\u043a\\u0442 \\u043d\\u043e\\u044f \\u0434\\u0435\\u043a\".split(\" \"),AM:\"AM\",PM:\"PM\",am:\"am\",pm:\"pm\",formats:{c:\"%a %d %b %Y %X\",D:\"%d.%m.%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},tr_TR:{identifier:\"tr-TR\",days:\"Pazar Pazartesi Sal\\u0131 \\u00c7ar\\u015famba Per\\u015fembe Cuma Cumartesi\".split(\" \"),\nshortDays:\"Paz Pzt Sal \\u00c7r\\u015f Pr\\u015f Cum Cts\".split(\" \"),months:\"Ocak \\u015eubat Mart Nisan May\\u0131s Haziran Temmuz A\\u011fustos Eyl\\u00fcl Ekim Kas\\u0131m Aral\\u0131k\".split(\" \"),shortMonths:\"Oca \\u015eub Mar Nis May Haz Tem A\\u011fu Eyl Eki Kas Ara\".split(\" \"),AM:\"\\u00d6\\u00d6\",PM:\"\\u00d6S\",am:\"\\u00d6\\u00d6\",pm:\"\\u00d6S\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d-%m-%Y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%T\",x:\"%D\"}},zh_CN:{identifier:\"zh-CN\",days:\"\\u661f\\u671f\\u65e5 \\u661f\\u671f\\u4e00 \\u661f\\u671f\\u4e8c \\u661f\\u671f\\u4e09 \\u661f\\u671f\\u56db \\u661f\\u671f\\u4e94 \\u661f\\u671f\\u516d\".split(\" \"),\nshortDays:\"\\u65e5\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\".split(\"\"),months:\"\\u4e00\\u6708\\u4efd \\u4e8c\\u6708\\u4efd \\u4e09\\u6708\\u4efd \\u56db\\u6708\\u4efd \\u4e94\\u6708\\u4efd \\u516d\\u6708\\u4efd \\u4e03\\u6708\\u4efd \\u516b\\u6708\\u4efd \\u4e5d\\u6708\\u4efd \\u5341\\u6708\\u4efd \\u5341\\u4e00\\u6708\\u4efd \\u5341\\u4e8c\\u6708\\u4efd\".split(\" \"),shortMonths:\"\\u4e00\\u6708 \\u4e8c\\u6708 \\u4e09\\u6708 \\u56db\\u6708 \\u4e94\\u6708 \\u516d\\u6708 \\u4e03\\u6708 \\u516b\\u6708 \\u4e5d\\u6708 \\u5341\\u6708 \\u5341\\u4e00\\u6708 \\u5341\\u4e8c\\u6708\".split(\" \"),\nAM:\"\\u4e0a\\u5348\",PM:\"\\u4e0b\\u5348\",am:\"\\u4e0a\\u5348\",pm:\"\\u4e0b\\u5348\",formats:{c:\"%a %d %b %Y %X %Z\",D:\"%d/%m/%y\",F:\"%Y-%m-%d\",R:\"%H:%M\",r:\"%I:%M:%S %p\",T:\"%H:%M:%S\",v:\"%e-%b-%Y\",X:\"%r\",x:\"%D\"}}},b=f.en_US,m=new a(b,0,!1);if(\"undefined\"!==typeof D)var n=D.exports=m;else n=function(){return this||(0,eval)(\"this\")}(),n.strftime=m;\"function\"!==typeof Date.now&&(Date.now=function(){return+new Date})})()},function(D,R,a){D=a(6);const d=Sk.global.JSBI=void 0!==Sk.global.BigInt?{}:D;void 0===Sk.global.BigInt?\n(d.__isBigInt||(d.__isBigInt=c=>c instanceof d),d.powermod=(c,e,k)=>{const p=d.BigInt(1);let h=p;for(e=d.greaterThan(e,d.__ZERO)?e:d.unaryMinus(e);d.greaterThan(e,d.__ZERO);)d.bitwiseAnd(e,p)&&(h=d.remainder(d.multiply(h,c),k)),e=d.signedRightShift(e,p),c=d.remainder(d.multiply(c,c),k);return h}):Object.assign(d,{BigInt:Sk.global.BigInt,toNumber:c=>Number(c),toString:c=>c.toString(),__isBigInt:c=>\"bigint\"===typeof c,unaryMinus:c=>-c,bitwiseNot:c=>~c,bitwiseAnd:(c,e)=>c&e,bitwiseOr:(c,e)=>c|e,bitwiseXor:(c,\ne)=>c^e,exponentiate:(c,e)=>{const k=d.BigInt(1);let p=k;for(e=e>d.__ZERO?e:-e;e>d.__ZERO;)e&k&&(p*=c),e>>=k,c*=c;return p},powermod:(c,e,k)=>{const p=d.BigInt(1);let h=p;for(e=e>d.__ZERO?e:-e;e>d.__ZERO;)e&p&&(h=h*c%k),e>>=p,c=c*c%k;return h},multiply:(c,e)=>c*e,divide:(c,e)=>c/e,remainder:(c,e)=>c%e,add:(c,e)=>c+e,subtract:(c,e)=>c-e,leftShift:(c,e)=>c<c>>e,unsignedRightShift:(c,e)=>c>>>e,lessThan:(c,e)=>cc<=e,greaterThan:(c,e)=>c>e,greaterThanOrEqual:(c,\ne)=>c>=e,equal:(c,e)=>c===e,notEqual:(c,e)=>c!==e});d.__ZERO=d.BigInt(0);d.__MAX_SAFE=d.BigInt(Number.MAX_SAFE_INTEGER);d.__MIN_SAFE=d.BigInt(-Number.MAX_SAFE_INTEGER);d.numberIfSafe=c=>d.lessThan(c,d.__MAX_SAFE)&&d.greaterThan(c,d.__MIN_SAFE)?d.toNumber(c):c;d.BigUp=c=>d.__isBigInt(c)?c:d.BigInt(c)},function(D,R,a){(function(d,c){D.exports=c()})(this,function(){var d=Math.imul,c=Math.clz32,e=Math.abs,k=Math.max,p=Math.floor;class h extends Array{constructor(f,b){if(super(f),this.sign=b,f>h.__kMaxLength)throw new RangeError(\"Maximum BigInt size exceeded\");\n}static BigInt(f){var b=Number.isFinite;if(\"number\"==typeof f){if(0===f)return h.__zero();if(h.__isOneDigitInt(f))return 0>f?h.__oneDigit(-f,!0):h.__oneDigit(f,!1);if(!b(f)||p(f)!==f)throw new RangeError(\"The number \"+f+\" cannot be converted to BigInt because it is not an integer\");return h.__fromDouble(f)}if(\"string\"==typeof f){b=h.__fromString(f);if(null===b)throw new SyntaxError(\"Cannot convert \"+f+\" to a BigInt\");return b}if(\"boolean\"==typeof f)return!0===f?h.__oneDigit(1,!1):h.__zero();if(\"object\"==\ntypeof f){if(f.constructor===h)return f;f=h.__toPrimitive(f);return h.BigInt(f)}throw new TypeError(\"Cannot convert \"+f+\" to a BigInt\");}toDebugString(){const f=[\"BigInt[\"];for(const b of this)f.push((b?(b>>>0).toString(16):b)+\", \");return f.push(\"]\"),f.join(\"\")}toString(f){f=void 0===f?10:f;if(2>f||36>>12;const q=l-12;b=12<=l?0:n<<20+l;l=20+l;for(0>>30-q,b=n<>>30-l,l-=30;n=h.__decideRounding(f,l,t,n);if((1===n||0===n&&1==(1&b))&&(b=b+1>>>0,0===b&&(g++,0!=g>>>20&&(g=0,m++,1023=h.__kMaxLengthBits)throw new RangeError(\"BigInt too big\");if(1===f.length&&2===f.__digit(0)){var m=1+(0|b/30);f=new h(m,f.sign&&0!=(1&b));f.__initializeDigits();return f.__setDigit(m-1,1<>=1;0!==b;b>>=1)n=h.multiply(n,n),0!=(1&b)&&(null===m?m=n:m=h.multiply(m,n));return m}static multiply(f,b){if(0===f.length)return f;\nif(0===b.length)return b;var m=f.length+b.length;30<=f.__clzmsd()+b.__clzmsd()&&m--;m=new h(m,f.sign!==b.sign);m.__initializeDigits();for(let n=0;nh.__absoluteCompare(f,b))return h.__zero();const m=f.sign!==b.sign,n=b.__unsignedDigit(0);if(1===b.length&&32767>=n){if(1===n)return m===f.sign?f:h.unaryMinus(f);f=h.__absoluteDivSmall(f,n,null)}else f=\nh.__absoluteDivLarge(f,b,!0,!1);return f.sign=m,f.__trim()}static remainder(f,b){if(0===b.length)throw new RangeError(\"Division by zero\");if(0>h.__absoluteCompare(f,b))return f;const m=b.__unsignedDigit(0);if(1===b.length&&32767>=m){if(1===m)return h.__zero();b=h.__absoluteModSmall(f,m);return 0===b?h.__zero():h.__oneDigit(b,f.sign)}b=h.__absoluteDivLarge(f,b,!1,!0);return b.sign=f.sign,b.__trim()}static add(f,b){const m=f.sign;return m===b.sign?h.__absoluteAdd(f,b,m):0<=h.__absoluteCompare(f,b)?\nh.__absoluteSub(f,b,m):h.__absoluteSub(b,f,!m)}static subtract(f,b){const m=f.sign;return m===b.sign?0<=h.__absoluteCompare(f,b)?h.__absoluteSub(f,b,m):h.__absoluteSub(b,f,!m):h.__absoluteAdd(f,b,m)}static leftShift(f,b){return 0===b.length||0===f.length?f:b.sign?h.__rightShiftByAbsolute(f,b):h.__leftShiftByAbsolute(f,b)}static signedRightShift(f,b){return 0===b.length||0===f.length?f:b.sign?h.__leftShiftByAbsolute(f,b):h.__rightShiftByAbsolute(f,b)}static unsignedRightShift(){throw new TypeError(\"BigInts have no unsigned right shift; use >> instead\");\n}static lessThan(f,b){return 0>h.__compareToBigInt(f,b)}static lessThanOrEqual(f,b){return 0>=h.__compareToBigInt(f,b)}static greaterThan(f,b){return 0f)throw new RangeError(\"Invalid value: not (convertible to) a safe integer\");if(0===f)return h.__zero();if(f>=h.__kMaxLengthBits)return b;const m=0|(f+29)/30;if(b.lengthf)throw new RangeError(\"Invalid value: not (convertible to) a safe integer\");if(0===f)return h.__zero();if(b.sign){if(f>h.__kMaxLengthBits)throw new RangeError(\"BigInt too big\");return h.__truncateAndSubFromPowerOfTwo(f,b,!1)}if(f>=h.__kMaxLengthBits)return b;const m=0|(f+29)/30;if(b.length>>n?h.__truncateToNBits(f,\nb):b}static ADD(f,b){if(f=h.__toPrimitive(f),b=h.__toPrimitive(b),\"string\"==typeof f)return\"string\"!=typeof b&&(b=b.toString()),f+b;if(\"string\"==typeof b)return f.toString()+b;if(f=h.__toNumeric(f),b=h.__toNumeric(b),h.__isBigInt(f)&&h.__isBigInt(b))return h.add(f,b);if(\"number\"==typeof f&&\"number\"==typeof b)return f+b;throw new TypeError(\"Cannot mix BigInt and other types, use explicit conversions\");}static LT(f,b){return h.__compare(f,b,0)}static LE(f,b){return h.__compare(f,b,1)}static GT(f,b){return h.__compare(f,\nb,2)}static GE(f,b){return h.__compare(f,b,3)}static EQ(f,b){for(;;){if(h.__isBigInt(f))return h.__isBigInt(b)?h.equal(f,b):h.EQ(b,f);if(\"number\"==typeof f){if(h.__isBigInt(b))return h.__equalToNumber(b,f);if(\"object\"!=typeof b)return f==b;b=h.__toPrimitive(b)}else if(\"string\"==typeof f){if(h.__isBigInt(b))return f=h.__fromString(f),null!==f&&h.equal(f,b);if(\"object\"!=typeof b)return f==b;b=h.__toPrimitive(b)}else if(\"boolean\"==typeof f){if(h.__isBigInt(b))return h.__equalToNumber(b,+f);if(\"object\"!=\ntypeof b)return f==b;b=h.__toPrimitive(b)}else if(\"symbol\"==typeof f){if(h.__isBigInt(b))return!1;if(\"object\"!=typeof b)return f==b;b=h.__toPrimitive(b)}else if(\"object\"==typeof f){if(\"object\"==typeof b&&b.constructor!==h)return f==b;f=h.__toPrimitive(f)}else return f==b}}static NE(f,b){return!h.EQ(f,b)}static __zero(){return new h(0,!1)}static __oneDigit(f,b){b=new h(1,b);return b.__setDigit(0,f),b}__copy(){const f=new h(this.length,this.sign);for(let b=0;bb)b=-b-1;else{if(0===m)return-1;m--;n=f.__digit(m);b=29}b=1<>>20)-1023,m=(0|b/30)+1;f=new h(m,0>f);\nlet n=1048575&h.__kBitConversionInts[1]|1048576,g=h.__kBitConversionInts[0];b%=30;let t;if(20>b){var l=20-b;t=l+32;b=n>>>l;n=n<<32-l|g>>>l;g<<=32-l}else 20===b?(t=32,b=n,n=g):(l=b-20,t=32-l,b=n<>>32-l,n=g<>>2,n=n<<30|g>>>2,g<<=30):b=0,f.__setDigit(m,b);return f.__trim()}static __isWhitespace(f){return!!(13>=f&&9<=f)||(159>=f?32==f:131071>=f?160==f||5760==f:196607>=f?(f&=131071,10>=f||40==f||41==f||47==f||95==f||4096==f):65279==f)}static __fromString(f,\nb){b=void 0===b?0:b;let m=0;const n=f.length;let g=0;if(g===n)return h.__zero();let t=f.charCodeAt(g);for(;h.__isWhitespace(t);){if(++g===n)return h.__zero();t=f.charCodeAt(g)}if(43===t){if(++g===n)return null;t=f.charCodeAt(g);m=1}else if(45===t){if(++g===n)return null;t=f.charCodeAt(g);m=-1}if(0===b){if(b=10,48===t){if(++g===n)return h.__zero();if(t=f.charCodeAt(g),88===t||120===t){if(b=16,++g===n)return null;t=f.charCodeAt(g)}else if(79===t||111===t){if(b=8,++g===n)return null;t=f.charCodeAt(g)}else if(66===\nt||98===t){if(b=2,++g===n)return null;t=f.charCodeAt(g)}}}else if(16===b&&48===t){if(++g===n)return h.__zero();if(t=f.charCodeAt(g),88===t||120===t){if(++g===n)return null;t=f.charCodeAt(g)}}if(0!=m&&10!==b)return null;for(;48===t;){if(++g===n)return h.__zero();t=f.charCodeAt(g)}var l=n-g;let q=h.__kMaxBitsPerChar[b];var w=h.__kBitsPerCharTableMultiplier-1;if(l>1073741824/q)return null;l=new h(0|((q*l+w>>>h.__kBitsPerCharTableShift)+29)/30,!1);const x=10>b?b:10,v=10>=h.__kBitsPerCharTableShift;\nb=[];var C=[],E=!1;do{for(var L=0,z=0;;){if(t-48>>>0>>0>>0>>0>>h.__kBitsPerCharTableShift)/30)}while(!C)}if(g!==n){if(!h.__isWhitespace(t))return null;for(g++;g>>w-t)}if(0!==g){if(n>=f.length)throw Error(\"implementation bug\");f.__setDigit(n++,g)}for(;n>>1)+(85&n);n=(51&n>>>2)+(51&n);n=(15&n>>>4)+(15&n);--b;const g=f.__digit(m-1);var t=h.__clz30(g),l=0|(30*m-t+n-1)/n;if(f.sign&&l++,268435456>>w;for(w=30-w;w>=n;)t[l--]=h.__kConversionChars[q&b],q>>>=n,w-=n}t[l--]=h.__kConversionChars[(q|g<>>n-w;0!==q;)t[l--]=\nh.__kConversionChars[q&b],q>>>=n;if(f.sign&&(t[l--]=\"-\"),-1!=l)throw Error(\"implementation bug\");return t.join(\"\")}static __toStringGeneric(f,b,m){var n=f.length;if(0===n)return\"\";if(1===n)return b=f.__unsignedDigit(0).toString(b),!1===m&&f.sign&&(b=\"-\"+b),b;var g=30*n-h.__clz30(f.__digit(n-1));n=h.__kMaxBitsPerChar[b]-1;g*=h.__kBitsPerCharTableMultiplier;n=(0|(g+(n-1))/n)+1>>1;g=h.exponentiate(h.__oneDigit(b,!1),h.__oneDigit(n,!1));var t=g.__unsignedDigit(0);if(1===g.length&&32767>=t){g=new h(f.length,\n!1);g.__initializeDigits();var l=0;for(let q=2*f.length-1;0<=q;q--)l=l<<15|f.__halfDigit(q),g.__setHalfDigit(q,0|l/t),l=0|l%t;t=l.toString(b)}else t=h.__absoluteDivLarge(f,g,!0,!0),g=t.quotient,t=t.remainder.__trim(),t=h.__toStringGeneric(t,b,!0);g.__trim();for(b=h.__toStringGeneric(g,b,!0);t.lengthf?h.__absoluteLess(m):0}static __compareToNumber(f,b){if(h.__isOneDigitInt(b)){const m=f.sign,n=0>b;if(m!==n)return h.__unequalSign(m);if(0===f.length){if(n)throw Error(\"implementation bug\");return 0===b?0:-1}if(1b?h.__absoluteGreater(m):fb)return h.__unequalSign(m);if(0===b)throw Error(\"implementation bug: should be handled elsewhere\");if(0===f.length)return-1;h.__kBitConversionDouble[0]=b;b=2047&h.__kBitConversionInts[1]>>>20;if(2047==b)throw Error(\"implementation bug: handled elsewhere\");var n=b-1023;if(0>n)return h.__absoluteGreater(m);b=f.length;var g=f.__digit(b-1),t=h.__clz30(g),l=30*b-t;n+=1;if(ln)return h.__absoluteGreater(m);\nn=1048576|1048575&h.__kBitConversionInts[1];let q=h.__kBitConversionInts[0];t=29-t;if(t!==(0|(l-1)%30))throw Error(\"implementation bug\");if(20>t){var w=20-t;t=w+32;l=n>>>w;n=n<<32-w|q>>>w;q<<=32-w}else 20===t?(t=32,l=n,n=q):(w=t-20,t=32-w,l=n<>>32-w,n=q<>>=0,l>>>=0,g>l)return h.__absoluteGreater(m);if(g>>2,n=n<<30|q>>>2,q<<=30):l=0;g=f.__unsignedDigit(b);if(g>l)return h.__absoluteGreater(m);if(gb&&f.__unsignedDigit(0)===e(b):0===h.__compareToDouble(f,b)}static __comparisonResultToBool(f,b){return 0===b?0>f:1===b?0>=f:2===b?0\nb;case 3:return f>=b}if(h.__isBigInt(f)&&\"string\"==typeof b)return b=h.__fromString(b),null!==b&&h.__comparisonResultToBool(h.__compareToBigInt(f,b),m);if(\"string\"==typeof f&&h.__isBigInt(b))return f=h.__fromString(f),null!==f&&h.__comparisonResultToBool(h.__compareToBigInt(f,b),m);if(f=h.__toNumeric(f),b=h.__toNumeric(b),h.__isBigInt(f)){if(h.__isBigInt(b))return h.__comparisonResultToBool(h.__compareToBigInt(f,b),m);if(\"number\"!=typeof b)throw Error(\"implementation bug\");return h.__comparisonResultToBool(h.__compareToNumber(f,\nb),m)}if(\"number\"!=typeof f)throw Error(\"implementation bug\");if(h.__isBigInt(b))return h.__comparisonResultToBool(h.__compareToNumber(b,f),2^m);if(\"number\"!=typeof b)throw Error(\"implementation bug\");return 0===m?fb:3===m?f>=b:void 0}__clzmsd(){return h.__clz30(this.__digit(this.length-1))}static __absoluteAdd(f,b,m){if(f.length>>30;m.__setDigit(g,1073741823&t)}for(;g>>30,m.__setDigit(g,1073741823&b);return g>>30;m.__setDigit(g,\n1073741823&t)}for(;g>>30,m.__setDigit(g,1073741823&b);return m.__trim()}static __absoluteAddOne(f,b,m){m=void 0===m?null:m;const n=f.length;null===m?m=new h(n,b):m.sign=b;b=1;for(let g=0;g>>30;m.__setDigit(g,1073741823&t)}return 0!=b&&m.__setDigitGrow(n,1),m}static __absoluteSubOne(f,b){const m=f.length;b=b||m;const n=new h(b,!1);let g=1;for(let t=0;t>>30;n.__setDigit(t,1073741823&l)}if(0!=\ng)throw Error(\"implementation bug\");for(f=m;fm?0:f.__unsignedDigit(m)>b.__unsignedDigit(m)?1:-1}static __multiplyAccumulate(f,b,m,n){if(0!==b){var g=32767&b,t=b>>>15,l=b=0;for(let v,C=0;C>>15;q=h.__imul(w,g);w=h.__imul(w,t);const E=h.__imul(x,g);x=h.__imul(x,t);v+=l+q+b;b=v>>>30;v&=1073741823;v+=((32767&w)<<15)+((32767&E)<<15);b+=v>>>30;l=x+(w>>>15)+(E>>>15);m.__setDigit(n,1073741823&v)}for(;0!=b||0!==l;n++)f=m.__digit(n),f+=b+l,l=0,b=f>>>30,m.__setDigit(n,1073741823&f)}}static __internalMultiplyAdd(f,b,m,n,g){let t=0;for(let w=0;w>>15,b);q=q+((32767&l)<<15)+t+m;m=q>>>30;t=l>>>15;g.__setDigit(w,\n1073741823&q)}if(g.length>n)for(g.__setDigit(n++,m+t);nthis.length&&(m=this.length);const n=32767&f;f>>>=15;let g=0;for(let w=0;w>>15;t=h.__imul(l,n);l=h.__imul(l,f);const x=h.__imul(q,n);q=h.__imul(q,f);t=b+t+g;g=t>>>30;t&=1073741823;t+=((32767&l)<<15)+((32767&x)<<15);g+=t>>>30;b=q+(l>>>15)+(x>>>15);this.__setDigit(w,1073741823&t)}if(0!=g||0!==\nb)throw Error(\"implementation bug\");}static __absoluteDivSmall(f,b,m){m=void 0===m?null:m;null===m&&(m=new h(f.length,!1));let n=0;for(let g,t=2*f.length-1;0<=t;t-=2){g=(n<<15|f.__halfDigit(t))>>>0;const l=0|g/b;n=0|g%b;g=(n<<15|f.__halfDigit(t-1))>>>0;const q=0|g/b;n=0|g%b;m.__setDigit(t>>>1,l<<15|q)}return m}static __absoluteModSmall(f,b){let m=0;for(let n=2*f.length-1;0<=n;n--)m=0|((m<<15|f.__halfDigit(n))>>>0)%b;return m}static __absoluteDivLarge(f,b,m,n){const g=b.__halfDigitLength(),t=b.length;\nvar l=f.__halfDigitLength()-g;let q=null;m&&(q=new h(l+2>>>1,!1),q.__initializeDigits());const w=new h(g+2>>>1,!1);w.__initializeDigits();const x=h.__clz15(b.__halfDigit(g-1));0>>0;E=0|l/v;l=0|l%v;const z=b.__halfDigit(g-2),G=f.__halfDigit(L+g-2);for(;h.__imul(E,z)>>>0>(l<<16|G)>>>0&&(E--,l+=v,!(32767>>1,C|E))}if(n)return f.__inplaceRightShift(x),m?{quotient:q,remainder:f}:f;if(m)return q;throw Error(\"unreachable\");}static __clz15(f){return h.__clz30(f)-15}__inplaceAdd(f,b,m){let n=0;for(let g=0;g>>15;this.__setHalfDigit(b+g,32767&t)}return n}__inplaceSub(f,\nb,m){let n=0;if(1&b){b>>=1;for(var g=this.__digit(b),t=32767&g,l=0;l>>1;l++){var q=f.__digit(l);g=(g>>>15)-(32767&q)-n;n=1&g>>>15;this.__setDigit(b+l,(32767&g)<<15|32767&t);g=this.__digit(b+l+1);t=(32767&g)-(q>>>15)-n;n=1&t>>>15}q=f.__digit(l);const w=(g>>>15)-(32767&q)-n;n=1&w>>>15;this.__setDigit(b+l,(32767&w)<<15|32767&t);if(b+l+1>=this.length)throw new RangeError(\"out of bounds\");0==(1&m)&&(g=this.__digit(b+l+1),t=(32767&g)-(q>>>15)-n,n=1&t>>>15,this.__setDigit(b+f.length,1073709056&g|32767&\nt))}else{b>>=1;for(t=0;t>>15,g=(g>>>15)-(q>>>15)-n,n=1&g>>>15,this.__setDigit(b+t,(32767&g)<<15|32767&l);l=this.__digit(b+t);f=f.__digit(t);g=(32767&l)-(32767&f)-n;n=1&g>>>15;q=0;0==(1&m)&&(q=(l>>>15)-(f>>>15)-n,n=1&q>>>15);this.__setDigit(b+t,(32767&q)<<15|32767&g)}return n}__inplaceRightShift(f){if(0!==f){var b=this.__digit(0)>>>f,m=this.length-1;for(let n=0;n>>f}this.__setDigit(m,b)}}static __specialLeftShift(f,b,m){const n=f.length,g=new h(n+m,!1);if(0===b){for(b=0;b>>30-b}return 0m)throw new RangeError(\"BigInt too big\");b=0|m/30;var n=m%30;const g=f.length,t=0!==n&&0!=f.__digit(g-1)>>>30-n;var l=\ng+b+(t?1:0);m=new h(l,f.sign);if(0===n){for(n=0;n>>30-n}if(t)m.__setDigit(g+b,l);else if(0!==l)throw Error(\"implementation bug\");}return m.__trim()}static __rightShiftByAbsolute(f,b){var m=f.length,n=f.sign,g=h.__toShiftAmount(b);if(0>g)return h.__rightShiftByMaximum(n);b=0|g/30;var t=g%30,l=m-b;if(0>=l)return h.__rightShiftByMaximum(n);\ng=!1;if(n)if(0!=(f.__digit(b)&(1<>>t;m=m-b-1;for(q=0;q>>t}n.__setDigit(m,l)}return g&&(n=h.__absoluteAddOne(n,!0,n)),n.__trim()}static __rightShiftByMaximum(f){return f?h.__oneDigit(1,!0):h.__zero()}static __toShiftAmount(f){if(1<\nf.length)return-1;f=f.__unsignedDigit(0);return f>h.__kMaxLengthBits?-1:f}static __toPrimitive(f,b){b=void 0===b?\"default\":b;if(\"object\"!=typeof f||f.constructor===h)return f;if(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol.toPrimitive){const m=f[Symbol.toPrimitive];if(m){f=m(b);if(\"object\"!=typeof f)return f;throw new TypeError(\"Cannot convert object to primitive value\");}}if(b=f.valueOf)if(b=b.call(f),\"object\"!=typeof b)return b;if(b=f.toString)if(f=b.call(f),\"object\"!=typeof f)return f;throw new TypeError(\"Cannot convert object to primitive value\");\n}static __toNumeric(f){return h.__isBigInt(f)?f:+f}static __isBigInt(f){return\"object\"==typeof f&&null!==f&&f.constructor===h}static __truncateToNBits(f,b){var m=0|(f+29)/30;const n=new h(m,b.sign);--m;for(let g=0;g>>f);return n.__setDigit(m,b),n.__trim()}static __truncateAndSubFromPowerOfTwo(f,b,m){var n=Math.min,g=0|(f+29)/30;m=new h(g,m);let t=0;--g;var l=0;for(n=n(g,b.length);t>>\n30;m.__setDigit(t,1073741823&q)}for(;t>>f,f=1<<32-f,l=f-b-l,l&=f-1);return m.__setDigit(g,l),m.__trim()}__digit(f){return this[f]}__unsignedDigit(f){return this[f]>>>0}__setDigit(f,b){this[f]=0|b}__setDigitGrow(f,b){this[f]=0|b}__halfDigitLength(){const f=this.length;return 32767>=this.__unsignedDigit(f-1)?2*f-1:2*f}__halfDigit(f){return 32767&this[f>>>1]>>>15*(1&f)}__setHalfDigit(f,b){const m=\nf>>>1,n=this.__digit(m);this.__setDigit(m,1&f?32767&n|b<<15:1073709056&n|32767&b)}static __digitPow(f,b){let m=1;for(;0>>=1,f*=f;return m}static __isOneDigitInt(f){return(1073741823&f)===f}}return h.__kMaxLength=33554432,h.__kMaxLengthBits=h.__kMaxLength<<5,h.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],h.__kBitsPerCharTableShift=5,h.__kBitsPerCharTableMultiplier=1<>>0)/b)},h.__imul=d||function(f,b){return 0|f*b},h})},function(D,R){[...\"abc\"].flat();\"a\".matchAll(/a/g)},function(D,R,a){(function(d,c){(function(e,k){function p(E){delete q[E]}\nfunction h(E){if(w)setTimeout(h,0,E);else{var L=q[E];if(L){w=!0;try{var z=L.callback,G=L.args;switch(G.length){case 0:z();break;case 1:z(G[0]);break;case 2:z(G[0],G[1]);break;case 3:z(G[0],G[1],G[2]);break;default:z.apply(k,G)}}finally{p(E),w=!1}}}}function f(){v=function(E){c.nextTick(function(){h(E)})}}function b(){if(e.postMessage&&!e.importScripts){var E=!0,L=e.onmessage;e.onmessage=function(){E=!1};e.postMessage(\"\",\"*\");e.onmessage=L;return E}}function m(){var E=\"setImmediate$\"+Math.random()+\n\"$\",L=function(z){z.source===e&&\"string\"===typeof z.data&&0===z.data.indexOf(E)&&h(+z.data.slice(E.length))};e.addEventListener?e.addEventListener(\"message\",L,!1):e.attachEvent(\"onmessage\",L);v=function(z){e.postMessage(E+z,\"*\")}}function n(){var E=new MessageChannel;E.port1.onmessage=function(L){h(L.data)};v=function(L){E.port2.postMessage(L)}}function g(){var E=x.documentElement;v=function(L){var z=x.createElement(\"script\");z.onreadystatechange=function(){h(L);z.onreadystatechange=null;E.removeChild(z);\nz=null};E.appendChild(z)}}function t(){v=function(E){setTimeout(h,0,E)}}if(!e.setImmediate){var l=1,q={},w=!1,x=e.document,v,C=Object.getPrototypeOf&&Object.getPrototypeOf(e);C=C&&C.setTimeout?C:e;\"[object process]\"==={}.toString.call(e.process)?f():b()?m():e.MessageChannel?n():x&&\"onreadystatechange\"in x.createElement(\"script\")?g():t();C.setImmediate=function(E){\"function\"!==typeof E&&(E=new Function(\"\"+E));for(var L=Array(arguments.length-1),z=0;z{x+=q;const v=Sk.builtin.str.$fixReserved(w);l[v]=new Sk.builtin.getset_descriptor(t,{$get(){const C=this.$s[x];if(void 0===C)throw new Sk.builtin.AttributeError(w);return C},$set(C){this.$s[x]=\nC}})})}function h(g){for(;null!==g.prototype.tp$base;){if(void 0===g.sk$klass&&g.prototype.hasOwnProperty(\"__dict__\"))return g=g.prototype.__dict__,Sk.builtin.checkDataDescr(g)?g:void 0;g=g.prototype.tp$base}}function f(g,t,l){if(void 0===g.sk$klass)throw new Sk.builtin.TypeError(\"can't set \"+g.prototype.tp$name+\".\"+l.$jsstr());if(void 0===t)throw new Sk.builtin.TypeError(\"can't delete \"+g.prototype.tp$name+\".\"+l.$jsstr());}function b(g,t){g=(new Sk.builtin.super_(g,g)).tp$getattr(Sk.builtin.str.$initsubclass);\nSk.misceval.callsimArray(g,[],t)}function m(g){const t=g.prototype;Object.keys(t).forEach(l=>{const q=Sk.abstr.lookupSpecial(t[l],Sk.builtin.str.$setname);if(void 0!==q){const w=Sk.unfixReserved(l);try{Sk.misceval.callsimArray(q,[g,new Sk.builtin.str(w)])}catch(x){throw l=new Sk.builtin.RuntimeError(\"Error calling __set_name__ on '\"+Sk.abstr.typeName(t[l])+\"' instance '\"+w+\"' in '\"+g.prototype.tp$name+\"'\"),l.$cause=x,l;}}})}void 0===Sk.builtin&&(Sk.builtin={});Sk.builtin.type=function(g){this instanceof\nSk.builtin.type&&Sk.asserts.fail(\"calling new Sk.builtin.type is not safe\");return g.ob$type};Object.defineProperties(Sk.builtin.type.prototype,{call:{value:Function.prototype.call},apply:{value:Function.prototype.apply},tp$slots:{value:{tp$doc:\"type(object_or_name, bases, dict)\\ntype(object) -> the object's type\\ntype(name, bases, dict) -> a new type\",tp$call:function(g,t){if(this===Sk.builtin.type){if(1===g.length&&(void 0===t||!t.length))return g[0].ob$type;if(3!==g.length)throw new Sk.builtin.TypeError(\"type() takes 1 or 3 arguments\");\n}let l=this.prototype.tp$new(g,t);if(l.$isSuspension)return Sk.misceval.chain(l,q=>{l=q;if(l.ob$type.$isSubType(this))return l.tp$init(g,t)},()=>l);if(l.ob$type.$isSubType(this)){const q=l.tp$init(g,t);return void 0!==q&&q.$isSuspension?Sk.misceval.chain(q,()=>l):l}return l},tp$new:function(g,t){if(3!==g.length){if(1===g.length&&(void 0===t||!t.length))return g[0].ob$type;throw new Sk.builtin.TypeError(\"type() takes 1 or 3 arguments\");}const l=g[0];var q=g[1];const w=g[2];if(\"dict\"!==w.tp$name)throw new Sk.builtin.TypeError(\"type() argument 3 must be dict, not \"+\nSk.abstr.typeName(w));if(!Sk.builtin.checkString(l))throw new Sk.builtin.TypeError(\"type() argument 1 must be str, not \"+Sk.abstr.typeName(l));if(\"tuple\"!==q.tp$name)throw new Sk.builtin.TypeError(\"type() argument 2 must be tuple, not \"+Sk.abstr.typeName(q));q=q.sk$asarray();g=function(){this.sk$hasDict&&(this.$d=new Sk.builtin.dict);this.$s=[]};e(l,g,q,this.constructor);const x=g.prototype;Sk.globals&&(x.__module__=Sk.globals.__name__);x.__doc__=Sk.builtin.none.none$;q=w.quick$lookup(Sk.builtin.str.$slots);\nlet v=void 0===q,C=void 0!==g.$typeLookup(Sk.builtin.str.$dict),E;void 0!==q&&(E=new Set,q=Sk.builtin.checkString(q)?[q]:Sk.misceval.arrayFromIterable(q),q.forEach(L=>{if(!Sk.builtin.checkString(L))throw new Sk.builtin.TypeError(\"__slots__ items must be strings, not '\"+Sk.abstr.typeName(L)+\"'\");if(!L.$isIdentifier())throw new Sk.builtin.TypeError(\"__slots__ must be identifiers\");if(\"__dict__\"===L.v){if(C)throw new Sk.builtin.TypeError(\"__dict__ slot disallowed: we already got one\");v=!0}else E.add(Sk.mangleName(l,\nL).v)}),q=[...E].sort((L,z)=>L.localeCompare(z)),p(q,g));v&&!C&&(x.__dict__=new Sk.builtin.getset_descriptor(g,n),C=!0);Object.defineProperties(x,{ht$slots:{value:q||null,writable:!0},sk$hasDict:{value:C,writable:!0}});w.$items().forEach(L=>{var [z,G]=L;if(Sk.builtin.checkString(z)){if(E&&E.has(z.v))throw new Sk.builtin.ValueError(\"'\"+z.toString()+\"' in __slots__ conflicts with class variable\");x[z.$mangled]=G}});if(x.hasOwnProperty(\"__qualname__\")){q=x.__qualname__;if(!Sk.builtin.checkString(q))throw new Sk.builtin.TypeError(\"type __qualname__ must be a str, not '\"+\nSk.abstr.typeName(q)+\"'\");x.ht$qualname=q}q=g.prototype;a(q,\"__init_subclass__\",\"classmethod\");a(q,\"__new__\",\"staticmethod\");a(q,\"__class_getitem__\",\"classmethod\");g.$allocateSlots();m(g);b(g,t);return g},tp$init:function(g,t){if(g&&1==g.length&&t&&t.length)throw new Sk.builtin.TypeError(\"type.__init__() takes no keyword arguments\");if(3!=g.length&&1!=g.length)throw new Sk.builtin.TypeError(\"type.__init__() takes 1 or 3 arguments\");return Sk.builtin.object.prototype.tp$init.call(this,[])},tp$getattr:function(g,\nt){var l=this.ob$type;const q=l.$typeLookup(g);let w;if(void 0!==q&&(w=q.tp$descr_get,void 0!==w&&void 0!==q.tp$descr_set))return t=w.call(q,this,l,t);g=this.$typeLookup(g);if(void 0!==g)return l=g.tp$descr_get,void 0!==l?t=l.call(g,null,this,t):g;if(void 0!==w)return t=w.call(q,this,l,t);if(void 0!==q)return q},tp$setattr:function(g,t,l){if(!this.sk$klass){if(void 0!==t)throw new Sk.builtin.TypeError(\"can't set attributes of built-in/extension type '\"+this.prototype.tp$name+\"'\");throw new Sk.builtin.TypeError(\"can't delete attributes on type object '\"+\nthis.prototype.tp$name+\"'\");}const q=this.ob$type.$typeLookup(g);if(void 0!==q){const w=q.tp$descr_set;if(w)return w.call(q,this,t,l)}l=g.$mangled;if(void 0===t)if(t=this.prototype,t.hasOwnProperty(l))delete t[l],g=Sk.dunderToSkulpt[l],void 0!==g&&(delete this.prototype[g],t.sk$prototypical||this.$allocateGetterSlot(l));else throw new Sk.builtin.AttributeError(\"type object '\"+this.prototype.tp$name+\"' has no attribute '\"+g.$jsstr()+\"'\");else this.prototype[l]=t,l in Sk.dunderToSkulpt&&this.$allocateSlot(l,\nt)},$r:function(){let g=this.prototype.__module__,t=\"\",l=\"class\";g&&Sk.builtin.checkString(g)?t=g.v+\".\":g=null;g||this.sk$klass||Sk.__future__.class_repr||(l=\"type\");return new Sk.builtin.str(\"<\"+l+\" '\"+t+this.prototype.tp$name+\"'>\")}},writable:!0},tp$methods:{value:null,writable:!0},tp$classmethods:{value:null,writable:!0},tp$getsets:{value:null,writable:!0},sk$type:{value:!0},$isSubType:{value:function(g){return this===g||this.prototype instanceof g||!this.prototype.sk$prototypical&&this.prototype.tp$mro.includes(g)}},\n$allocateSlot:{value:function(g,t){g=Sk.slots[g];const l=g.$slot_name,q=this.prototype;q.hasOwnProperty(l)&&delete q[l];Object.defineProperty(q,l,{value:g.$slot_func(t),writable:!0,configurable:!0})}},$allocateSlots:{value:function(){const g=this.prototype;this.prototype.sk$prototypical?Object.keys(g).forEach(t=>{t in Sk.slots&&this.$allocateSlot(t,g[t])}):Object.keys(Sk.slots).forEach(t=>{g.hasOwnProperty(t)?this.$allocateSlot(t,g[t]):this.$allocateGetterSlot(t)});g.hasOwnProperty(\"__eq__\")&&!g.hasOwnProperty(\"__hash__\")&&\n(g.tp$hash=g.__hash__=Sk.builtin.none.none$)}},$allocateGetterSlot:{value:function(g){const t=Sk.slots[g].$slot_name,l=this.prototype;l.hasOwnProperty(t)||Object.defineProperty(l,t,{configurable:!0,get(){const q=l.tp$mro;for(let w=1;wa.length)throw a=c.tp$name,new Sk.builtin.TypeError(a+\".__new__(): not enough arguments\");var e=a.shift();if(void 0===e.sk$type)throw a=c.tp$name,new Sk.builtin.TypeError(a+\"__new__(X): X is not a type object (\"+Sk.abstr.typeName(e)+\")\");if(!e.$isSubType(this))throw a=c.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+\n\".__new__(\"+e+\"): \"+e+\" is not a subtype of \"+a);const k=e.prototype.sk$staticNew.prototype;if(k.tp$new!==c.tp$new)throw a=c.tp$name,e=e.prototype.tp$name,new Sk.builtin.TypeError(a+\".__new__(\"+e+\") is not safe, use \"+k.tp$name+\".__new__()\");return c.tp$new.call(e.prototype,a,d)},$flags:{FastCall:!0},$textsig:\"($type, *args, **kwargs)\",$name:\"__new__\"};Sk.generic.selfIter=function(){return this};Sk.generic.iterNextWithArrayCheckSize=function(){if(this.$seq.length!==this.$orig.get$size()){const a=\nthis.tp$name.split(\"_\")[0];throw new Sk.builtin.RuntimeError(a+\" changed size during iteration\");}if(!(this.$index>=this.$seq.length))return this.$seq[this.$index++]};Sk.generic.iterNextWithArray=function(){const a=this.$seq[this.$index++];void 0===a&&(this.tp$iternext=()=>{});return a};Sk.generic.iterLengthHintWithArrayMethodDef={$meth:function(){return new Sk.builtin.int_(this.$seq.length-this.$index)},$flags:{NoArgs:!0}};Sk.generic.iterReverseLengthHintMethodDef={$meth:function(){return new Sk.builtin.int_(this.$index)},\n$flags:{NoArgs:!0}};Sk.generic.getSetDict={$get(){return this.$d},$set(a){if(void 0===a)throw new Sk.builtin.TypeError(\"cannot delete __dict__\");if(a instanceof Sk.builtin.dict)this.$d=a;else throw new Sk.builtin.TypeError(\"__dict__ must be set to a dictionary, not a '\"+Sk.abstr.typeName(a)+\"'\");},$doc:\"dictionary for instance variables (if defined)\",$name:\"__dict__\"};Sk.generic.seqCompare=function(a,d){if(this===a&&Sk.misceval.opAllowsEquality(d))return!0;if(!(a instanceof this.sk$builtinBase))return Sk.builtin.NotImplemented.NotImplemented$;\nconst c=this.v;a=a.v;let e;if(c.length!==a.length&&(\"Eq\"===d||\"NotEq\"===d))return\"Eq\"===d?!1:!0;for(e=0;e=k||e>=p)switch(d){case \"Lt\":return kp;case \"GtE\":return k>=p;default:Sk.asserts.fail()}return\"Eq\"===d?!1:\"NotEq\"===d?!0:Sk.misceval.richCompareBool(c[e],a[e],d)};Sk.generic.classGetItem=\n{__class_getitem__:{$meth(a){return new Sk.builtin.GenericAlias(this,a)},$flags:{OneArg:!0}}}},function(D,R){Sk.builtin.pyCheckArgs=function(a,d,c,e,k,p){d=d.length;void 0===e&&(e=Infinity);k&&--d;p&&--d;if(de)throw new Sk.builtin.TypeError((c===e?a+\"() takes exactly \"+c+\" arguments\":de)throw new Sk.builtin.TypeError((c===e?a+\"() takes exactly \"+c+\" arguments\":d{var [w,x]=q;l[x]=function(v){return this.tp$richcompare(v,w)}})}function h(l){const q=Sk.reflectedNumberSlots;Object.keys(q).forEach(w=>{if(void 0!==l[w]){const x=\nq[w],v=x.reflected,C=l[v];void 0!==C?null===C&&delete l[v]:l[v]=x.slot||l[w]}})}function f(l){const q=Sk.sequenceAndMappingSlots;Object.keys(q).forEach(w=>{void 0!==l[w]&&q[w].forEach(x=>{l[x]=l[w]})})}Sk.abstr={};Sk.abstr.typeName=function(l){if(null!=l&&void 0!==l.tp$name){let q=l.ht$name;if(void 0!==q)return q.toString();q=l.tp$name;q.includes(\".\")&&(q=q.slice(q.lastIndexOf(\".\")+1));return q}Sk.asserts.fail(l+\" passed to typeName\");return\"\"};const b={Add:\"+\",Sub:\"-\",Mult:\"*\",MatMult:\"@\",\nDiv:\"/\",FloorDiv:\"//\",Mod:\"%\",DivMod:\"divmod()\",Pow:\"** or pow()\",LShift:\"<<\",RShift:\">>\",BitAnd:\"&\",BitXor:\"^\",BitOr:\"|\"},m={UAdd:\"+\",USub:\"-\",Invert:\"~\"};Sk.abstr.numberBinOp=function(l,q,w){var x;if(!(x=e(l,q,w)))throw l=Sk.abstr.typeName(l),q=Sk.abstr.typeName(q),new Sk.builtin.TypeError(\"unsupported operand type(s) for \"+b[w]+\": '\"+l+\"' and '\"+q+\"'\");return x};Sk.exportSymbol(\"Sk.abstr.numberBinOp\",Sk.abstr.numberBinOp);Sk.abstr.numberInplaceBinOp=function(l,q,w){var x;if(!(x=k(l,q,w)))throw l=\nSk.abstr.typeName(l),q=Sk.abstr.typeName(q),new Sk.builtin.TypeError(\"unsupported operand type(s) for \"+b[w]+\"=: '\"+l+\"' and '\"+q+\"'\");return x};Sk.exportSymbol(\"Sk.abstr.numberInplaceBinOp\",Sk.abstr.numberInplaceBinOp);Sk.abstr.numberUnaryOp=function(l,q){if(\"Not\"===q)return Sk.misceval.isTrue(l)?Sk.builtin.bool.false$:Sk.builtin.bool.true$;b:{switch(q){case \"USub\":var w=l.nb$negative;break b;case \"UAdd\":w=l.nb$positive;break b;case \"Invert\":w=l.nb$invert;break b}w=void 0}w=void 0!==w?w.call(l):\nvoid 0;if(!w)throw l=Sk.abstr.typeName(l),new Sk.builtin.TypeError(\"bad operand type for unary \"+m[q]+\": '\"+l+\"'\");return w};Sk.exportSymbol(\"Sk.abstr.numberUnaryOp\",Sk.abstr.numberUnaryOp);Sk.abstr.fixSeqIndex_=function(l,q){q=Sk.builtin.asnum$(q);0>q&&l.sq$length&&(q+=l.sq$length());return q};Sk.abstr.sequenceContains=function(l,q,w){if(l.sq$contains)return l.sq$contains(q,w);l=Sk.misceval.iterFor(Sk.abstr.iter(l),function(x){return x===q||Sk.misceval.richCompareBool(x,q,\"Eq\")?new Sk.misceval.Break(!0):\n!1},!1);return w?l:Sk.misceval.retryOptionalSuspensionOrThrow(l)};Sk.abstr.sequenceConcat=function(l,q){if(l.sq$concat)return l.sq$concat(q);if(Sk.builtin.checkSequence(l)&&Sk.builtin.checkSequence(q)&&(q=e(l,q,\"Add\"),void 0!==q))return q;throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(l)+\"' object can't be concatenated\");};Sk.abstr.sequenceInPlaceConcat=function(l,q){if(l.sq$inplace_concat)return l.sq$inplace_concat(q);if(l.sq$concat)return l.sq$concat(q);if(Sk.builtin.checkSequence(l)&&Sk.builtin.checkSequence(q)&&\n(q=k(l,q,\"Add\"),void 0!==q))return q;throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(l)+\"' object can't be concatenated\");};Sk.abstr.sequenceGetIndexOf=function(l,q){if(l.index)return Sk.misceval.callsimArray(l.index,[l,q]);let w=0;for(let x=Sk.abstr.iter(l),v=x.tp$iternext();void 0!==v;v=x.tp$iternext()){if(Sk.misceval.richCompareBool(q,v,\"Eq\"))return new Sk.builtin.int_(w);w+=1}throw new Sk.builtin.ValueError(\"sequence.index(x): x not in sequence\");};Sk.abstr.sequenceGetCountOf=function(l,\nq){if(l.count)return Sk.misceval.callsimArray(l.count,[l,q]);let w=0;for(let x=Sk.abstr.iter(l),v=x.tp$iternext();void 0!==v;v=x.tp$iternext())Sk.misceval.richCompareBool(q,v,\"Eq\")&&(w+=1);return new Sk.builtin.int_(w)};Sk.abstr.sequenceGetItem=function(l,q,w){\"number\"===typeof q&&(q=new Sk.builtin.int_(q));return Sk.abstr.objectGetItem(l,q,w)};Sk.abstr.sequenceSetItem=function(l,q,w,x){\"number\"===typeof q&&(q=new Sk.builtin.int_(q));return Sk.abstr.objectSetItem(l,q,w,x)};Sk.abstr.sequenceDelItem=\nfunction(l,q,w){return Sk.abstr.objectDelItem(l,q,w)};Sk.abstr.sequenceGetSlice=function(l,q,w){return Sk.abstr.objectGetItem(l,new Sk.builtin.slice(q,w))};Sk.abstr.sequenceDelSlice=function(l,q,w){return Sk.abstr.objectDelItem(l,new Sk.builtin.slice(q,w))};Sk.abstr.sequenceSetSlice=function(l,q,w,x){return Sk.abstr.objectSetItem(l,new Sk.builtin.slice(q,w))};Sk.abstr.sequenceUnpack=function(l,q,w,x){if(!Sk.builtin.checkIterable(l))throw new Sk.builtin.TypeError(\"cannot unpack non-iterable \"+Sk.abstr.typeName(l)+\n\" object\");const v=Sk.abstr.iter(l),C=[];let E=0,L;0{C.push(z);if(++E===q)return new Sk.misceval.Break}));return Sk.misceval.chain(L,()=>{if(C.length{if(void 0!==G)throw new Sk.builtin.ValueError(\"too many values to unpack (expected \"+q+\")\");return C});const z=[];return Sk.misceval.chain(Sk.misceval.iterFor(v,\nG=>{z.push(G)}),()=>{const G=z.length+q-w;if(0>G)throw new Sk.builtin.ValueError(\"not enough values to unpack (expected at least \"+w+\", got \"+(w+G)+\")\");C.push(new Sk.builtin.list(z.slice(0,G)));C.push(...z.slice(G));return C})})};Sk.abstr.mappingUnpackIntoKeywordArray=function(l,q,w){if(q instanceof Sk.builtin.dict)q.$items().forEach(v=>{var [C,E]=v;if(!Sk.builtin.checkString(C))throw new Sk.builtin.TypeError((w.$qualname?w.$qualname+\"() \":\"\")+\"keywords must be strings\");l.push(C.v);l.push(E)});\nelse{var x=Sk.abstr.lookupSpecial(q,Sk.builtin.str.$keys);if(void 0===x)throw new Sk.builtin.TypeError(\"Object is not a mapping\");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(x),v=>Sk.misceval.iterFor(Sk.abstr.iter(v),C=>{if(!Sk.builtin.checkString(C))throw new Sk.builtin.TypeError((w.$qualname?w.$qualname+\"() \":\"\")+\"keywords must be strings\");return Sk.misceval.chain(q.mp$subscript(C,!0),E=>{l.push(C.v);l.push(E)})}))}};Sk.abstr.keywordArrayFromPyDict=function(l){const q=[];l.$items().forEach(w=>\n{var [x,v]=w;if(!Sk.builtin.checkString(x))throw new Sk.builtin.TypeError(\"keywords must be strings\");q.push(x.toString());q.push(v)});return q};Sk.abstr.keywordArrayToPyDict=function(l){const q=new Sk.builtin.dict;for(let w=0;wq.length)throw new Sk.builtin.TypeError(l+\"() expected at most \"+q.length+\" arguments (\"+C+\" given)\");if(x.length||\nvoid 0!==v){if(C===q.length&&!x.length)return w;if(0===C&&q.length===(v&&v.length))return v}else return w;w=w.slice(0);for(C=0;Cvoid 0===w[L]);\nif(q.length)throw new Sk.builtin.TypeError(l+\"() missing \"+q.length+\" required positional arguments: \"+q.join(\", \"));}return w};Sk.exportSymbol(\"Sk.abstr.copyKeywordsToNamedArgs\",Sk.abstr.copyKeywordsToNamedArgs);Sk.abstr.checkNoKwargs=function(l,q){if(q&&q.length)throw new Sk.builtin.TypeError(l+\"() takes no keyword arguments\");};Sk.exportSymbol(\"Sk.abstr.checkNoKwargs\",Sk.abstr.checkNoKwargs);Sk.abstr.checkNoArgs=function(l,q,w){if(q=q.length+(w?w.length:0))throw new Sk.builtin.TypeError(l+\"() takes no arguments (\"+\nq+\" given)\");};Sk.exportSymbol(\"Sk.abstr.checkNoArgs\",Sk.abstr.checkNoArgs);Sk.abstr.checkOneArg=function(l,q,w){Sk.abstr.checkNoKwargs(l,w);if(1!==q.length)throw new Sk.builtin.TypeError(l+\"() takes exactly one argument (\"+q.length+\" given)\");};Sk.exportSymbol(\"Sk.abstr.checkOneArg\",Sk.abstr.checkOneArg);Sk.abstr.checkArgsLen=function(l,q,w,x){q=q.length;void 0===x&&(x=Infinity);if(qx)throw new Sk.builtin.TypeError((w===x?l+\"() takes exactly \"+w+\" arguments\":qSk.builtin.str&&Sk.builtin.str.$fixReserved?(n=Sk.builtin.str.$fixReserved,Sk.builtin.str.$fixReserved(l)):\nl;Sk.abstr.setUpGetSets=function(l,q){if(void 0!==Sk.builtin.getset_descriptor){var w=l.prototype;q=q||w.tp$getsets||{};Object.entries(q).forEach(x=>{var [v,C]=x;C.$name=v;w[n(v)]=new Sk.builtin.getset_descriptor(l,C)});Object.defineProperty(w,\"tp$getsets\",{value:null,writable:!0})}};Sk.abstr.setUpMethods=function(l,q){if(void 0!==Sk.builtin.method_descriptor){var w=l.prototype;q=q||w.tp$methods||{};Object.entries(q).forEach(x=>{var [v,C]=x;C.$name=v;w[n(v)]=new Sk.builtin.method_descriptor(l,C)});\nObject.defineProperty(w,\"tp$methods\",{value:null,writable:!0})}};Sk.abstr.setUpClassMethods=function(l,q){if(void 0!==Sk.builtin.classmethod_descriptor){var w=l.prototype;q=q||w.tp$classmethods||{};Object.entries(q).forEach(x=>{var [v,C]=x;C.$name=v;w[n(v)]=new Sk.builtin.classmethod_descriptor(l,C)});Object.defineProperty(w,\"tp$classmethods\",{value:null,writable:!0})}};const g={Eq:\"ob$eq\",NotEq:\"ob$ne\",Gt:\"ob$gt\",GtE:\"ob$ge\",Lt:\"ob$lt\",LtE:\"ob$le\"},t=Object.entries(g);Sk.abstr.setUpSlots=function(l,\nq){function w(E,L){v[E]=new Sk.builtin.wrapper_descriptor(l,Sk.slots[E],L)}function x(E,L){\"string\"===typeof E?w(E,L):E.forEach(z=>{w(z,L)})}if(void 0!==Sk.builtin.wrapper_descriptor){var v=l.prototype;q=q||v.tp$slots||{};q.tp$new===Sk.generic.new&&(q.tp$new=Sk.generic.new(l));q.tp$richcompare?p(q):q.ob$eq&&(q.tp$richcompare=function(E,L){return this[g[L]].call(this,E)});q.tp$as_number&&h(q);q.tp$as_sequence_or_mapping&&f(q);Object.entries(q).forEach(E=>{var [L,z]=E;Object.defineProperty(v,L,{value:z,\nwritable:!0})});q.tp$new&&(v.__new__=new Sk.builtin.sk_method(Sk.generic.newMethodDef,l),Object.defineProperty(v,\"sk$staticNew\",{value:l,writable:!0}));Sk.subSlots.main_slots.forEach(E=>{var [L,z]=E;E=q[L];void 0!==E&&x(z,E)});var C=q.tp$hash;void 0!==C&&(\"function\"===typeof C?w(\"__hash__\",C):C===Sk.builtin.none.none$?v.__hash__=C:Sk.asserts.fail(\"invalid tp$hash\"));q.tp$as_number&&Sk.subSlots.number_slots.forEach(E=>{var [L,z]=E;E=q[L];void 0!==E&&x(z,E)});q.tp$as_sequence_or_mapping&&Sk.subSlots.sequence_and_mapping_slots.forEach(E=>\n{var [L,z]=E;E=q[L];void 0!==E&&x(z,E)});Object.defineProperty(v,\"tp$slots\",{value:null,writable:!0})}};Sk.abstr.buildNativeClass=function(l,q){q=q||{};Sk.asserts.assert(q.hasOwnProperty(\"constructor\"),\"A constructor is required to build a native class\");let w=q.constructor;Sk.abstr.setUpInheritance(l,w,q.base,q.meta);Sk.abstr.setUpBuiltinMro(w);const x=w.prototype;Object.defineProperties(x,{tp$slots:{value:q.slots,writable:!0},tp$getsets:{value:q.getsets,writable:!0},tp$methods:{value:q.methods,\nwritable:!0},tp$classmethods:{value:q.classmethods,writable:!0}});Sk.abstr.setUpSlots(w,q.slots||{});Sk.abstr.setUpMethods(w,q.methods);Sk.abstr.setUpGetSets(w,q.getsets);Sk.abstr.setUpClassMethods(w,q.classmethods);Object.entries(q.proto||{}).forEach(v=>{var [C,E]=v;Object.defineProperty(x,C,{value:E,writable:!0,enumerable:!(C.includes(\"$\")||C in Object.prototype)})});Object.entries(q.flags||{}).forEach(v=>{var [C,E]=v;Object.defineProperty(w,C,{value:E,writable:!0})});x.hasOwnProperty(\"tp$iter\")&&\n(x[Symbol.iterator]=function(){return this.tp$iter()[Symbol.iterator]()});void 0!==Sk.builtin.str&&x.hasOwnProperty(\"tp$doc\")&&!x.hasOwnProperty(\"__doc__\")&&(l=x.tp$doc||null,x.__doc__=\"string\"===typeof l?new Sk.builtin.str(l):Sk.builtin.none.none$);return w};Sk.abstr.buildIteratorClass=function(l,q){Sk.asserts.assert(q.hasOwnProperty(\"constructor\"),\"must provide a constructor\");q.slots=q.slots||{};q.slots.tp$iter=Sk.generic.selfIter;q.slots.tp$iternext=q.slots.tp$iternext||q.iternext;q.slots.tp$getattr=\nq.slots.tp$getattr||Sk.generic.getAttr;l=Sk.abstr.buildNativeClass(l,q);Sk.abstr.built$iterators.push(l);l.prototype[Symbol.iterator]=function(){return{next:()=>{const w=this.tp$iternext();return{value:w,done:void 0===w}}}};return l};Sk.abstr.built$iterators=[];Sk.abstr.setUpModuleMethods=function(l,q,w){Object.entries(w).forEach(x=>{var [v,C]=x;C.$name=C.$name||v;q[v]=new Sk.builtin.sk_method(C,null,l)});return q};Sk.abstr.superConstructor=function(l,q,w){var x=Array.prototype.slice.call(arguments,\n2);l.prototype.tp$base.apply(q,x)}},function(D,R){function a(e){const k=e.prototype,p=k.tp$base;if(null==p)return!1;const h=p.prototype;return p.sk$solidSlotBase||e.sk$solidSlotBase||h.sk$hasDict!==k.sk$hasDict||p.sk$solidBase&&p!==Sk.builtin.module?!1:!0}function d(e,k){e=e.prototype;k=k.prototype;const p=e.ht$slots,h=k.ht$slots;return e.sk$hasDict!==k.sk$hasDict?!1:p===h?!0:p&&h?p.length===h.length&&p.every((f,b)=>f===h[b]):(p&&(p.length||null))===(h&&(h.length||null))}const c=new WeakMap;Sk.builtin.object=\nSk.abstr.buildNativeClass(\"object\",{constructor:function(){Sk.asserts.assert(this instanceof Sk.builtin.object,\"bad call to object, use 'new'\")},base:null,slots:{tp$new(e,k){if(e.length||k&&k.length){if(this.tp$new!==Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(\"object.__new__() takes exactly one argument (the type to instantiate)\");if(this.tp$init===Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+\"() takes no arguments\");}return new this.constructor},\ntp$init(e,k){if(e.length||k&&k.length){if(this.tp$init!==Sk.builtin.object.prototype.tp$init)throw new Sk.builtin.TypeError(\"object.__init__() takes exactly one argument (the instance to initialize)\");if(this.tp$new===Sk.builtin.object.prototype.tp$new)throw new Sk.builtin.TypeError(Sk.abstr.typeName(this)+\".__init__() takes exactly one argument (the instance to initialize)\");}},tp$getattr:Sk.generic.getAttr,tp$setattr:Sk.generic.setAttr,$r(){const e=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$module);\nlet k=\"\";e&&Sk.builtin.checkString(e)&&(k=e.v+\".\");return new Sk.builtin.str(\"<\"+k+Sk.abstr.typeName(this)+\" object>\")},tp$str(){return this.$r()},tp$hash(){let e=c.get(this);if(void 0!==e)return e;e=Math.floor(Math.random()*Number.MAX_SAFE_INTEGER-Number.MAX_SAFE_INTEGER/2);c.set(this,e);return e},tp$richcompare(e,k){switch(k){case \"Eq\":e=this===e||Sk.builtin.NotImplemented.NotImplemented$;break;case \"NotEq\":e=this.ob$eq(e,\"Eq\");e!==Sk.builtin.NotImplemented.NotImplemented$&&(e=!Sk.misceval.isTrue(e));\nbreak;default:e=Sk.builtin.NotImplemented.NotImplemented$}return e},tp$doc:\"The most base type\"},getsets:{__class__:{$get(){return this.ob$type},$set(e){if(void 0===e)throw new Sk.builtin.TypeError(\"can't delete __class__ attribute\");if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError(\"__class__ must be set to a class, not '\"+Sk.abstr.typeName(e)+\"' object\");const k=this.ob$type;if(!(k.$isSubType(Sk.builtin.module)&&e.$isSubType(Sk.builtin.module)||void 0!==k.prototype.ht$type&&void 0!==e.prototype.ht$type))throw new Sk.builtin.TypeError(\" __class__ assignment only supported for heap types or ModuleType subclasses\");\n{let p=k,h=e;for(;a(p);)p=p.prototype.tp$base;for(;a(h);)h=h.prototype.tp$base;if(p!==h&&(p.prototype.tp$base!==h.prototype.tp$base||!d(p,h)))throw new Sk.builtin.TypeError(\"__class__ assignment: '\"+e.prototype.tp$name+\"' object layout differs from '\"+k.prototype.tp$name+\"'\");}Object.setPrototypeOf(this,e.prototype)},$doc:\"the object's class\"}},methods:{__dir__:{$meth:function(){let e=Sk.abstr.lookupAttr(this,Sk.builtin.str.$dict);e=void 0===e?new Sk.builtin.dict([]):e instanceof Sk.builtin.dict?\ne.dict$copy():new Sk.builtin.dict([]);const k=Sk.abstr.lookupAttr(this,Sk.builtin.str.$class);void 0!==k&&k.$mergeClassDict(e);return new Sk.builtin.list(e.sk$asarray())},$flags:{NoArgs:!0},$doc:\"Default dir() implementation.\"},__format__:{$meth(e){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError(\"__format__() argument must be str, not \"+Sk.abstr.typeName(e));if(\"\"!==e.v)throw new Sk.builtin.TypeError(`unsupported format string passed to ${Sk.abstr.typeName(this)}.__format__`);return this.tp$str()},\n$flags:{OneArg:!0},$doc:\"Default object formatter.\"}},classmethods:{__init_subclass__:{$meth(e){return Sk.builtin.none.none$},$flags:{FastCall:!0,NoKwargs:!0}}},proto:{valueOf:Object.prototype.valueOf,toString(){return this.tp$str().v},hasOwnProperty:Object.prototype.hasOwnProperty,ht$type:void 0,sk$attrError(){return\"'\"+this.tp$name+\"' object\"},$mergeClassDict(e){var k=Sk.abstr.lookupAttr(this,Sk.builtin.str.$dict);void 0!==k&&e.dict$merge(k);k=Sk.abstr.lookupAttr(this,Sk.builtin.str.$bases);if(void 0!==\nk){var p=Sk.builtin.len(k).valueOf();for(let h=0;hvoid 0===L?Sk.builtin.none.none$:L)}function e(v,C,E){Sk.abstr.checkNoKwargs(this.$name,E);Sk.abstr.checkArgsLen(this.$name,C,1,2);v=this.call(v,...C);return void 0===v?Sk.builtin.none.none$:v}function k(v,C,E){Sk.abstr.checkNoKwargs(this.$name,E);Sk.abstr.checkArgsLen(this.$name,C,2,2);return Sk.misceval.chain(this.call(v,C[0],C[1],!0),()=>Sk.builtin.none.none$)}function p(v,C,E){Sk.abstr.checkOneArg(this.$name,C,E);v=this.call(v,C[0],void 0,\n!0);return Sk.misceval.chain(v,L=>void 0===L?Sk.builtin.none.none$:L)}function h(v,C,E){v=d.call(this,v,C,E);return v===Sk.builtin.NotImplemented.NotImplemented$?v:new Sk.builtin.bool(v)}function f(v,C,E){return function(L,z,G){L=v.call(this,L,z,G);return E?Sk.misceval.chain(L,C):C(Sk.misceval.retryOptionalSuspensionOrThrow(L))}}function b(v){return function(){const C=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;return Sk.misceval.callsimArray(C,[])}}function m(v,C,E,L){return function(z){return function(){var G=\nz.tp$descr_get?z.tp$descr_get(this,this.ob$type):z;G=Sk.misceval.callsimArray(G,[]);if(!C(G))throw new Sk.builtin.TypeError(v+\" should return \"+E+\" (returned \"+Sk.abstr.typeName(G)+\")\");return void 0!==L?L(G):G}}}function n(v){return function(C){const E=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;return Sk.misceval.callsimArray(E,[C])}}function g(v,C){let E=this.ob$type.$typeLookup(Sk.builtin.str.$getattribute);if(E instanceof Sk.builtin.wrapper_descriptor)return E.d$wrapped.call(this,v,C);\nE.tp$descr_get&&(E=E.tp$descr_get(this,this.ob$type));const L=Sk.misceval.tryCatch(()=>Sk.misceval.callsimOrSuspendArray(E,[v]),z=>{if(!(z instanceof Sk.builtin.AttributeError))throw z;});return C?L:Sk.misceval.retryOptionalSuspensionOrThrow(L)}function t(v,C,E){return function(L){return function(z,G,K){let S;void 0===G?(S=C,E=null):S=v;let U=this.ob$type.$typeLookup(new Sk.builtin.str(S));if(U instanceof Sk.builtin.wrapper_descriptor)return U.d$wrapped.call(this,z,G);U.tp$descr_get&&(U=U.tp$descr_get(this,\nthis.ob$type,K));if(void 0!==U)z=Sk.misceval.callsimOrSuspendArray(U,void 0===G?[z]:[z,G]);else{if(E)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(this)+\"' object \"+E);throw new Sk.builtin.AttributeError(S);}return K?z:Sk.misceval.retryOptionalSuspensionOrThrow(z)}}}function l(v,C){let E=v.ob$type;for(;E&&void 0!==E.sk$klass;)E=E.prototype.tp$base;if(E&&E.prototype.tp$setattr!==C)throw new Sk.builtin.TypeError(\"can't apply this \"+C.$name+\" to \"+Sk.abstr.typeName(v)+\" object\");}Sk.slots=Object.create(null);\nD=Sk.slots;Sk.slots.__init__={$name:\"__init__\",$slot_name:\"tp$init\",$slot_func:function(v){return function(C,E){const L=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;C=Sk.misceval.callsimOrSuspendArray(L,C,E);return Sk.misceval.chain(C,z=>{if(!Sk.builtin.checkNone(z)&&void 0!==z)throw new Sk.builtin.TypeError(\"__init__() should return None, not \"+Sk.abstr.typeName(z));})}},$wrapper:function(v,C,E){this.call(v,C,E);return Sk.builtin.none.none$},$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},\n$doc:\"Initialize self. See help(type(self)) for accurate signature.\"};D.__new__={$name:\"__new__\",$slot_name:\"tp$new\",$slot_func:function(v){const C=function(E,L){let z=v;v.tp$descr_get&&(z=v.tp$descr_get(null,this.constructor));return Sk.misceval.callsimOrSuspendArray(z,[this.constructor,...E],L)};C.sk$static_new=!1;return C},$wrapper:null,$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},$doc:\"Create and return a new object.\"};D.__call__={$name:\"__call__\",$slot_name:\"tp$call\",$slot_func:function(v){return function(C,\nE){const L=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;return Sk.misceval.callsimOrSuspendArray(L,C,E)}},$wrapper:function(v,C,E){v=this.call(v,C,E);return void 0===v?Sk.builtin.none.none$:v},$textsig:\"($self, /, *args, **kwargs)\",$flags:{FastCall:!0},$doc:\"Call self as a function.\"};D.__repr__={$name:\"__repr__\",$slot_name:\"$r\",$slot_func:m(\"__repr__\",Sk.builtin.checkString,\"str\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return repr(self).\"};D.__str__={$name:\"__str__\",$slot_name:\"tp$str\",\n$slot_func:m(\"__str__\",Sk.builtin.checkString,\"str\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return str(self).\"};var q=m(\"__hash__\",Sk.builtin.checkInt,\"int\",v=>\"number\"===typeof v.v?v.v:v.tp$hash());D.__hash__={$name:\"__hash__\",$slot_name:\"tp$hash\",$slot_func:function(v){return v===Sk.builtin.none.none$?Sk.builtin.none.none$:q(v)},$wrapper:f(a,v=>new Sk.builtin.int_(v)),$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Return hash(self).\"};D.__getattribute__={$name:\"__getattribute__\",\n$slot_name:\"tp$getattr\",$slot_func:function(v){return function(C,E){let L=this.ob$type.$typeLookup(Sk.builtin.str.$getattr);if(void 0===L)return g.call(this,C,E);const z=Sk.misceval.chain(g.call(this,C,E),G=>Sk.misceval.tryCatch(()=>{if(void 0!==G)return G;L.tp$descr_get&&(L=L.tp$descr_get(this,this.ob$type));return Sk.misceval.callsimOrSuspendArray(L,[C])},function(K){if(!(K instanceof Sk.builtin.AttributeError))throw K;}));return E?z:Sk.misceval.retryOptionalSuspensionOrThrow(z)}},$wrapper:function(v,\nC,E){Sk.abstr.checkOneArg(this.$name,C,E);const L=C[0];if(!Sk.builtin.checkString(L))throw new Sk.builtin.TypeError(\"attribute name must be string, not '\"+Sk.abstr.typeName(L)+\"'\");C=this.call(v,L,!0);return Sk.misceval.chain(C,z=>{if(void 0===z)throw new Sk.builtin.AttributeError(Sk.abstr.typeName(v)+\" has no attribute \"+L.$jsstr());return z})},$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Return getattr(self, name).\"};D.__getattr__={$name:\"__getattr__\",$slot_name:\"tp$getattr\",$slot_func:D.__getattribute__.$slot_func,\n$wrapper:null,$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Return getattr(self, name).\"};D.__setattr__={$name:\"__setattr__\",$slot_name:\"tp$setattr\",$slot_func:t(\"__setattr__\",\"__delattr__\"),$wrapper:function(v,C,E){Sk.abstr.checkNoKwargs(this.$name,E);Sk.abstr.checkArgsLen(this.$name,C,2,2);l(v,this);return Sk.misceval.chain(this.call(v,C[0],C[1],!0),()=>Sk.builtin.none.none$)},$textsig:\"($self, name, value, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Implement setattr(self, name, value).\"};D.__delattr__=\n{$name:\"__delattr__\",$slot_name:\"tp$setattr\",$slot_func:D.__setattr__.$slot_func,$wrapper:function(v,C,E){Sk.abstr.checkOneArg(this.$name,C,E);l(v,this);this.call(v,C[0]);return Sk.builtin.none.none$},$textsig:\"($self, name, /)\",$flags:{OneArg:!0},$doc:\"Implement delattr(self, name).\"};D.__get__={$name:\"__get__\",$slot_name:\"tp$descr_get\",$slot_func:function(v){return function(C,E,L){null===C&&(C=Sk.builtin.none.none$);null==E&&(E=Sk.builtin.none.none$);const z=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):\nv;C=Sk.misceval.callsimOrSuspendArray(z,[C,E]);return L?C:Sk.misceval.retryOptionalSuspensionOrThrow(C)}},$wrapper:function(v,C,E){Sk.abstr.checkNoKwargs(this.$name,E);Sk.abstr.checkArgsLen(this.$name,C,1,2);E=C[0];C=C[1];E===Sk.builtin.none.none$&&(E=null);C===Sk.builtin.none.none$&&(C=null);if(null===C&&null===E)throw new Sk.builtin.TypeError(\"__get__(None, None) is invalid\");return this.call(v,E,C,!0)},$textsig:\"($self, instance, owner, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Return an attribute of instance, which is of type owner.\"};\nD.__set__={$name:\"__set__\",$slot_name:\"tp$descr_set\",$slot_func:t(\"__set__\",\"__delete__\"),$wrapper:k,$textsig:\"($self, instance, value, /)\",$flags:{MinArgs:2,MaxArgs:2},$doc:\"Set an attribute of instance to value.\"};D.__delete__={$name:\"__delete__\",$slot_name:\"tp$descr_set\",$slot_func:D.__set__.$slot_func,$wrapper:p,$textsig:\"($self, instance, /)\",$flags:{OneArg:!0},$doc:\"Delete an attribute of instance.\"};D.__eq__={$name:\"__eq__\",$slot_name:\"ob$eq\",$slot_func:n,$wrapper:h,$textsig:\"($self, value, /)\",\n$flags:{OneArg:!0},$doc:\"Return self==value.\"};D.__ge__={$name:\"__ge__\",$slot_name:\"ob$ge\",$slot_func:n,$wrapper:h,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self>=value.\"};D.__gt__={$name:\"__gt__\",$slot_name:\"ob$gt\",$slot_func:n,$wrapper:h,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self>value.\"};D.__le__={$name:\"__le__\",$slot_name:\"ob$le\",$slot_func:n,$wrapper:h,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self<=value.\"};D.__lt__={$name:\"__lt__\",\n$slot_name:\"ob$lt\",$slot_func:n,$wrapper:h,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return selfSk.misceval.callsimOrSuspendArray(E,[]),z=>{if(z instanceof Sk.builtin.StopIteration)this.gi$ret=z.$value;else throw z;});return C?L:Sk.misceval.retryOptionalSuspensionOrThrow(L)}},$wrapper:function(v,C,E){Sk.abstr.checkNoArgs(this.$name,C,E);return Sk.misceval.chain(v.tp$iternext(!0),L=>{if(void 0===L)throw new Sk.builtin.StopIteration;return L})},$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"Implement next(self).\"};D.__len__=\n{$name:\"__len__\",$slot_name:\"sq$length\",$slot_func:function(v){return function(C){const E=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;if(C)return C=Sk.misceval.callsimOrSuspendArray(E,[]),Sk.misceval.chain(C,L=>Sk.misceval.asIndexOrThrow(L));C=Sk.misceval.callsimArray(E,[]);return Sk.misceval.asIndexOrThrow(C)}},$wrapper:f(function(v,C,E){Sk.abstr.checkNoArgs(this.$name,C,E);v=this.call(v,!0);return Sk.misceval.chain(v,L=>void 0===L?Sk.builtin.none.none$:L)},v=>new Sk.builtin.int_(v),!0),$flags:{NoArgs:!0},\n$textsig:\"($self, /)\",$doc:\"Return len(self).\"};D.__contains__={$name:\"__contains__\",$slot_name:\"sq$contains\",$slot_func:function(v){return function(C,E){const L=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;C=Sk.misceval.callsimOrSuspendArray(L,[C]);C=Sk.misceval.chain(C,z=>Sk.misceval.isTrue(z));return C.$isSuspension?E?C:Sk.misceval.retryOptionalSuspensionOrThrow(C):C}},$wrapper:f(c,v=>new Sk.builtin.bool(v),!0),$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Return key in self.\"};D.__getitem__=\n{$name:\"__getitem__\",$slot_name:\"mp$subscript\",$slot_func:function(v){return function(C,E){const L=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;C=Sk.misceval.callsimOrSuspendArray(L,[C]);return E?C:Sk.misceval.retryOptionalSuspensionOrThrow(C)}},$wrapper:c,$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Return self[key].\"};D.__setitem__={$name:\"__setitem__\",$slot_name:\"mp$ass_subscript\",$slot_func:t(\"__setitem__\",\"__delitem__\",\"does not support item assignment\"),$wrapper:k,$textsig:\"($self, key, value, /)\",\n$flags:{MinArgs:2,MaxArgs:2},$doc:\"Set self[key] to value.\"};D.__delitem__={$name:\"__delitem__\",$slot_name:\"mp$ass_subscript\",$slot_func:D.__setitem__.$slot_func,$wrapper:p,$textsig:\"($self, key, /)\",$flags:{OneArg:!0},$doc:\"Delete self[key].\"};D.__add__={$name:\"__add__\",$slot_name:\"nb$add\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self+value.\"};D.__radd__={$name:\"__radd__\",$slot_name:\"nb$reflected_add\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",\n$flags:{OneArg:!0},$doc:\"Return value+self.\"};D.__iadd__={$name:\"__iadd__\",$slot_name:\"nb$inplace_add\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self+=value.\"};D.__sub__={$name:\"__sub__\",$slot_name:\"nb$subtract\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self-value.\"};D.__rsub__={$name:\"__rsub__\",$slot_name:\"nb$reflected_subtract\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value-self.\"};\nD.__imul__={$name:\"__imul__\",$slot_name:\"nb$inplace_multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self*=value.\"};D.__mul__={$name:\"__mul__\",$slot_name:\"nb$multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self*value.\"};D.__rmul__={$name:\"__rmul__\",$slot_name:\"nb$reflected_multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value*self.\"};D.__isub__={$name:\"__isub__\",\n$slot_name:\"nb$inplace_subtract\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self-=value.\"};D.__mod__={$name:\"__mod__\",$slot_name:\"nb$remainder\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self%value.\"};D.__rmod__={$name:\"__rmod__\",$slot_name:\"nb$reflected_remainder\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value%self.\"};D.__imod__={$name:\"__imod__\",$slot_name:\"nb$inplace_remainder\",\n$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement value%=self.\"};D.__divmod__={$name:\"__divmod__\",$slot_name:\"nb$divmod\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return divmod(self, value).\"};D.__rdivmod__={$name:\"__rdivmod__\",$slot_name:\"nb$reflected_divmod\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return divmod(value, self)\"};D.__pos__={$name:\"__pos__\",$slot_name:\"nb$positive\",$slot_func:b,\n$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"+self\"};D.__neg__={$name:\"__neg__\",$slot_name:\"nb$negative\",$slot_func:b,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"-self\"};D.__abs__={$name:\"__abs__\",$slot_name:\"nb$abs\",$slot_func:b,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"abs(self)\"};D.__bool__={$name:\"__bool__\",$slot_name:\"nb$bool\",$slot_func:m(\"__bool__\",Sk.builtin.checkBool,\"bool\",v=>0!==v.v),$wrapper:f(a,v=>new Sk.builtin.bool(v)),$textsig:\"($self, /)\",\n$flags:{NoArgs:!0},$doc:\"self != 0\"};D.__invert__={$name:\"__invert__\",$slot_name:\"nb$invert\",$slot_func:b,$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"~self\"};D.__lshift__={$name:\"__lshift__\",$slot_name:\"nb$lshift\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self<>value.\"};D.__rrshift__={$name:\"__rrshift__\",$slot_name:\"nb$reflected_rshift\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value>>self.\"};D.__ilshift__={$name:\"__ilshift__\",$slot_name:\"nb$inplace_lshift\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self<<=value.\"};D.__irshift__={$name:\"__irshift__\",\n$slot_name:\"nb$inplace_rshift\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self=>>value.\"};D.__and__={$name:\"__and__\",$slot_name:\"nb$and\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self&value.\"};D.__rand__={$name:\"__rand__\",$slot_name:\"nb$refelcted_and\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value&self.\"};D.__iand__={$name:\"__iand__\",$slot_name:\"nb$inplace_and\",$slot_func:n,\n$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self&=value.\"};D.__xor__={$name:\"__xor__\",$slot_name:\"nb$xor\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self^value.\"};D.__rxor__={$name:\"__rxor__\",$slot_name:\"nb$reflected_xor\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value^self.\"};D.__ixor__={$name:\"__ixor__\",$slot_name:\"nb$inplace_xor\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",\n$flags:{OneArg:!0},$doc:\"Implement self^=value.\"};D.__or__={$name:\"__or__\",$slot_name:\"nb$or\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self|value.\"};D.__ror__={$name:\"__ror__\",$slot_name:\"nb$reflected_or\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value|self.\"};D.__ior__={$name:\"__ior__\",$slot_name:\"nb$inplace_or\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self|=value.\"};\nD.__int__={$name:\"__int__\",$slot_name:\"nb$int\",$slot_func:m(\"__int__\",Sk.builtin.checkInt,\"int\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"int(self)\"};D.__float__={$name:\"__float__\",$slot_name:\"nb$float\",$slot_func:m(\"__float__\",Sk.builtin.checkFloat,\"float\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"float(self)\"};D.__floordiv__={$name:\"__floordiv__\",$slot_name:\"nb$floor_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self//value.\"};\nD.__rfloordiv__={$name:\"__rfloordiv__\",$slot_name:\"nb$reflected_floor_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value//self.\"};D.__ifloordiv__={$name:\"__ifloordiv__\",$slot_name:\"nb$inplace_floor_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self//=value.\"};D.__truediv__={$name:\"__truediv__\",$slot_name:\"nb$divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self/value.\"};\nD.__rtruediv__={$name:\"__rtruediv__\",$slot_name:\"nb$reflected_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value/self.\"};D.__itruediv__={$name:\"__itruediv__\",$slot_name:\"nb$inplace_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self/=value.\"};D.__index__={$name:\"__index__\",$slot_name:\"nb$index\",$slot_func:m(\"__index__\",Sk.builtin.checkInt,\"int\",v=>v.v),$wrapper:f(a,v=>new Sk.builtin.int_(v)),$textsig:\"($self, /)\",\n$flags:{NoArgs:!0},$doc:\"Return self converted to an integer, if self is suitable for use as an index into a list.\"};D.__pow__={$name:\"__pow__\",$slot_name:\"nb$power\",$slot_func:function(v){return function(C,E){const L=v.tp$descr_get?v.tp$descr_get(this,this.ob$type):v;return void 0==E?Sk.misceval.callsimArray(L,[C]):Sk.misceval.callsimArray(L,[C,E])}},$wrapper:e,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Return pow(self, value, mod).\"};D.__rpow__={$name:\"__rpow__\",$slot_name:\"nb$reflected_power\",\n$slot_func:D.__pow__.$slot_func,$wrapper:e,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Return pow(value, self, mod).\"};D.__ipow__={$name:\"__ipow__\",$slot_name:\"nb$inplace_power\",$slot_func:D.__pow__.$slot_func,$wrapper:e,$textsig:\"($self, value, mod=None, /)\",$flags:{MinArgs:1,MaxArgs:2},$doc:\"Implement **=\"};D.__matmul__={$name:\"__matmul__\",$slot_name:\"nb$matrix_multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return self@value.\"};\nD.__rmatmul__={$name:\"__rmatmul__\",$slot_name:\"nb$reflected_matrix_multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Return value@self.\"};D.__imatmul__={$name:\"__imatmul__\",$slot_name:\"nb$inplace_matrix_multiply\",$slot_func:n,$wrapper:d,$textsig:\"($self, value, /)\",$flags:{OneArg:!0},$doc:\"Implement self@=value.\"};D.__long__={$name:\"__long__\",$slot_name:\"nb$long\",$slot_func:m(\"__long__\",Sk.builtin.checkInt,\"int\"),$wrapper:a,$textsig:\"($self, /)\",$flags:{NoArgs:!0},\n$doc:\"int(self)\"};var w,x={next:{$name:\"next\",$slot_name:\"tp$iternext\",$slot_func:D.__next__.$slot_func,$wrapper:D.__next__.$wrapper,$textsig:D.__next__.$textsig,$flags:D.__next__.$flags},__nonzero__:{$name:\"__nonzero__\",$slot_name:\"nb$bool\",$slot_func:m(\"__nonzero__\",Sk.builtin.checkInt,\"int\",v=>0!==v.v),$wrapper:f(a,v=>new Sk.builtin.bool(v)),$textsig:\"($self, /)\",$flags:{NoArgs:!0},$doc:\"x.__nonzero__() <==> x != 0\"},__div__:{$name:\"__div__\",$slot_name:\"nb$divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, other/)\",\n$flags:{OneArg:!0},$doc:\"x.__div__(y) <==> x/y\"},__rdiv__:{$name:\"__rdiv__\",$slot_name:\"nb$reflected_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, other/)\",$flags:{OneArg:!0},$doc:\"x.__rdiv__(y) <==> x/y\"},__idiv__:{$name:\"__idiv__\",$slot_name:\"nb$inplace_divide\",$slot_func:n,$wrapper:d,$textsig:\"($self, other/)\",$flags:{OneArg:!0},$doc:\"implement self /= other\"}};Sk.subSlots={main_slots:Object.entries({tp$init:\"__init__\",tp$call:\"__call__\",$r:\"__repr__\",tp$str:\"__str__\",tp$getattr:\"__getattribute__\",\ntp$setattr:[\"__setattr__\",\"__delattr__\"],ob$eq:\"__eq__\",ob$ne:\"__ne__\",ob$lt:\"__lt__\",ob$le:\"__le__\",ob$gt:\"__gt__\",ob$ge:\"__ge__\",tp$descr_get:\"__get__\",tp$descr_set:[\"__set__\",\"__delete__\"],tp$iter:\"__iter__\",tp$iternext:\"__next__\"}),number_slots:Object.entries({nb$abs:\"__abs__\",nb$negative:\"__neg__\",nb$positive:\"__pos__\",nb$int:\"__int__\",nb$long:\"__long__\",nb$float:\"__float__\",nb$index:\"__index__\",nb$add:\"__add__\",nb$reflected_add:\"__radd__\",nb$inplace_add:\"__iadd__\",nb$subtract:\"__sub__\",nb$reflected_subtract:\"__rsub__\",\nnb$inplace_subtract:\"__isub__\",nb$multiply:\"__mul__\",nb$reflected_multiply:\"__rmul__\",nb$inplace_multiply:\"__imul__\",nb$floor_divide:\"__floordiv__\",nb$reflected_floor_divide:\"__rfloordiv__\",nb$inplace_floor_divide:\"__ifloordiv__\",nb$invert:\"__invert__\",nb$remainder:\"__mod__\",nb$reflected_remainder:\"__rmod__\",nb$inplace_remainder:\"__imod__\",nb$divmod:\"__divmod__\",nb$reflected_divmod:\"__rdivmod__\",nb$power:\"__pow__\",nb$reflected_power:\"__rpow__\",nb$inplace_power:\"__ipow__\",nb$divide:\"__truediv__\",nb$reflected_divide:\"__rtruediv__\",\nnb$inplace_divide:\"__itruediv__\",nb$bool:\"__bool__\",nb$and:\"__and__\",nb$reflected_and:\"__rand__\",nb$inplace_and:\"__iand__\",nb$or:\"__or__\",nb$reflected_or:\"__ror__\",nb$inplace_or:\"__ior__\",nb$xor:\"__xor__\",nb$reflected_xor:\"__rxor__\",nb$inplace_xor:\"__ixor__\",nb$lshift:\"__lshift__\",nb$reflected_lshift:\"__rlshift__\",nb$rshift:\"__rshift__\",nb$reflected_rshift:\"__rrshift__\",nb$inplace_lshift:\"__ilshift__\",nb$inplace_rshift:\"__irshift__\",nb$matrix_multiply:\"__matmul__\",nb$reflected_matrix_multiply:\"__rmatmul__\",\nnb$inplace_matrix_multiply:\"__imatmul__\"}),sequence_and_mapping_slots:Object.entries({sq$length:\"__len__\",sq$contains:\"__contains__\",mp$subscript:\"__getitem__\",mp$ass_subscript:[\"__setitem__\",\"__delitem__\"],nb$add:\"__add__\",nb$multiply:\"__mul__\",nb$reflected_multiply:\"__rmul__\",nb$inplace_add:\"__iadd__\",nb$inplace_multiply:\"__imul__\"})};Sk.reflectedNumberSlots={nb$add:{reflected:\"nb$reflected_add\"},nb$subtract:{reflected:\"nb$reflected_subtract\",slot:function(v){return v instanceof this.constructor?\nv.nb$subtract(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$multiply:{reflected:\"nb$reflected_multiply\"},nb$divide:{reflected:\"nb$reflected_divide\",slot:function(v){return v instanceof this.constructor?v.nb$divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$floor_divide:{reflected:\"nb$reflected_floor_divide\",slot:function(v){return v instanceof this.constructor?v.nb$floor_divide(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$remainder:{reflected:\"nb$reflected_remainder\",slot:function(v){return v instanceof\nthis.constructor?v.nb$remainder(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$divmod:{reflected:\"nb$reflected_divmod\",slot:function(v){return v instanceof this.constructor?v.nb$divmod(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$power:{reflected:\"nb$reflected_power\",slot:function(v,C){return v instanceof this.constructor?v.nb$power(this,C):Sk.builtin.NotImplemented.NotImplemented$}},nb$and:{reflected:\"nb$reflected_and\"},nb$or:{reflected:\"nb$reflected_or\"},nb$xor:{reflected:\"nb$reflected_xor\"},\nnb$lshift:{reflected:\"nb$reflected_lshift\",slot:function(v){return v instanceof this.constructor?v.nb$lshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$rshift:{reflected:\"nb$reflected_rshift\",slot:function(v){return v instanceof this.constructor?v.nb$rshift(this):Sk.builtin.NotImplemented.NotImplemented$}},nb$matrix_multiply:{reflected:\"nb$reflexted_matrix_multiply\",slot:function(v){return v instanceof this.constructor?v.nb$matrix_multiply(this):Sk.builtin.NotImplemented.NotImplemented$}}};\nSk.sequenceAndMappingSlots={sq$concat:[\"nb$add\"],sq$repeat:[\"nb$multiply\",\"nb$reflected_multiply\"],mp$length:[\"sq$length\"],sq$inplace_repeat:[\"nb$inplace_multiply\"],sq$inplace_concat:[\"nb$inplace_add\"]};Sk.dunderToSkulpt={__repr__:\"$r\",__str__:\"tp$str\",__init__:\"tp$init\",__new__:\"tp$new\",__hash__:\"tp$hash\",__call__:\"tp$call\",__iter__:\"tp$iter\",__next__:\"tp$iternext\",__eq__:\"ob$eq\",__ne__:\"ob$ne\",__lt__:\"ob$lt\",__le__:\"ob$le\",__gt__:\"ob$gt\",__ge__:\"ob$ge\",__abs__:\"nb$abs\",__neg__:\"nb$negative\",__pos__:\"nb$positive\",\n__int__:\"nb$int\",__float__:\"nb$float\",__index__:\"nb$index\",__add__:\"nb$add\",__radd__:\"nb$reflected_add\",__iadd__:\"nb$inplace_add\",__sub__:\"nb$subtract\",__rsub__:\"nb$reflected_subtract\",__isub__:\"nb$inplace_subtract\",__mul__:\"nb$multiply\",__rmul__:\"nb$reflected_multiply\",__imul__:\"nb$inplace_multiply\",__truediv__:\"nb$divide\",__rtruediv__:\"nb$reflected_divide\",__itruediv__:\"nb$inplace_divide\",__floordiv__:\"nb$floor_divide\",__rfloordiv__:\"nb$reflected_floor_divide\",__ifloordiv__:\"nb$inplace_floor_divide\",\n__invert__:\"nb$invert\",__mod__:\"nb$remainder\",__rmod__:\"nb$reflected_remainder\",__imod__:\"nb$inplace_remainder\",__divmod__:\"nb$divmod\",__rdivmod__:\"nb$reflected_divmod\",__pow__:\"nb$power\",__rpow__:\"nb$reflected_power\",__ipow__:\"nb$inplace_power\",__bool__:\"nb$bool\",__long__:\"nb$long\",__lshift__:\"nb$lshift\",__rlshift__:\"nb$reflected_lshift\",__ilshift__:\"nb$inplace_lshift\",__rshift__:\"nb$rshift\",__rrshift__:\"nb$reflected_rshift\",__irshift__:\"nb$inplace_rshift\",__and__:\"nb$and\",__rand__:\"nb$reflected_and\",\n__iand__:\"nb$inplace_and\",__or__:\"nb$or\",__ror__:\"nb$reflected_or\",__ior__:\"nb$inplace_or\",__xor__:\"nb$xor\",__rxor__:\"nb$reflected_xor\",__ixor__:\"nb$inplace_xor\",__matmul__:\"nb$matrix_multiply\",__rmatmul__:\"nb$reflected_matrix_multiply\",__imatmul__:\"nb$inplace_matrix_multiply\",__get__:\"tp$descr_get\",__set__:\"tp$descr_set\",__delete__:\"tp$descr_set\",__getattribute__:\"tp$getattr\",__getattr__:\"tp$getattr\",__setattr__:\"tp$setattr\",__delattr__:\"tp$setattr\",__len__:\"sq$length\",__contains__:\"sq$contains\",\n__getitem__:\"mp$subscript\",__setitem__:\"mp$ass_subscript\",__delitem__:\"mp$ass_subscript\"};Sk.exportSymbol(\"Sk.setupDunderMethods\",Sk.setupDunderMethods);Sk.setupDunderMethods=function(v){function C(y,F,J){for(let Q=0;Q\n\"tp$iternext\"===y[0]),U=G.findIndex(y=>\"nb$bool\"===y[0]),r=Sk.dunderToSkulpt;if(v){r.__bool__=\"nb$bool\";r.__next__=\"tp$iternext\";delete r.__nonzero__;delete r.__div__;delete r.__rdiv__;delete r.__idiv__;delete r.next;for(let y in w)E[y]=w[y];for(let y in x)delete E[y];for(v=0;v\")}const k={__doc__:{$get(){return this.d$def.$doc?new Sk.builtin.str(this.d$def.$doc):\nSk.builtin.none.none$}},__objclass__:{$get(){return this.d$type}},__name__:{$get(){return new Sk.builtin.str(this.d$name)}}};D={__text_signature__:{$get(){return this.d$def.$textsig?new Sk.builtin.str(this.d$def.$textsig):Sk.builtin.none.none$}}};Sk.builtin.getset_descriptor=a(\"getset_descriptor\",void 0,{constructor:function(p,h){this.d$def=h;this.$get=h.$get;this.$set=h.$set;this.d$type=p;this.d$name=h.$name},slots:{tp$descr_get(p,h,f){if(h=this.d$check(p))return h;if(void 0!==this.$get)return p=\nthis.$get.call(p),f?p:Sk.misceval.retryOptionalSuspensionOrThrow(p);throw new Sk.builtin.AttributeError(\"getset_descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' objects is not readable\");},tp$descr_set(p,h,f){this.d$set_check(p);if(void 0!==this.$set)return p=this.$set.call(p,h),f?p:Sk.misceval.retryOptionalSuspensionOrThrow(p);throw new Sk.builtin.AttributeError(\"attribute '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' objects is readonly\");}}});Sk.builtin.method_descriptor=\na(\"method_descriptor\",\"method\",{constructor:function(p,h){this.d$def=h;this.$meth=h.$meth;this.d$type=p;this.d$name=h.$name||\"\";this.$flags=p=h.$flags||{};p.FastCall&&p.NoKwargs?this.tp$call=this.$methodFastCallNoKwargs:p.FastCall?this.tp$call=this.$methodFastCall:p.NoArgs?this.tp$call=this.$methodCallNoArgs:p.OneArg?this.tp$call=this.$methodCallOneArg:p.NamedArgs?this.tp$call=this.$methodCallNamedArgs:void 0!==p.MinArgs?this.tp$call=this.$methodCallMinArgs:(this.func_code=h.$meth,this.tp$call=\nthis.$defaultCall,this.$memoiseFlags=Sk.builtin.func.prototype.$memoiseFlags,this.$resolveArgs=Sk.builtin.func.prototype.$resolveArgs)},slots:{tp$call(p,h){return this.tp$call(p,h)},tp$descr_get(p,h){let f;return(f=this.d$check(p))?f:new Sk.builtin.sk_method(this.d$def,p)}},getsets:D,proto:{$methodFastCall(p,h){const f=p.shift();this.m$checkself(f);return this.$meth.call(f,p,h)},$methodFastCallNoKwargs(p,h){const f=p.shift();this.m$checkself(f);Sk.abstr.checkNoKwargs(this.d$name,h);return this.$meth.call(f,\np)},$methodCallNoArgs(p,h){const f=p.shift();this.m$checkself(f);Sk.abstr.checkNoArgs(this.d$name,p,h);return this.$meth.call(f)},$methodCallOneArg(p,h){const f=p.shift();this.m$checkself(f);Sk.abstr.checkOneArg(this.d$name,p,h);return this.$meth.call(f,p[0])},$methodCallNamedArgs(p,h){const f=p.shift();this.m$checkself(f);p=Sk.abstr.copyKeywordsToNamedArgs(this.d$name,this.$flags.NamedArgs,p,h,this.$flags.Defaults);return this.$meth.call(f,...p)},$methodCallMinArgs(p,h){const f=p.shift();this.m$checkself(f);\nSk.abstr.checkNoKwargs(this.d$name,h);Sk.abstr.checkArgsLen(this.d$name,p,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth.call(f,...p)},$defaultCall(p,h){this.m$checkself(p[0]);return Sk.builtin.func.prototype.tp$call.call(this,p,h)},m$checkself(p){if(void 0===p)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");this.d$check(p)}}});Sk.builtin.wrapper_descriptor=a(\"wrapper_descriptor\",\"slot wrapper\",{constructor:function(p,\nh,f){this.d$def=h;this.d$type=p;this.d$name=f.$name=h.$name;this.d$wrapped=f},slots:{tp$descr_get(p,h){let f;return(f=this.d$check(p))?f:new Sk.builtin.method_wrapper(this,p)},tp$call(p,h){if(1>p.length)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");const f=p.shift();if(!f.ob$type.$isSubType(this.d$type))throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' requires a '\"+this.d$type.prototype.tp$name+\"' object but received a '\"+\nSk.abstr.typeName(f)+\"'\");return this.raw$call(f,p,h)}},proto:{raw$call(p,h,f){this.d$wrapped.$name=this.d$name;return this.d$def.$wrapper.call(this.d$wrapped,p,h,f)}}});Sk.builtin.method_wrapper=a(\"method_wrapper\",void 0,{constructor:function(p,h){this.m$descr=p;this.m$self=h;this.d$def=p.d$def;this.d$name=p.d$name;this.d$type=p.d$type},slots:{tp$call(p,h){return this.m$descr.raw$call(this.m$self,p,h)},tp$richcompare(p,h){if(\"Eq\"!==h&&\"NotEq\"!==h||!(p instanceof Sk.builtin.method_wrapper))return Sk.builtin.NotImplemented.NotImplemented$;\np=this.m$self===p.m$self&&this.m$descr===p.m$descr;return\"Eq\"===h?p:!p},$r(){return new Sk.builtin.str(\"\")}},getsets:{__self__:{$get(){return this.m$self}}}});Sk.builtin.classmethod_descriptor=a(\"classmethod_descriptor\",\"method\",{constructor:function(p,h){this.d$def=h;this.$meth=h.$meth;this.d$type=p;this.d$name=h.$name||\"\"},slots:{tp$call(p,h){if(1>p.length)throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\n\"' of '\"+this.d$type.prototype.tp$name+\"' object needs an argument\");const f=p.shift();return this.tp$descr_get(null,f).tp$call(p,h)},tp$descr_get(p,h,f){if(void 0===h)if(null!==p)h=h||p.ob$type;else throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' for type '\"+this.d$type.prototype.tp$name+\"' needs an object or a type\");if(!h.ob$type.$isSubType(Sk.builtin.type))throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' for type '\"+this.d$type.prototype.tp$name+\"' needs a type not a '\"+\nSk.abstr.typeName(h)+\"' as arg 2\");if(!h.$isSubType(this.d$type))throw new Sk.builtin.TypeError(\"descriptor '\"+this.d$name+\"' requires a '\"+this.d$type.prototype.tp$name+\"' object but received a '\"+Sk.abstr.typeName(h)+\"' object\");return new Sk.builtin.sk_method(this.d$def,h)}},getsets:D});[Sk.builtin.method_descriptor,Sk.builtin.getset_descriptor,Sk.builtin.wrapper_descriptor,Sk.builtin.method_wrapper,Sk.builtin.classmethod_descriptor].forEach(p=>{Sk.abstr.setUpSlots(p);Sk.abstr.setUpMethods(p);\nSk.abstr.setUpGetSets(p)})},function(D,R){Sk.builtin.sk_method=Sk.abstr.buildNativeClass(\"builtin_function_or_method\",{constructor:function(a,d,c){this.$meth=a.$meth.bind(d);this.$doc=a.$doc;this.$self=d||null;this.$module=c?new Sk.builtin.str(c):null;this.$name=a.$name||a.$meth.name||\"\";this.m$def=a;this.$textsig=a.$textsig;this.$flags=a=a.$flags||{};a.FastCall&&a.NoKwargs?this.tp$call=this.$fastCallNoKwargs:a.FastCall?this.tp$call=this.$meth:a.NoArgs?this.tp$call=this.$callNoArgs:a.OneArg?\nthis.tp$call=this.$callOneArg:a.NamedArgs?this.tp$call=this.$callNamedArgs:void 0!==a.MinArgs?this.tp$call=this.$callMinArgs:(this.func_code=this.$meth,this.tp$call=this.$defaultCallMethod)},proto:{$fastCallNoKwargs(a,d){Sk.abstr.checkNoKwargs(this.$name,d);return this.$meth(a)},$callNoArgs(a,d){Sk.abstr.checkNoArgs(this.$name,a,d);return this.$meth()},$callOneArg(a,d){Sk.abstr.checkOneArg(this.$name,a,d);return this.$meth(a[0])},$callNamedArgs(a,d){a=Sk.abstr.copyKeywordsToNamedArgs(this.$name,this.$flags.NamedArgs,\na,d,this.$flags.Defaults);return this.$meth(...a)},$callMinArgs(a,d){Sk.abstr.checkNoKwargs(this.$name,d);Sk.abstr.checkArgsLen(this.$name,a,this.$flags.MinArgs,this.$flags.MaxArgs);return this.$meth(...a)},$defaultCallMethod(a,d){return null!==this.$self?Sk.builtin.func.prototype.tp$call.call(this,[this.$self,...a],d):Sk.builtin.func.prototype.tp$call.call(this,a,d)},$memoiseFlags(){return Sk.builtin.func.prototype.$memoiseFlags.call(this)},$resolveArgs(){return Sk.builtin.func.prototype.$resolveArgs.call(this)}},\nflags:{sk$unacceptableBase:!0},slots:{tp$getattr:Sk.generic.getAttr,$r(){return null===this.$self?new Sk.builtin.str(\"\"):new Sk.builtin.str(\"\")},tp$call(a,d){return this.tp$call(a,d)},tp$richcompare(a,d){if(\"Eq\"!==d&&\"NotEq\"!==d||!(a instanceof Sk.builtin.sk_method))return Sk.builtin.NotImplemented.NotImplemented$;a=this.$self===a.$self&&this.m$def.$meth===a.m$def.$meth;return\"Eq\"===d?a:!a}},\ngetsets:{__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(a){this.$module=a=a||Sk.builtin.none.none$}},__doc__:{$get(){return this.$doc?new Sk.builtin.str(this.$doc):Sk.builtin.none.none$}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__text_signature__:{$get(){return new Sk.builtin.str(this.$textsig)}},__self__:{$get(){return this.$self||Sk.sysModules.mp$lookup(this.$module)||Sk.builtin.none.none$}}}})},function(D,R){Sk.builtin.none=Sk.abstr.buildNativeClass(\"NoneType\",\n{constructor:function(){return Sk.builtin.none.none$},slots:{tp$new(a,d){Sk.abstr.checkNoArgs(\"NoneType\",a,d);return Sk.builtin.none.none$},$r(){return new Sk.builtin.str(\"None\")},tp$as_number:!0,nb$bool(){return!1}},proto:{valueOf(){return null}},flags:{sk$unacceptableBase:!0}});Sk.builtin.none.none$=Object.create(Sk.builtin.none.prototype,{v:{value:null,enumerable:!0}});Sk.builtin.NotImplemented=Sk.abstr.buildNativeClass(\"NotImplementedType\",{constructor:function(){return Sk.builtin.NotImplemented.NotImplemented$},\nslots:{$r(){return new Sk.builtin.str(\"NotImplemented\")},tp$new(a,d){Sk.abstr.checkNoArgs(\"NotImplementedType\",a,d);return Sk.builtin.NotImplemented.NotImplemented$}},flags:{sk$unacceptableBase:!0}});Sk.builtin.NotImplemented.NotImplemented$=Object.create(Sk.builtin.NotImplemented.prototype,{v:{value:null,enumerable:!0}});D=Sk.abstr.buildNativeClass(\"ellipsis\",{constructor:function(){return Sk.builtin.Ellipsis},slots:{tp$new(a,d){Sk.abstr.checkNoArgs(\"ellipsis\",a,d);return Sk.builtin.Ellipsis},$r(){return new Sk.builtin.str(\"Ellipsis\")}},\nflags:{sk$unacceptableBase:!0}});Sk.builtin.Ellipsis=Object.create(D.prototype,{v:{value:\"...\"}})},function(D,R){const a=/^(?:(.)?([<>=\\^]))?([\\+\\-\\s])?(#)?(0)?(\\d+)?(,|_)?(?:\\.(\\d+))?([bcdeEfFgGnosxX%])?$/;Sk.formatting={};let d=function(m,n,g,t){Sk.asserts.assert(\"string\"===typeof n);if(m[6]){var l=parseInt(m[6],10);t=m[2]||(m[5]?\"=\":t?\">\":\"<\");let q=l-(n.length+(g?g.length:0));if(0>=q)return g+n;l=(m[1]||(m[5]?\"0\":\" \")).repeat(q);switch(t){case \"=\":if(\"s\"===m[9])throw new Sk.builtin.ValueError(\"'=' alignment not allowed in string format specifier\");\nreturn g+l+n;case \">\":return l+g+n;case \"<\":return g+n+l;case \"^\":return m=Math.floor(q/2),l.substring(0,m)+g+n+l.substring(m)}}return g+n},c=function(m,n){return n?\"-\":\"+\"===m[3]?\"+\":\" \"===m[3]?\" \":\"\"};const e=/\\B(?=(\\d{3})+(?!\\d))/g,k=/\\B(?=([A-Za-z0-9]{4})+(?![A-Za-z0-9]))/g;let p=function(m,n,g){Sk.asserts.assert(n instanceof Sk.builtin.int_||n instanceof Sk.builtin.lng);if(m[8])throw new Sk.builtin.ValueError(\"Precision not allowed in integer format\");var t=n.str$(g,!1);n=n.nb$isnegative();n=\nc(m,n);m[4]&&(16===g?n+=\"0x\":8===g?n+=\"0o\":2===g&&(n+=\"0b\"));const l=m[9];\"X\"===l&&(t=t.toUpperCase());if(\"n\"===m[9])t=(+t).toLocaleString();else if(m[7]){t=t.split(\".\");const q=m[7];if(\",\"===q&&10!==g)throw new Sk.builtin.ValueError(`Cannot specify ',' with '${l}'`);t[0]=t[0].replace(10===g?e:k,q);t=t.join(\".\")}return d(m,t,n,!0)},h=function(m,n,g){if(!n)return m.str$(10,!0);n=n.match(a);if(!n)throw new Sk.builtin.ValueError(\"Invalid format specifier\");var t=n[9];t||(t=g?\"g\":\"d\");if(-1==(g?\"fFeEgG%\":\n\"bcdoxXnfFeEgG%\").indexOf(t))throw new Sk.builtin.ValueError(\"Unknown format code '\"+n[9]+\"' for object of type '\"+Sk.abstr.typeName(m)+\"'\");switch(t){case \"d\":case \"n\":return p(n,m,10);case \"x\":case \"X\":return p(n,m,16);case \"o\":return p(n,m,8);case \"b\":return p(n,m,2);case \"c\":if(n[3])throw new Sk.builtin.ValueError(\"Sign not allowed with integer format specifier 'c'\");if(n[4])throw new Sk.builtin.ValueError(\"Alternate form not allowed with integer format specifier 'c'\");if(n[7])throw new Sk.builtin.ValueError(\"Cannot specify ',' with 'c'\");\nif(n[8])throw new Sk.builtin.ValueError(\"Cannot specify ',' with 'c'\");return d(n,String.fromCodePoint(Sk.builtin.asnum$(m)),\"\",!0);case \"f\":case \"F\":case \"e\":case \"E\":case \"g\":case \"G\":{if(n[4])throw new Sk.builtin.ValueError(\"Alternate form (#) not allowed in float format specifier\");g=Sk.builtin.asnum$(m);\"string\"===typeof g&&(g=Number(g));if(Infinity===g)return d(n,\"inf\",\"\",!0);if(-Infinity===g)return d(n,\"inf\",\"-\",!0);if(isNaN(g))return d(n,\"nan\",\"\",!0);m=!1;0>g&&(g=-g,m=!0);var l=[\"toExponential\",\n\"toFixed\",\"toPrecision\"][\"efg\".indexOf(t.toLowerCase())];let q=n[8]?parseInt(n[8],10):6;g=g[l](q);-1!==\"EFG\".indexOf(t)&&(g=g.toUpperCase());if(\"g\"===t.toLowerCase()||!n[9]){if(l=g.match(/\\.(\\d*[1-9])?(0+)$/)){let [,w,x]=l;g=g.slice(0,w?-x.length:-(x.length+1))}-1!=g.indexOf(\".\")||n[9]||(g+=\".0\")}\"e\"===t.toLowerCase()&&(g=g.replace(/^([-+]?[0-9]*\\.?[0-9]+[eE][-+]?)([0-9])?$/,\"$10$2\"));n[7]&&(t=g.toString().split(\".\"),t[0]=t[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g,\",\"),g=t.join(\".\"));return d(n,g,c(n,m),\n!0)}case \"%\":if(n[4])throw new Sk.builtin.ValueError(\"Alternate form (#) not allowed with format specifier '%'\");m=Sk.builtin.asnum$(m);\"string\"===typeof m&&(m=Number(m));if(Infinity===m)return d(n,\"inf%\",\"\",!0);if(-Infinity===m)return d(n,\"inf%\",\"-\",!0);if(isNaN(m))return d(n,\"nan%\",\"\",!0);t=!1;0>m&&(m=-m,t=!0);g=n[8]?parseInt(n[8],10):6;m=(100*m).toFixed(g)+\"%\";return d(n,m,c(n,t),!0);default:throw new Sk.builtin.ValueError(\"Unknown format code '\"+n[9]+\"'\");}};Sk.formatting.mkNumber__format__=m=>\nfunction(n){if(!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError(\"format() argument 2 must be str, not \"+Sk.abstr.typeName(n));return new Sk.builtin.str(h(this,n.$jsstr(),m))};const f=/^\\d+$/,b=/{(((?:\\d+)|(?:\\w+))?((?:\\.(\\w+))|(?:\\[((?:\\d+)|(?:\\w+))\\])?))?(?:!(.))?(?::([^}]*))?}/g;Sk.formatting.format=function(m,n){n=n||[];const g={};for(let x=0;x{if(void 0===t)t=x;else if(t!==x)throw new Sk.builtin.ValueError(`cannot switch from ${t} to ${x}`);\n},q=x=>{let v;if(\"number\"===typeof x)l(\"manual field specification\"),v=m[x];else if(f.test(x))l(\"automatic field numbering\"),v=m[x];else if(v=g[x],void 0===v)throw new Sk.builtin.KeyError(x);if(void 0===v)throw new Sk.builtin.IndexError(`Replacement index ${x} out of range for positional args tuple`);return v};let w=0;n=this.v.replace(b,function(x,v,C,E,L,z,G,K,S,U){let r;void 0!==z&&\"\"!==z?(L=q(C),r=L.constructor===Array?L[z]:f.test(z)?Sk.abstr.objectGetItem(L,new Sk.builtin.int_(parseInt(z,10)),\n!1):Sk.abstr.objectGetItem(L,new Sk.builtin.str(z),!1),w++):void 0!==L&&\"\"!==L?(z=q(C||w++),r=Sk.abstr.gattr(z,new Sk.builtin.str(L))):void 0!==C&&\"\"!==C?r=q(C):void 0===v||\"\"===v?(r=q(w),w++):f.test(v)&&(r=q(v),w++);if(\"s\"===G)r=new Sk.builtin.str(r);else if(\"r\"===G)r=Sk.builtin.repr(r);else if(\"a\"===G)r=Sk.builtin.ascii(r);else if(\"\"!==G&&void 0!==G)throw new Sk.builtin.ValueError(\"Unknown conversion specifier \"+G);return Sk.abstr.objectFormat(r,new Sk.builtin.str(K)).$jsstr()});return new Sk.builtin.str(n)};\nSk.formatting.formatString=function(m){if(!Sk.builtin.checkString(m))throw new Sk.builtin.TypeError(\"format() argument 2 must be str, not \"+Sk.abstr.typeName(m));m=m.$jsstr().match(a);if(m[9]&&\"s\"!==m[9])throw new Sk.builtin.ValueError(\"Unknown format code '\"+m[9]+\"' for object of type 'str'\");if(m[3])throw new Sk.builtin.ValueError(\"Sign not allowed in string format specifier\");if(m[4])throw new Sk.builtin.ValueError(\"Alternate form (#) not allowed with string format specifier\");if(m[7])throw new Sk.builtin.ValueError(\"Cannot specify ',' with 's'\");\nlet n=this.v;m[8]&&(n=n.substring(0,m[8]));return new Sk.builtin.str(d(m,n,\"\",!1))}},function(D,R,a){function d(z){let G;const K=[];for(let S=0;SK?Infinity:K;null!=(J=U.exec(z))&&FS)return new Sk.builtin.tuple([new Sk.builtin.str(\"\"),new Sk.builtin.str(\"\"),new Sk.builtin.str(K)])}else if(S=K.indexOf(G),0>S)return new Sk.builtin.tuple([new Sk.builtin.str(K),new Sk.builtin.str(\"\"),new Sk.builtin.str(\"\")]);return new Sk.builtin.tuple([new Sk.builtin.str(K.substring(0,S)),new Sk.builtin.str(G),new Sk.builtin.str(K.substring(S+G.length))])}}function p(z,G){return function(K,S){K=Sk.misceval.asIndexSized(K,Sk.builtin.OverflowError);\nif(void 0===S)S=\" \";else if(S instanceof Sk.builtin.str&&1===S.sq$length())S=S.v;else throw new Sk.builtin.TypeError(\"the fill character must be a str of length 1\");var U=this.sq$length();if(U>=K)return new Sk.builtin.str(this.v);if(G)return U=K-U,K=Math.floor(U/2)+(U&K&1),S=S.repeat(K)+this.v+S.repeat(U-K),new Sk.builtin.str(S);S=S.repeat(K-U);return new Sk.builtin.str(z?S+this.v:this.v+S)}}function h(z,G,K){({start:G,end:K}=Sk.builtin.slice.startEnd$wrt(z,G,K));if(z.$hasAstralCodePoints()){const S=\nz.codepoints[G];G=void 0===S?G+z.v.length-z.codepoints.length:S;K=z.codepoints[K];K=void 0===K?z.v.length:K}return{start:G,end:K}}function f(z){return function(G,K,S){G=this.get$tgt(G);({start:K,end:S}=h(this,K,S));if(S=K&&G<=S?G:-1;if(this.codepoints){S=this.sq$length();K=-1;for(let U=0;UU)return Sk.builtin.bool.false$;S=this.v.slice(S,U);if(K instanceof Sk.builtin.tuple){for(let r=Sk.abstr.iter(K),y=r.tp$iternext();void 0!==y;y=r.tp$iternext()){if(!(y instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"tuple for \"+z+\" must only contain str, not \"+Sk.abstr.typeName(y));if(G(S,y.v))return Sk.builtin.bool.true$}return Sk.builtin.bool.false$}return new Sk.builtin.bool(G(S,\nK.v))}}function m(z){return void 0===E[z]?z:z+\"_$rw$\"}D=a(1).default;var n=/^[0-9!#_]/;R=D.Zs.replace(\" \",\"\").replace(\"\\\\u0020\",\"\");const g=new RegExp(\"[\"+D.C+D.Zl+D.Zp+R+\"]\",\"u\"),t=new RegExp(\"^[\"+D.Nd+\"]+$\",\"u\");var l=Array(256),q=new Map;Sk.builtin.str=Sk.abstr.buildNativeClass(\"str\",{constructor:function(z,G){Sk.asserts.assert(this instanceof Sk.builtin.str,\"bad call to str - use 'new'\");if(\"string\"!==typeof z)if(void 0===z)z=\"\";else if(null===z)z=\"None\";else{if(void 0!==z.tp$str)return z.tp$str();\nif(\"number\"===typeof z)z=Number.isFinite(z)?String(z):String(z).replace(\"Infinity\",\"inf\").replace(\"NaN\",\"nan\");else throw new Sk.builtin.TypeError(\"could not convert object of type '\"+Sk.abstr.typeName(z)+\"' to str\");}var K=z.length;0===K?K=L:1!==K?K=void 0:(K=z.charCodeAt(0),K=256>K?l[K]:void 0);if(void 0!==K)return K;if(G){K=q.get(z);if(void 0!==K)return K;q.set(z,this)}this.$mangled=m(z);this.$savedKeyHash=z.replace(n,\"!$&\");this.v=z;this.$hash=-1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,\ntp$doc:\"str(object='') -> str\\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\\n\\nCreate a new string object from the given object. If encoding or\\nerrors is specified, then the object must expose a data buffer\\nthat will be decoded using the given encoding and error handler.\\nOtherwise, returns the result of object.__str__() (if defined)\\nor repr(object).\\nencoding defaults to sys.getdefaultencoding().\\nerrors defaults to 'strict'.\",tp$new(z,G){G=G||[];if(this!==Sk.builtin.str.prototype)return this.$subtype_new(z,\nG);if(1>=z.length&&!G.length)return new Sk.builtin.str(z[0]);if(Sk.__future__.python3){const [K,S,U]=Sk.abstr.copyKeywordsToNamedArgs(\"str\",[\"object\",\"encoding\",\"errors\"],z,G);if(void 0===K||void 0===S&&void 0===U)return new Sk.builtin.str(K);Sk.builtin.bytes.check$encodeArgs(\"str\",S,U);if(!Sk.builtin.checkBytes(K))throw new Sk.builtin.TypeError(\"decoding to str: need a bytes-like object, \"+Sk.abstr.typeName(K)+\" found\");return Sk.builtin.bytes.$decode.call(K,S,U)}throw new Sk.builtin.TypeError(\"str takes at most one argument (\"+\n(z.length+G.length)+\" given)\");},tp$hash(){if(-1!==this.$hash)return this.$hash;const z=this.v;if(0===z.length)return this.$hash=0;let G=z.length,K=0,S;for(S=0xe9b597bd163a6^z.charCodeAt(K)<<7;0<=--G;)S=1000003*S^z.charCodeAt(++K);S^=z.length;S^=0x621cdb4baf09f;-1===S&&(S=-2);return this.$hash=S},$r(){let z=\"'\";-1!==this.v.indexOf(\"'\")&&-1===this.v.indexOf('\"')&&(z='\"');const G=this.v.length;let K=z;for(let r=0;rU||57344<=U)&&!Sk.__future__.python3?K+=\"\\\\u\"+(\"000\"+U.toString(16)).slice(-4):55296<=U&&!Sk.__future__.python3?(S=this.v.codePointAt(r),r++,S=S.toString(16),U=\"0000000\"+S.toString(16),K=4S||127<=U&&!Sk.__future__.python3?(S=S.charCodeAt(0).toString(16),2>S.length&&(S=\"0\"+S),K+=\"\\\\x\"+S):K+=S}return new Sk.builtin.str(K+z)},tp$str(){return this.constructor===\nSk.builtin.str?this:new Sk.builtin.str(this.v)},tp$iter(){return new C(this)},tp$richcompare(z,G){if(!(z instanceof Sk.builtin.str))return Sk.builtin.NotImplemented.NotImplemented$;switch(G){case \"Lt\":return this.vz.v;case \"GtE\":return this.v>=z.v}},mp$subscript(z){let G;if(Sk.misceval.isIndex(z)){z=Sk.misceval.asIndexSized(z,Sk.builtin.OverflowError);G=this.sq$length();0>z&&(z+=\nG);if(0>z||z>=G)throw new Sk.builtin.IndexError(\"string index out of range\");return this.codepoints?new Sk.builtin.str(this.v.substring(this.codepoints[z],this.codepoints[z+1])):new Sk.builtin.str(this.v.charAt(z))}if(z instanceof Sk.builtin.slice){let K=\"\";G=this.sq$length();this.codepoints?z.sssiter$(G,S=>{K+=this.v.substring(this.codepoints[S],this.codepoints[S+1])}):z.sssiter$(G,S=>{K+=this.v.charAt(S)});return new Sk.builtin.str(K)}throw new Sk.builtin.TypeError(\"string indices must be integers, not \"+\nSk.abstr.typeName(z));},sq$length(){return this.$hasAstralCodePoints()?this.codepoints.length:this.v.length},sq$concat(z){if(!(z instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"cannot concatenate 'str' and '\"+Sk.abstr.typeName(z)+\"' objects\");return new Sk.builtin.str(this.v+z.v)},sq$repeat(z){if(!Sk.misceval.isIndex(z))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(z)+\"'\");z=Sk.misceval.asIndexSized(z,Sk.builtin.OverflowError);if(z*this.v.length>\nNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;let G=\"\";for(let K=0;K' requires string as left operand not \"+Sk.abstr.typeName(z));return-1!==this.v.indexOf(z.v)},tp$as_number:!0,nb$remainder:function(z){var G;const K=this.sk$builtinBase;z.constructor===Sk.builtin.tuple||z instanceof Sk.builtin.dict||z instanceof Sk.builtin.mappingproxy||(z=new Sk.builtin.tuple([z]));\nvar S=0;var U=this.$jsstr().replace(/%(\\([a-zA-Z0-9]+\\))?([#0 +\\-]+)?(\\*|[0-9]+)?(\\.(\\*|[0-9]+))?[hlL]?([diouxXeEfFgGcrsb%])/g,function(r,y,F,J,Q,X,ba){var ia,oa,pa,la,qa;J=Sk.builtin.asnum$(J);Q=Sk.builtin.asnum$(Q);void 0!==y&&\"\"!==y||\"%\"==ba||(ia=S++);\"\"===Q&&(Q=void 0);var na=oa=pa=la=qa=!1;F&&(-1!==F.indexOf(\"-\")?la=!0:-1!==F.indexOf(\"0\")&&(qa=!0),-1!==F.indexOf(\"+\")?oa=!0:-1!==F.indexOf(\" \")&&(pa=!0),na=-1!==F.indexOf(\"#\"));Q&&(Q=parseInt(Q.substr(1),10));F=function(ja,N){var W;N=Sk.builtin.asnum$(N);\nvar ea=!1;if(\"number\"===typeof ja){0>ja&&(ja=-ja,ea=!0);var I=ja.toString(N)}else ja instanceof Sk.builtin.float_?(I=ja.str$(N,!1),2G){this.codepoints=[];for(z=0;zG&&z++;return!0}}this.codepoints=null;return!1},sk$asarray(){const z=[];if(this.$hasAstralCodePoints()){var G=this.codepoints;for(let K=0;KK)return new Sk.builtin.str(this.v.replace(z,G));let S=0;z=this.v.replace(z,U=>S++G?0:2*(z.length/2-G);G=[];for(0>=K?K=0:G.push(new Sk.builtin.str(this.v.slice(0,z[K-1])));K{if(!(K instanceof Sk.builtin.str))throw new Sk.builtin.TypeError(\"sequence item \"+G.length+\": expected str, \"+Sk.abstr.typeName(K)+\" found\");G.push(K.v)}),()=>new Sk.builtin.str(G.join(this.v)))},$flags:{OneArg:!0},$textsig:\"($self, iterable, /)\",$doc:\"Concatenate any number of strings.\\n\\nThe string whose method is called is inserted in between each given string.\\nThe result is returned as a new string.\\n\\nExample: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'\"},\ncapitalize:{$meth:function(){return new Sk.builtin.str(this.v.charAt(0).toUpperCase()+this.v.slice(1).toLowerCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a capitalized version of the string.\\n\\nMore specifically, make the first character have upper case and the rest lower\\ncase.\"},title:{$meth:function(){const z=this.v.replace(/[a-z][a-z]*/gi,G=>G[0].toUpperCase()+G.substr(1).toLowerCase());return new Sk.builtin.str(z)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a version of the string where each word is titlecased.\\n\\nMore specifically, words start with uppercased characters and all remaining\\ncased characters have lower case.\"},\ncenter:{$meth:p(!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a centered string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},count:{$meth:function(z,G,K){z=this.get$tgt(z);({start:G,end:K}=h(this,G,K));if(K int\\n\\nReturn the number of non-overlapping occurrences of substring sub in\\nstring S[start:end]. Optional arguments start and end are\\ninterpreted as in slice notation.\"},expandtabs:{$meth:function(z){if(Sk.builtin.checkInt(z))z=Sk.builtin.asnum$(z);else throw new Sk.builtin.TypeError(\"an integer is required, got type\"+Sk.abstr.typeName(z));const G=Array(z+1).join(\" \"),K=this.v.replace(/([^\\r\\n\\t]*)\\t/g,(S,U)=>U+G.slice(U.length%z));\nreturn new Sk.builtin.str(K)},$flags:{NamedArgs:[\"tabsize\"],Defaults:[8]},$textsig:\"($self, /, tabsize=8)\",$doc:\"Return a copy where all tab characters are expanded using spaces.\\n\\nIf tabsize is not given, a tab size of 8 characters is assumed.\"},find:{$meth:function(z,G,K){return new Sk.builtin.int_(this.find$left(z,G,K))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.find(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},\npartition:{$meth:k(!1),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the string into three parts using the given separator.\\n\\nThis will search for the separator in the string. If the separator is found,\\nreturns a 3-tuple containing the part before the separator, the separator\\nitself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing the original string\\nand two empty strings.\"},index:{$meth:function(z,G,K){z=this.find$left(z,G,K);if(-1===z)throw new Sk.builtin.ValueError(\"substring not found\");\nreturn new Sk.builtin.int_(z)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.index(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in S where substring sub is found, \\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the substring is not found.\"},ljust:{$meth:p(!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a left-justified string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},\nlower:{$meth(){return new Sk.builtin.str(this.v.toLowerCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a copy of the string converted to lowercase.\"},lstrip:{$meth:e(/^\\s+/g,z=>\"^[\"+z+\"]+\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with leading whitespace removed.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},removeprefix:{$meth:function(z){z=this.get$tgt(z);const G=this.v;return G.startsWith(z)?new Sk.builtin.str(G.slice(z.length)):\nthis},$flags:{OneArg:!0},$textsig:\"($self, prefix, /)\",$doc:\"Return a str with the given prefix string removed if present.\\n\\nIf the string starts with the prefix string, return string[len(prefix):].\\nOtherwise, return a copy of the original string.\"},removesuffix:{$meth:function(z){z=this.get$tgt(z);const G=this.v;return G.endsWith(z)?new Sk.builtin.str(G.slice(0,G.length-z.length)):this},$flags:{OneArg:!0},$textsig:\"($self, suffix, /)\",$doc:\"Return a str with the given suffix string removed if present.\\n\\nIf the string ends with the suffix string and that suffix is not empty,\\nreturn string[:-len(suffix)]. Otherwise, return a copy of the original string.\"},\nrfind:{$meth(z,G,K){return new Sk.builtin.int_(this.find$right(z,G,K))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.rfind(sub[, start[, end]]) -> int\\n\\nReturn the highest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},rindex:{$meth:function(z,G,K){z=this.find$right(z,G,K);if(-1===z)throw new Sk.builtin.ValueError(\"substring not found\");return new Sk.builtin.int_(z)},\n$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.rindex(sub[, start[, end]]) -> int\\n\\nReturn the highest index in S where substring sub is found,\\nsuch that sub is contained within S[start:end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the substring is not found.\"},rjust:{$meth:p(!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, width, fillchar=' ', /)\",$doc:\"Return a right-justified string of length width.\\n\\nPadding is done using the specified fill character (default is a space).\"},\nrstrip:{$meth:e(/\\s+$/g,z=>\"[\"+z+\"]+$\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with trailing whitespace removed.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},rpartition:{$meth:k(!0),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the string into three parts using the given separator.\\n\\nThis will search for the separator in the string, starting at the end. If\\nthe separator is found, returns a 3-tuple containing the part before the\\nseparator, the separator itself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing two empty strings\\nand the original string.\"},\nsplitlines:{$meth:function(z){z=Sk.misceval.isTrue(z);const G=this.v,K=[],S=G.length;var U=0;for(let y=0;y\"^[\"+z+\"]+|[\"+z+\"]+$\"),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, chars=None, /)\",$doc:\"Return a copy of the string with leading and trailing whitespace remove.\\n\\nIf chars is given and not None, remove characters in chars instead.\"},\nswapcase:{$meth(){const z=this.v.replace(/[a-z]/gi,G=>{const K=G.toLowerCase();return K===G?G.toUpperCase():K});return new Sk.builtin.str(z)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Convert uppercase characters to lowercase and lowercase characters to uppercase.\"},upper:{$meth(){return new Sk.builtin.str(this.v.toUpperCase())},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return a copy of the string converted to uppercase.\"},startswith:{$meth:b(\"startswith\",(z,G)=>0===z.indexOf(G)),$flags:{MinArgs:1,\nMaxArgs:3},$textsig:null,$doc:\"S.startswith(prefix[, start[, end]]) -> bool\\n\\nReturn True if S starts with the specified prefix, False otherwise.\\nWith optional start, test S beginning at that position.\\nWith optional end, stop comparing S at that position.\\nprefix can also be a tuple of strings to try.\"},endswith:{$meth:b(\"endswith\",(z,G)=>-1!==z.indexOf(G,z.length-G.length)),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"S.endswith(suffix[, start[, end]]) -> bool\\n\\nReturn True if S ends with the specified suffix, False otherwise.\\nWith optional start, test S beginning at that position.\\nWith optional end, stop comparing S at that position.\\nsuffix can also be a tuple of strings to try.\"},\nisascii:{$meth(){return new Sk.builtin.bool(/^[\\x00-\\x7F]*$/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if all characters in the string are ASCII, False otherwise.\\n\\nASCII characters have code points in the range U+0000-U+007F.\\nEmpty string is ASCII too.\"},islower:{$meth:function(){return new Sk.builtin.bool(this.v.length&&/[a-z]/.test(this.v)&&!/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if the string is a lowercase string, False otherwise.\\n\\nA string is lowercase if all cased characters in the string are lowercase and\\nthere is at least one cased character in the string.\"},\nisupper:{$meth:function(){return new Sk.builtin.bool(this.v.length&&!/[a-z]/.test(this.v)&&/[A-Z]/.test(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if the string is an uppercase string, False otherwise.\\n\\nA string is uppercase if all cased characters in the string are uppercase and\\nthere is at least one cased character in the string.\"},istitle:{$meth:function(){const z=this.v;let G=!1,K=!1,S;for(let U=0;U str\\n\\nReturn a formatted version of S, using substitutions from args and kwargs.\\nThe substitutions are identified by braces ('{' and '}').\"},\n__format__:{$meth:Sk.formatting.formatString,$flags:{OneArg:!0},$textsig:\"($self, format_spec, /)\",$doc:\"Return a formatted version of the string as described by format_spec.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.str(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null}}});Sk.exportSymbol(\"Sk.builtin.str\",Sk.builtin.str);var w=/^[A-Za-z0-9]+$/,x=/([.*+?=|\\\\\\/()\\[\\]\\{\\}^$])/g,v=/^[\\s\\xa0]+/;Sk.builtin.str.$py2decode=new Sk.builtin.method_descriptor(Sk.builtin.str,{$name:\"decode\",\n$meth(z,G){const K=new Sk.builtin.bytes(this.v);return Sk.builtin.bytes.$decode.call(K,z,G)},$flags:{NamedArgs:[\"encoding\",\"errors\"]}});var C=Sk.abstr.buildIteratorClass(\"str_iterator\",{constructor:function(z){this.$index=0;z.$hasAstralCodePoints()?(this.$seq=z.codepoints,this.tp$iternext=()=>{const G=this.$seq[this.$index];if(void 0!==G)return new Sk.builtin.str(z.v.substring(G,this.$seq[++this.$index]))}):(this.$seq=z.v,this.tp$iternext=()=>{const G=this.$seq[this.$index++];if(void 0!==G)return new Sk.builtin.str(G)})},\niternext(){return this.tp$iternext()},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),E={abstract:!0,as:!0,boolean:!0,break:!0,byte:!0,case:!0,catch:!0,char:!0,class:!0,continue:!0,const:!0,debugger:!0,default:!0,delete:!0,do:!0,double:!0,else:!0,enum:!0,export:!0,extends:!0,false:!0,final:!0,finally:!0,float:!0,for:!0,function:!0,goto:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,int:!0,interface:!0,is:!0,long:!0,namespace:!0,native:!0,\nnew:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,short:!0,static:!0,super:!0,switch:!0,synchronized:!0,this:!0,throw:!0,throws:!0,transient:!0,true:!0,try:!0,typeof:!0,use:!0,var:!0,void:!0,volatile:!0,while:!0,with:!0,constructor:!0,__defineGetter__:!0,__defineSetter__:!0,apply:!0,arguments:!0,call:!0,caller:!0,eval:!0,hasOwnProperty:!0,isPrototypeOf:!0,__lookupGetter__:!0,__lookupSetter__:!0,__noSuchMethod__:!0,propertyIsEnumerable:!0,prototype:!0,toSource:!0,toLocaleString:!0,\ntoString:!0,unwatch:!0,valueOf:!0,watch:!0,length:!0,name:!0};Sk.builtin.str.reservedWords_=E;Sk.builtin.str.$fixReserved=m;var L=new Sk.builtin.str(\"\");for(D=0;256>D;D++)l[D]=new Sk.builtin.str(String.fromCharCode(D))},function(D,R){Sk.builtin.func=Sk.abstr.buildNativeClass(\"function\",{constructor:function(a,d,c,e){Sk.asserts.assert(this instanceof Sk.builtin.func,\"builtin func should be called as a class with `new`\");this.func_code=a;this.func_globals=d||null;this.$name=a.co_name||new Sk.builtin.str(a.name||\n\"\");this.$d=Sk.builtin.dict?new Sk.builtin.dict:void 0;this.$doc=a.co_docstring||Sk.builtin.none.none$;this.$module=Sk.globals&&Sk.globals.__name__||Sk.builtin.none.none$;this.$qualname=a.co_qualname||this.$name;if(void 0!==e)for(let k in e)c[k]=e[k];this.func_closure=c;this.func_annotations=null;this.$memoiseFlags();this.memoised=a.co_fastcall||null;this.tp$call=a.co_fastcall?a.bind(this):Sk.builtin.func.prototype.$funcCall.bind(this)},slots:{tp$getattr:Sk.generic.getAttr,tp$descr_get(a,\nd){return null===a?this:new Sk.builtin.method(this,a)},$r(){return new Sk.builtin.str(\"\")},tp$call(a,d){return this.tp$call(a,d)}},getsets:{__name__:{$get(){return this.$name},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"__name__ must be set to a string object\");this.$name=a}},__qualname__:{$get(){return new Sk.builtin.str(this.$qualname)},$set(a){if(!Sk.builtin.checkString(a))throw new Sk.builtin.TypeError(\"__qualname__ must be set to a string object\");\nthis.$qualname=a}},__dict__:Sk.generic.getSetDict,__annotations__:{$get(){null===this.func_annotations?this.func_annotations=new Sk.builtin.dict([]):Array.isArray(this.func_annotations)&&(this.func_annotations=Sk.abstr.keywordArrayToPyDict(this.func_annotations));return this.func_annotations},$set(a){if(void 0===a||Sk.builtin.checkNone(a))this.func_annotations=new Sk.builtin.dict([]);else if(a instanceof Sk.builtin.dict)this.func_annotations=a;else throw new Sk.builtin.TypeError(\"__annotations__ must be set to a dict object\");\n}},__defaults__:{$get(){return null==this.$defaults?Sk.builtin.none.none$:new Sk.builtin.tuple(this.$defaults)},$set(a){if(void 0===a||Sk.builtin.checkNone(a))this.$defaults=null;else if(a instanceof Sk.builtin.tuple)this.$defaults=a.valueOf();else throw new Sk.builtin.TypeError(\"__defaults__ must be set to a tuple object\");}},__doc__:{$get(){return this.$doc},$set(a){this.$doc=a||Sk.builtin.none.none$}},__module__:{$get(){return this.$module},$set(a){this.$module=a||Sk.builtin.none.none$}}},proto:{$memoiseFlags(){this.co_varnames=\nthis.func_code.co_varnames;this.co_argcount=this.func_code.co_argcount;void 0===this.co_argcount&&this.co_varnames&&(this.co_argcount=this.co_varnames.length);this.co_kwonlyargcount=this.func_code.co_kwonlyargcount||0;this.co_varargs=this.func_code.co_varargs;this.co_kwargs=this.func_code.co_kwargs;this.$defaults=this.func_code.$defaults;this.$kwdefs=this.func_code.$kwdefs||[]},$resolveArgs:function(a,d){var c=this.co_argcount;void 0===c&&(c=this.co_varnames?this.co_varnames.length:a.length);var e=\nthis.co_varnames||[],k=this.co_kwonlyargcount||0;let p=c+k;if(!(0!==k||this.co_kwargs||d&&0!==d.length||this.co_varargs)){if(a.length==c)return a;if(0===a.length&&this.$defaults&&this.$defaults.length===c){for(e=0;e!=this.$defaults.length;e++)a[e]=this.$defaults[e];return a}}let h;this.co_kwargs&&(h=[]);var f=a.length;let b=a.length<=c?a:a.slice(0,c);if(this.co_varargs)a=a.length>b.length?a.slice(b.length):[],b[p]=new Sk.builtin.tuple(a);else if(f>c)throw new Sk.builtin.TypeError(`${this.$name}() takes ${c} positional ${1==\nc?\"argument\":\"arguments\"} but ${f} ${1==f?\"was\":\"were\"} given`);if(d){if(this.func_code.no_kw)throw new Sk.builtin.TypeError(this.$name+\"() takes no keyword arguments\");for(a=0;a\"'\"+g+\"'\").join(\", \")));for(;ae.indexOf(\".\")&&0>e.indexOf(\"e\")&&0>e.indexOf(\"E\"))return e;var k=0;if(0<=e.indexOf(\"e\")){var p=e.substr(0,e.indexOf(\"e\"));k=e.substr(e.indexOf(\"e\")+1)}else 0<=e.indexOf(\"E\")?(p=e.substr(0,e.indexOf(\"e\")),k=\ne.substr(e.indexOf(\"E\")+1)):p=e;k=parseInt(k,10);e=p.indexOf(\".\");if(0>e){if(0<=k){for(;0-k?p.substr(0,p.length+k):0}p=0===e?p.substr(1):ep.length;)p+=\"0\";return p=0>=e?0:p.substr(0,e)};Sk.exportSymbol(\"Sk.builtin.asnum$nofloat\",Sk.builtin.asnum$nofloat);Sk.builtin.round=function(e,k){if(void 0===e)throw new Sk.builtin.TypeError(\"a float is required\");if(!Sk.__future__.dunder_round){if(!Sk.builtin.checkNumber(e))throw new Sk.builtin.TypeError(\"a float is required\");\nif(e.round$)return e.round$(k);throw new Sk.builtin.AttributeError(Sk.abstr.typeName(e)+\" instance has no attribute '__float__'\");}if(void 0!==k&&!Sk.builtin.checkNone(k)&&!Sk.misceval.isIndex(k))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(k)+\"' object cannot be interpreted as an index\");e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$round);if(void 0!==e)return void 0!==k?Sk.misceval.callsimArray(e,[k]):Sk.misceval.callsimArray(e,[]);throw new Sk.builtin.TypeError(\"a float is required\");};Sk.builtin.len=\nfunction(e){if(e.sq$length)e=e.sq$length(!0);else throw new Sk.builtin.TypeError(\"object of type '\"+Sk.abstr.typeName(e)+\"' has no len()\");return Sk.misceval.chain(e,k=>new Sk.builtin.int_(k))};Sk.builtin.min=function(e,k){let p;const h=e.length;if(!h)throw new Sk.builtin.TypeError(\"min expected 1 argument, got 0\");const [f,b]=Sk.abstr.copyKeywordsToNamedArgs(\"min\",[\"default\",\"key\"],[],k,[null,Sk.builtin.none.none$]);if(1{m=n;if(void 0!==m)return Sk.builtin.checkNone(b)?Sk.misceval.iterFor(p,g=>{Sk.misceval.richCompareBool(g,m,\"Lt\")&&(m=g)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,[m]),g=>Sk.misceval.iterFor(p,t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,\n[t]),l=>{Sk.misceval.richCompareBool(l,g,\"Lt\")&&(m=t,g=l)})))},()=>{if(void 0===m){if(null===f)throw new Sk.builtin.ValueError(\"min() arg is an empty sequence\");m=f}return m})};Sk.builtin.max=function(e,k){let p;const h=e.length;if(!h)throw new Sk.builtin.TypeError(\"max expected 1 argument, got 0\");const [f,b]=Sk.abstr.copyKeywordsToNamedArgs(\"max\",[\"default\",\"key\"],[],k,[null,Sk.builtin.none.none$]);if(1{m=n;if(void 0!==m)return Sk.builtin.checkNone(b)?Sk.misceval.iterFor(p,g=>{Sk.misceval.richCompareBool(g,m,\"Gt\")&&(m=g)}):Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,[m]),g=>Sk.misceval.iterFor(p,t=>Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(b,\n[t]),l=>{Sk.misceval.richCompareBool(l,g,\"Gt\")&&(m=t,g=l)})))},()=>{if(void 0===m){if(null===f)throw new Sk.builtin.ValueError(\"max() arg is an empty sequence\");m=f}return m})};Sk.builtin.min.co_fastcall=Sk.builtin.max.co_fastcall=1;Sk.builtin.any=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),function(k){if(Sk.misceval.isTrue(k))return new Sk.misceval.Break(Sk.builtin.bool.true$)}),k=>k||Sk.builtin.bool.false$)};Sk.builtin.all=function(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),\nfunction(k){if(!Sk.misceval.isTrue(k))return new Sk.misceval.Break(Sk.builtin.bool.false$)}),k=>k||Sk.builtin.bool.true$)};Sk.builtin.sum=function(e,k){function p(){return Sk.misceval.iterFor(b,n=>{if(n.constructor===Sk.builtin.int_)m=m.nb$add(n);else{if(n.constructor===Sk.builtin.float_)return m=m.nb$float().nb$add(n),new Sk.misceval.Break(\"float\");m=Sk.abstr.numberBinOp(m,n,\"Add\");return new Sk.misceval.Break(\"slow\")}})}function h(){return Sk.misceval.iterFor(b,n=>{if(n.constructor===Sk.builtin.float_||\nn.constructor===Sk.builtin.int_)m=m.nb$add(n);else return m=Sk.abstr.numberBinOp(m,n,\"Add\"),new Sk.misceval.Break(\"slow\")})}function f(){return Sk.misceval.iterFor(b,n=>{m=Sk.abstr.numberBinOp(m,n,\"Add\")})}const b=Sk.abstr.iter(e);if(void 0===k)var m=new Sk.builtin.int_(0);else{if(Sk.builtin.checkString(k))throw new Sk.builtin.TypeError(\"sum() can't sum strings [use ''.join(seq) instead]\");m=k}e=void 0===k||k.constructor===Sk.builtin.int_?p():k.constructor===Sk.builtin.float_?\"float\":\"slow\";return Sk.misceval.chain(e,\nn=>\"float\"===n?h():n,n=>{if(\"slow\"===n)return f()},()=>m)};Sk.builtin.zip=function(){var e,k;if(0===arguments.length)return new Sk.builtin.list([]);var p=[];for(k=0;ke||1114112<=e)throw new Sk.builtin.ValueError(\"chr() arg not in range(0x110000)\");}else if(0>e||256<=e)throw new Sk.builtin.ValueError(\"chr() arg not in range(256)\");return new Sk.builtin.str(String.fromCodePoint(e))};\nSk.builtin.unichr=function(e){Sk.builtin.pyCheckArgsLen(\"unichr\",arguments.length,1,1);if(!Sk.builtin.checkInt(e))throw new Sk.builtin.TypeError(\"an integer is required\");e=Sk.builtin.asnum$(e);try{return new Sk.builtin.str(String.fromCodePoint(e))}catch(k){if(k instanceof RangeError)throw new Sk.builtin.ValueError(k.message);throw k;}};Sk.builtin.int2str_=function(e,k,p){let h=Sk.misceval.asIndexOrThrow(e),f=h.toString(k);f=0>h?\"-\"+p+f.slice(1):p+f;2!==k&&!Sk.__future__.python3&&(e instanceof Sk.builtin.lng||\nJSBI.__isBigInt(h))&&(f+=\"L\");return new Sk.builtin.str(f)};Sk.builtin.hex=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError(\"hex() argument can't be converted to hex\");return Sk.builtin.int2str_(e,16,\"0x\")};Sk.builtin.oct=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError(\"oct() argument can't be converted to hex\");return Sk.__future__.octal_number_literal?Sk.builtin.int2str_(e,8,\"0o\"):Sk.builtin.int2str_(e,8,\"0\")};Sk.builtin.bin=function(e){if(!Sk.misceval.isIndex(e))throw new Sk.builtin.TypeError(\"'\"+\nSk.abstr.typeName(e)+\"' object can't be interpreted as an index\");return Sk.builtin.int2str_(e,2,\"0b\")};Sk.builtin.dir=function(e){if(void 0!==e)return e=Sk.abstr.lookupSpecial(e,Sk.builtin.str.$dir),Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(e,[]),k=>Sk.builtin.sorted(k));throw new Sk.builtin.NotImplementedError(\"skulpt does not yet support dir with no args\");};Sk.builtin.repr=function(e){return e.$r()};Sk.builtin.ascii=function(e){return Sk.misceval.chain(e.$r(),k=>{let p,h;for(h=0;h=b?(f=b.toString(16),2>f.length&&(f=\"0\"+f),p+=\"\\\\x\"+f):127b||57344<=b?p+=\"\\\\u\"+(\"000\"+b.toString(16)).slice(-4):55296<=b?(f=k.v.codePointAt(h),h++,f=f.toString(16),b=\"0000000\"+f.toString(16),p=4e.tp$getattr(k,!0),\nf=>{if(!(f instanceof Sk.builtin.AttributeError))throw f;});return Sk.misceval.chain(h,f=>{if(void 0===f){if(void 0!==p)return p;throw new Sk.builtin.AttributeError(e.sk$attrError()+\" has no attribute \"+Sk.misceval.objectRepr(k));}return f})};Sk.builtin.setattr=function(e,k,p){if(!Sk.builtin.checkString(k))throw new Sk.builtin.TypeError(\"attribute name must be string\");return Sk.misceval.chain(e.tp$setattr(k,p,!0),()=>Sk.builtin.none.none$)};Sk.builtin.raw_input=function(e){var k=e?e:\"\";return Sk.misceval.chain(Sk.importModule(\"sys\",\n!1,!0),function(p){const h=0===p.$d.stdin.fileno;return Sk.inputfunTakesPrompt&&h?Sk.builtin.file.$readline(p.$d.stdin,null,k):Sk.misceval.chain(void 0,()=>Sk.misceval.callsimOrSuspendArray(p.$d.stdout.write,[p.$d.stdout,new Sk.builtin.str(k)]),()=>Sk.misceval.callsimOrSuspendArray(p.$d.stdin.readline,[p.$d.stdin]),f=>new Sk.builtin.str(f.$jsstr().replace(/[\\r\\n]+$/,\"\")))})};Sk.builtin.input=Sk.builtin.raw_input;Sk.builtin.jseval=function(e){e=Sk.global.eval(Sk.ffi.remapToJs(e));return Sk.ffi.remapToPy(e)};\nSk.builtin.jsmillis=function(){console.warn(\"jsmillis is deprecated\");return(new Date).valueOf()};const a=Sk.abstr.buildNativeClass(\"code\",{constructor:function(e,k){this.compiled=k;this.code=k.code;this.filename=e},slots:{tp$new(e,k){throw new Sk.builtin.NotImplementedError(\"cannot construct a code object in skulpt\");},$r(){return new Sk.builtin.str(\", file \"+this.filename+\">\")}}});Sk.builtin.compile=function(e,k,p,h,f,b){Sk.builtin.pyCheckType(\"source\",\"str\",Sk.builtin.checkString(e));\nSk.builtin.pyCheckType(\"filename\",\"str\",Sk.builtin.checkString(k));Sk.builtin.pyCheckType(\"mode\",\"str\",Sk.builtin.checkString(p));e=e.$jsstr();k=k.$jsstr();p=p.$jsstr();return Sk.misceval.chain(Sk.compile(e,k,p,!0),m=>new a(k,m))};Sk.builtin.exec=function(e,k,p){let h=k&&k.__file__;h=void 0!==h&&Sk.builtin.checkString(h)?h.toString():\"\";if(Sk.builtin.checkString(e))e=Sk.compile(e.$jsstr(),h,\"exec\",!0);else if(\"string\"===typeof e)e=Sk.compile(e,h,\"exec\",!0);else if(!(e instanceof a))throw new Sk.builtin.TypeError(\"exec() arg 1 must be a string, bytes or code object\");\nSk.asserts.assert(void 0===k||k.constructor===Object,\"internal calls to exec should be called with a javascript object for globals\");Sk.asserts.assert(void 0===p||p.constructor===Object,\"internal calls to exec should be called with a javascript object for locals\");const f=Sk.globals;k=k||f;return Sk.misceval.chain(e,b=>Sk.global.eval(b.code)(k,p),b=>{Sk.globals=f;return b})};Sk.builtin.eval=function(e,k,p){if(Sk.builtin.checkString(e))e=e.$jsstr();else if(Sk.builtin.checkBytes(e))throw new Sk.builtin.NotImplementedError(\"bytes for eval is not yet implemented in skulpt\");\nif(\"string\"===typeof e){e=e.trim();var h=Sk.parse(\"?\",e);h=Sk.astFromParse(h.cst,\"?\",h.flags);if(1{const b=f.__final_res__||Sk.builtin.none.none$;delete f.__final_res__;return b})};Sk.builtin.map=function(e,k){var p=\n[],h,f;Sk.builtin.pyCheckArgsLen(\"map\",arguments.length,2);if(2{f=new Sk.builtin.list(f);f.list$sort(k,p,h);return f})};Sk.builtin.filter=function(e,k){var p;Sk.builtin.pyCheckArgsLen(\"filter\",arguments.length,\n2,2);if(!Sk.builtin.checkIterable(k))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(k)+\"' object is not iterable\");var h=function(){return[]};var f=function(g,t){g.push(t);return g};var b=function(g){return new Sk.builtin.list(g)};k.ob$type===Sk.builtin.str?(h=function(){return new Sk.builtin.str(\"\")},f=function(g,t){return g.sq$concat(t)},b=function(g){return g}):k.ob$type===Sk.builtin.tuple&&(b=function(g){return new Sk.builtin.tuple(g)});var m=h();var n=Sk.abstr.iter(k);for(p=n.tp$iternext();void 0!==\np;p=n.tp$iternext())h=e===Sk.builtin.none.none$?new Sk.builtin.bool(p):Sk.misceval.callsimArray(e,[p]),Sk.misceval.isTrue(h)&&(m=f(m,p));return b(m)};Sk.builtin.hasattr=function(e,k){if(!Sk.builtin.checkString(k))throw new Sk.builtin.TypeError(\"hasattr(): attribute name must be string\");const p=Sk.misceval.tryCatch(()=>e.tp$getattr(k,!0),h=>{if(!(h instanceof Sk.builtin.AttributeError))throw h;});return Sk.misceval.chain(p,h=>void 0===h?Sk.builtin.bool.false$:Sk.builtin.bool.true$)};Sk.builtin.pow=\nfunction(e,k,p){if(void 0===p||Sk.builtin.checkNone(p))return Sk.abstr.numberBinOp(e,k,\"Pow\");if(!(Sk.builtin.checkInt(e)&&Sk.builtin.checkInt(k)&&Sk.builtin.checkInt(p))){if(Sk.builtin.checkFloat(e)||Sk.builtin.checkComplex(e))return e.nb$power(k,p);throw new Sk.builtin.TypeError(\"unsupported operand type(s) for ** or pow(): '\"+Sk.abstr.typeName(e)+\"', '\"+Sk.abstr.typeName(k)+\"', '\"+Sk.abstr.typeName(p)+\"'\");}return e.nb$power(k,p)};Sk.builtin.quit=function(e){e=(new Sk.builtin.str(e)).v;throw new Sk.builtin.SystemExit(e);\n};Sk.builtin.issubclass=function(e,k){if(!Sk.builtin.checkClass(e))throw new Sk.builtin.TypeError(\"issubclass() arg 1 must be a class\");var p=Sk.builtin.checkClass(k);if(!(p||k instanceof Sk.builtin.tuple))throw new Sk.builtin.TypeError(\"issubclass() arg 2 must be a class or tuple of classes\");if(p)return e.$isSubType(k)?Sk.builtin.bool.true$:Sk.builtin.bool.false$;for(p=0;p{if(void 0===p){if(k)return k;p=e.gi$ret;if(void 0!==p&&p!==Sk.builtin.none.none$)throw new Sk.builtin.StopIteration(p);\nthrow new Sk.builtin.StopIteration;}return p})};Sk.builtin.reload=function(){throw new Sk.builtin.NotImplementedError(\"reload is not yet implemented\");};Sk.builtin.vars=function(){throw new Sk.builtin.NotImplementedError(\"vars is not yet implemented\");};Sk.builtin.apply_=function(){throw new Sk.builtin.NotImplementedError(\"apply is not yet implemented\");};Sk.builtin.buffer=function(){throw new Sk.builtin.NotImplementedError(\"buffer is not yet implemented\");};Sk.builtin.coerce=function(){throw new Sk.builtin.NotImplementedError(\"coerce is not yet implemented\");\n};Sk.builtin.intern=function(){throw new Sk.builtin.NotImplementedError(\"intern is not yet implemented\");}},function(D,R){function a(W,ea){ea=new this.constructor;this.ht$type&&p.call(ea);ea.args=new Sk.builtin.tuple(W.slice(0));return ea}function d(W,ea){Sk.abstr.checkNoKwargs(Sk.abstr.typeName(this),ea);this.args=new Sk.builtin.tuple(W.slice(0))}function c(){return 1>=this.args.v.length?new Sk.builtin.str(this.args.v[0]):this.args.$r()}function e(W,ea,I,T,Z,B){Z||(Z=[]);const u=T?{}:{sk$solidBase:!1};\nI={tp$init:T||d,tp$doc:I};B&&(I.tp$str=B);return Sk.abstr.buildNativeClass(ea,{base:W,constructor:function(...A){W.apply(this,A);Z.forEach((H,M)=>{this[\"$\"+H]=Sk.ffi.remapToPy(A[M])})},slots:I,getsets:Object.fromEntries(Z.map(A=>[A,{$get(){return this[\"$\"+A]||Sk.builtin.none.none$},$set(H){this[\"$\"+A]=H||Sk.builtin.none.none$}}])),flags:u})}function k(W,ea,I){const T=W.prototype.tp$init;I={tp$doc:I,tp$init:T};T===d&&(I.tp$new=a);return Sk.abstr.buildNativeClass(ea,{base:W,constructor:function(...Z){W.apply(this,\nZ)},slots:I,flags:{sk$solidBase:!1}})}const p=Sk.abstr.buildNativeClass(\"BaseException\",{constructor:function T(ea,...I){Sk.asserts.assert(this instanceof T,\"bad call to exception constructor, use 'new'\");\"string\"===typeof ea&&(ea=new Sk.builtin.str(ea));this.args=new Sk.builtin.tuple(ea?[ea]:[]);this.traceback=2<=I.length?[{filename:I[0]||\"\",lineno:I[1]}]:[];this.context=this.cause=null;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:\"Common base class for all exceptions\",\ntp$new:a,tp$init:d,$r(){let ea=this.tp$name;ea+=\"(\"+this.args.v.map(I=>Sk.misceval.objectRepr(I)).join(\", \")+\")\";return new Sk.builtin.str(ea)},tp$str:c},getsets:{args:{$get(){return this.args},$set(ea){if(void 0===ea)throw new Sk.builtin.TypeError(\"args may not be deleted\");this.args=new Sk.builtin.tuple(ea)}},__cause__:{$get(){return this.$cause||Sk.builtin.none.none$},$set(ea){if(!(Sk.builtin.checkNone(ea)||ea instanceof Sk.builtin.BaseException))throw new qa(\"exception cause must be None or derive from BaseException\");\nthis.$cause=ea}},__dict__:Sk.generic.getSetDict},proto:{toString(){let ea=this.tp$name;ea+=\": \"+this.tp$str().v;return ea=0!==this.traceback.length?ea+(\" on line \"+this.traceback[0].lineno):ea+\" at \"}}});D=k(p,\"SystemExit\",\"Request to exit from the interpreter.\");R=k(p,\"KeyboardInterrupt\",\"Program interrupted by user.\");const h=k(p,\"GeneratorExit\",\"Request that a generator exit.\"),f=k(p,\"Exception\",\"Common base class for all non-exit exceptions.\"),b=e(f,\"StopIteration\",\"Signal the end from iterator.__next__().\",\nfunction(ea,I){d.call(this,ea,I);this.$value=ea[0]||Sk.builtin.none.none$},[\"value\"]),m=k(f,\"StopAsyncIteration\",\"Signal the end from iterator.__anext__().\"),n=k(f,\"ArithmeticError\",\"Base class for arithmetic errors.\"),g=k(n,\"FloatingPointError\",\"Floating point operation failed.\"),t=k(n,\"OverflowError\",\"Result too large to be represented.\"),l=k(n,\"ZeroDivisionError\",\"Second argument to a division or modulo operation was zero.\"),q=k(f,\"AssertionError\",\"Assertion failed.\"),w=k(f,\"AttributeError\",\"Attribute not found.\"),\nx=k(f,\"BufferError\",\"Buffer error.\"),v=k(f,\"EOFError\",\"Read beyond end of file.\"),C=e(f,\"ImportError\",\"Import can't find module, or can't find name in module.\",function(ea,I){d.call(this,ea);const [T,Z]=Sk.abstr.copyKeywordsToNamedArgs(\"ImportError\",[\"name\",\"path\"],[],I);this.$name=T;this.$path=Z;1===ea.length&&(this.$msg=ea[0])},[\"msg\",\"name\",\"path\"],function(){return Sk.builtin.checkString(this.$msg)?this.$msg:c.call(this)}),E=k(C,\"ModuleNotFoundError\",\"Module not found.\"),L=k(f,\"LookupError\",\"Base class for lookup errors.\"),\nz=k(L,\"IndexError\",\"Sequence index out of range.\"),G=e(L,\"KeyError\",\"Mapping key not found.\",null,null,function(){return 1===this.args.v.length?this.args.v[0].$r():c.call(this)}),K=k(f,\"MemoryError\",\"Out of memory.\"),S=k(f,\"NameError\",\"Name not found globally.\"),U=k(S,\"UnboundLocalError\",\"Local name referenced but not bound to a value.\"),r=e(f,\"OSError\",\"Base class for I/O related errors.\",function(ea,I){d.call(this,ea,I)}),y=k(r,\"FileNotFoundError\",\"File not found.\"),F=k(r,\"TimeoutError\",\"Timeout expired.\"),\nJ=k(f,\"ReferenceError\",\"Weak ref proxy used after referent went away.\"),Q=k(f,\"RuntimeError\",\"Unspecified run-time error.\"),X=k(Q,\"NotImplementedError\",\"Method or function hasn't been implemented yet.\"),ba=k(Q,\"RecursionError\",\"Recursion limit exceeded.\"),ia=e(f,\"SyntaxError\",\"Invalid syntax.\",function(ea,I){d.call(this,ea,I);1<=ea.length&&(this.$msg=ea[0]);2===ea.length&&(ea=(new Sk.builtin.tuple(ea[1])).v,this.$filename=ea[0],this.$lineno=ea[1],this.$offset=ea[2],this.$text=ea[3])},[\"msg\",\"filename\",\n\"lineno\",\"offset\",\"text\"],function(){return c.call(this)}),oa=k(ia,\"IndentationError\",\"Improper indentation.\"),pa=k(oa,\"TabError\",\"Improper mixture of spaces and tabs.\"),la=k(f,\"SystemError\",\"Internal error in the Skulpt interpreter.\"),qa=k(f,\"TypeError\",\"Inappropriate argument type.\"),na=k(f,\"ValueError\",\"Inappropriate argument value (of correct type).\"),aa=k(na,\"UnicodeError\",\"Unicode related error.\"),ja=k(aa,\"UnicodeDecodeError\",\"Unicode decoding error.\"),N=k(aa,\"UnicodeEncodeError\",\"Unicode encoding error.\");\nObject.assign(Sk.builtin,{BaseException:p,SystemExit:D,KeyboardInterrupt:R,GeneratorExit:h,Exception:f,StopIteration:b,StopAsyncIteration:m,ArithmeticError:n,FloatingPointError:g,OverflowError:t,ZeroDivisionError:l,AssertionError:q,AttributeError:w,BufferError:x,EOFError:v,ImportError:C,ModuleNotFoundError:E,LookupError:L,IndexError:z,KeyError:G,MemoryError:K,NameError:S,UnboundLocalError:U,OSError:r,IOError:r,FileNotFoundError:y,TimeoutError:F,ReferenceError:J,RuntimeError:Q,NotImplementedError:X,\nRecursionError:ba,SyntaxError:ia,IndentationError:oa,TabError:pa,SystemError:la,TypeError:qa,ValueError:na,UnicodeError:aa,UnicodeDecodeError:ja,UnicodeEncodeError:N});Sk.builtin.SuspensionError=k(f,\"SuspensionError\",\"Unsupported Suspension in code.\");Sk.builtin.ExternalError=Sk.abstr.buildNativeClass(\"ExternalError\",{constructor:function(...ea){this.nativeError=ea[0];if(!Sk.builtin.checkString(this.nativeError)&&(ea[0]=this.nativeError.toString(),ea[0].startsWith(\"RangeError: Maximum call\")))return ea[0]=\n\"Maximum call stack size exceeded\",new ba(...ea);f.apply(this,ea)},base:f});Sk.builtin.getExcInfo=function(ea){return new Sk.builtin.tuple([ea.ob$type||Sk.builtin.none.none$,ea,Sk.builtin.none.none$])}},function(D,R){Sk.builtin.method=Sk.abstr.buildNativeClass(\"method\",{constructor:function(a,d){Sk.asserts.assert(this instanceof Sk.builtin.method,\"bad call to method constructor, use 'new'\");this.im_func=a;this.im_self=d;this.im_call=a.tp$call},slots:{$r(){let a=this.im_func.tp$getattr(Sk.builtin.str.$qualname)||\nthis.im_func.tp$getattr(Sk.builtin.str.$name);a=a&&a.v||\"?\";return new Sk.builtin.str(\"\")},tp$hash(){const a=Sk.abstr.objectHash(this.im_self),d=Sk.abstr.objectHash(this.im_func);return a+d},tp$call(a,d){var c=this.im_call;if(void 0===c)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(this.im_func)+\"' object is not callable\");a=[this.im_self,...a];return c.call(this.im_func,a,d)},tp$new(a,d){Sk.abstr.checkNoKwargs(\"method\",d);Sk.abstr.checkArgsLen(\"method\",\na,2,2);d=a[0];a=a[1];if(!Sk.builtin.checkCallable(d))throw new Sk.builtin.TypeError(\"first argument must be callable\");if(Sk.builtin.checkNone(a))throw new Sk.builtin.TypeError(\"self must not be None\");return new Sk.builtin.method(d,a)},tp$richcompare(a,d){if(\"Eq\"!=d&&\"NotEq\"!=d||!(a instanceof Sk.builtin.method))return Sk.builtin.NotImplemented.NotImplemented$;let c;try{c=Sk.misceval.richCompareBool(this.im_self,a.im_self,\"Eq\",!1)&&this.im_func===a.im_func}catch(e){c=!1}return\"Eq\"==d?c:!c},tp$descr_get(a,\nd){return this},tp$getattr(a,d){const c=Sk.abstr.lookupSpecial(this,a);return void 0!==c?c:this.im_func.tp$getattr(a,d)}},getsets:{__func__:{$get(){return this.im_func}},__self__:{$get(){return this.im_self}},__doc__:{$get(){return this.im_func.tp$getattr(Sk.builtin.str.$doc)}}},flags:{sk$unacceptableBase:!0}})},function(D,R){function a(p){if(null!==p&&void 0!==p){if(!0===p.sk$int)return p.v;if(void 0!==p.nb$index)return p.nb$index();if(\"number\"===typeof p&&Number.isInteger(p))return p}}function d(p,\nh){const f=a(p);if(void 0!==f)return f;h=(h||\"'{tp$name}' object cannot be interpreted as an integer\").replace(\"{tp$name}\",Sk.abstr.typeName(p));throw new Sk.builtin.TypeError(h);}function c(){const p=(Sk.global.navigator||{}).userAgent||\"\";return-1{b=b.ob$type;if(!f.$isSubType(b))if(b.$isSubType(f))f=b;else throw new Sk.builtin.TypeError(\"metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases\");\n});return f}function k(p,h,f,b,m){const n=p.tp$getattr(Sk.builtin.str.$prepare);let g,t=null;if(void 0===n)return[t,g];t=Sk.misceval.callsimArray(n,[h,f],b);if(!Sk.builtin.checkMapping(t))throw new Sk.builtin.TypeError(m?p.prototype.tp$name:\".__prepare__() must return a mapping not '\"+Sk.abstr.typeName(t)+\"'\");g={get(l,q){try{return Sk.abstr.objectGetItem(l,new Sk.builtin.str(Sk.unfixReserved(q)))}catch(w){if(!(w instanceof Sk.builtin.KeyError))throw w;}},set(l,q,w){Sk.abstr.objectSetItem(l,\nnew Sk.builtin.str(Sk.unfixReserved(q)),w);return!0}};return[t,g]}Sk.misceval={};Sk.misceval.Suspension=function(p,h,f){this.$isSuspension=!0;void 0!==p&&void 0!==h&&(this.resume=function(){return p(h.resume())});this.child=h;this.optional=void 0!==h&&h.optional;this.data=void 0===f&&void 0!==h?h.data:f};Sk.exportSymbol(\"Sk.misceval.Suspension\",Sk.misceval.Suspension);Sk.misceval.retryOptionalSuspensionOrThrow=function(p,h){for(;p instanceof Sk.misceval.Suspension;){if(!p.optional){h=new Sk.builtin.SuspensionError(h||\n\"Cannot call a function that blocks or suspends here\");const f=[];for(;null!=p;)p.$lineno&&f.push({filename:p.$filename,lineno:p.$lineno,colno:p.$colno}),p=p.child;f.reverse();h.traceback.push(...f);throw h;}p=p.resume()}return p};Sk.exportSymbol(\"Sk.misceval.retryOptionalSuspensionOrThrow\",Sk.misceval.retryOptionalSuspensionOrThrow);Sk.misceval.isIndex=function(p){return null!==p&&void 0!==p&&(void 0!==p.nb$index||\"number\"===typeof p&&Number.isInteger(p))};Sk.exportSymbol(\"Sk.misceval.isIndex\",Sk.misceval.isIndex);\nSk.misceval.asIndex=a;Sk.misceval.asIndexSized=function(p,h,f){f=d(p,f);if(\"number\"===typeof f)return f;if(null==h)return JSBI.lessThan(f,JSBI.__ZERO)?-Number.MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER;throw new h(\"cannot fit '\"+Sk.abstr.typeName(p)+\"' into an index-sized integer\");};Sk.misceval.asIndexOrThrow=d;Sk.misceval.applySlice=function(p,h,f,b){return Sk.abstr.objectGetItem(p,new Sk.builtin.slice(h,f,null),b)};Sk.exportSymbol(\"Sk.misceval.applySlice\",Sk.misceval.applySlice);Sk.misceval.assignSlice=\nfunction(p,h,f,b,m){h=new Sk.builtin.slice(h,f);return null===b?Sk.abstr.objectDelItem(p,h):Sk.abstr.objectSetItem(p,h,b,m)};Sk.exportSymbol(\"Sk.misceval.assignSlice\",Sk.misceval.assignSlice);Sk.misceval.arrayFromArguments=function(p){var h;if(1!=p.length)return p;var f=p[0];f instanceof Sk.builtin.set?f=f.tp$iter().$obj:f instanceof Sk.builtin.dict&&(f=Sk.builtin.dict.prototype.keys.func_code(f));if(f instanceof Sk.builtin.list||f instanceof Sk.builtin.tuple)return f.v;if(Sk.builtin.checkIterable(f)){p=\n[];f=Sk.abstr.iter(f);for(h=f.tp$iternext();void 0!==h;h=f.tp$iternext())p.push(h);return p}throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(f)+\"' object is not iterable\");};Sk.exportSymbol(\"Sk.misceval.arrayFromArguments\",Sk.misceval.arrayFromArguments);Sk.misceval.iterator=Sk.abstr.buildIteratorClass(\"iterator\",{constructor:function(p,h){this.tp$iternext=h?p:function(f){let b=p();return f||void 0===b||!b.$isSuspension?b:Sk.misceval.retryOptionalSuspensionOrThrow(b)}},iternext:function(p){return this.tp$iternext(p)},\nflags:{sk$unacceptableBase:!0}});Sk.misceval.swappedOp_={Eq:\"Eq\",NotEq:\"NotEq\",Lt:\"Gt\",LtE:\"GtE\",Gt:\"Lt\",GtE:\"LtE\"};Sk.misceval.opSymbols={Eq:\"==\",NotEq:\"!=\",Lt:\"<\",LtE:\"<=\",Gt:\">\",GtE:\">=\",Is:\"is\",IsNot:\"is not\",In_:\"in\",NotIn:\"not in\"};Sk.misceval.richCompareBool=function(p,h,f,b){Sk.asserts.assert(p.sk$object&&h.sk$object,\"JS object passed to richCompareBool\");var m=p.ob$type,n=h.ob$type,g=n!==m&&void 0===n.sk$baseClass&&n.$isSubType(m);if(!Sk.__future__.python3&&m!==n&&(\"GtE\"===f||\"Gt\"===f||\"LtE\"===\nf||\"Lt\"===f)){var t=[Sk.builtin.float_,Sk.builtin.int_,Sk.builtin.lng,Sk.builtin.bool];const q=[Sk.builtin.dict,Sk.builtin.enumerate,Sk.builtin.filter_,Sk.builtin.list,Sk.builtin.map_,Sk.builtin.str,Sk.builtin.tuple,Sk.builtin.zip_];var l=t.indexOf(m);m=q.indexOf(m);t=t.indexOf(n);n=q.indexOf(n);if(p===Sk.builtin.none.none$)switch(f){case \"Lt\":return!0;case \"LtE\":return!0;case \"Gt\":return!1;case \"GtE\":return!1}if(h===Sk.builtin.none.none$)switch(f){case \"Lt\":return!1;case \"LtE\":return!1;case \"Gt\":return!0;\ncase \"GtE\":return!0}if(-1!==l&&-1!==n)switch(f){case \"Lt\":return!0;case \"LtE\":return!0;case \"Gt\":return!1;case \"GtE\":return!1}if(-1!==m&&-1!==t)switch(f){case \"Lt\":return!1;case \"LtE\":return!1;case \"Gt\":return!0;case \"GtE\":return!0}if(-1!==m&&-1!==n)switch(f){case \"Lt\":return mn;case \"GtE\":return m>=n}}if(\"Is\"===f)return p===h;if(\"IsNot\"===f)return p!==h;if(\"In\"===f)return Sk.misceval.chain(Sk.abstr.sequenceContains(h,p,b),Sk.misceval.isTrue);if(\"NotIn\"===\nf)return Sk.misceval.chain(Sk.abstr.sequenceContains(h,p,b),function(q){return!Sk.misceval.isTrue(q)});n={Eq:\"ob$eq\",NotEq:\"ob$ne\",Gt:\"ob$gt\",GtE:\"ob$ge\",Lt:\"ob$lt\",LtE:\"ob$le\"};l=n[f];if(g&&(b=n[Sk.misceval.swappedOp_[f]],(b=h[b](p))!==Sk.builtin.NotImplemented.NotImplemented$)||(b=p[l](h))!==Sk.builtin.NotImplemented.NotImplemented$||!g&&(b=n[Sk.misceval.swappedOp_[f]],(b=h[b](p))!==Sk.builtin.NotImplemented.NotImplemented$))return Sk.misceval.isTrue(b);if(!Sk.__future__.python3){if(g=Sk.abstr.lookupSpecial(p,\nSk.builtin.str.$cmp))try{b=Sk.misceval.callsimArray(g,[h]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if(\"Eq\"===f)return 0===b;if(\"NotEq\"===f)return 0!==b;if(\"Lt\"===f)return 0>b;if(\"Gt\"===f)return 0=b;if(\"GtE\"===f)return 0<=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError(\"comparison did not return an int\");}catch(q){throw new Sk.builtin.TypeError(\"comparison did not return an int\");}if(g=Sk.abstr.lookupSpecial(h,Sk.builtin.str.$cmp))try{b=\nSk.misceval.callsimArray(g,[p]);if(Sk.builtin.checkNumber(b)){b=Sk.builtin.asnum$(b);if(\"Eq\"===f)return 0===b;if(\"NotEq\"===f)return 0!==b;if(\"Lt\"===f)return 0b;if(\"LtE\"===f)return 0<=b;if(\"GtE\"===f)return 0>=b}if(b!==Sk.builtin.NotImplemented.NotImplemented$)throw new Sk.builtin.TypeError(\"comparison did not return an int\");}catch(q){throw new Sk.builtin.TypeError(\"comparison did not return an int\");}if(p===Sk.builtin.none.none$&&h===Sk.builtin.none.none$){if(\"Eq\"===f)return p.v===\nh.v;if(\"NotEq\"===f)return p.v!==h.v;if(\"Gt\"===f)return p.v>h.v;if(\"GtE\"===f)return p.v>=h.v;if(\"Lt\"===f)return p.v\";throw h;}};Sk.exportSymbol(\"Sk.misceval.objectRepr\",Sk.misceval.objectRepr);Sk.misceval.opAllowsEquality=function(p){switch(p){case \"LtE\":case \"Eq\":case \"GtE\":return!0}return!1};Sk.exportSymbol(\"Sk.misceval.opAllowsEquality\",Sk.misceval.opAllowsEquality);Sk.misceval.isTrue=function(p){return!0===p||p===Sk.builtin.bool.true$?!0:!1===p||\np===Sk.builtin.bool.false$||null===p||void 0===p?!1:p.nb$bool?p.nb$bool():p.sq$length?0!==p.sq$length():!!p};Sk.exportSymbol(\"Sk.misceval.isTrue\",Sk.misceval.isTrue);Sk.misceval.softspace_=!1;Sk.misceval.print_=function(p){Sk.misceval.softspace_&&(\"\\n\"!==p&&Sk.output(\" \"),Sk.misceval.softspace_=!1);var h=new Sk.builtin.str(p);return Sk.misceval.chain(Sk.importModule(\"sys\",!1,!0),function(f){return Sk.misceval.apply(f.$d.stdout.write,void 0,void 0,void 0,[f.$d.stdout,h])},function(){var f;(f=0===h.v.length)||\n(f=h.v[h.v.length-1],f=!(\"\\n\"===f||\"\\t\"===f||\"\\r\"===f));if(f||\" \"===h.v[h.v.length-1])Sk.misceval.softspace_=!0})};Sk.exportSymbol(\"Sk.misceval.print_\",Sk.misceval.print_);Sk.misceval.loadname=function(p,h){h=h[p];if(void 0!==h)return h;h=Sk.builtins[p];if(void 0!==h)return h;throw new Sk.builtin.NameError(\"name '\"+Sk.unfixReserved(p)+\"' is not defined\");};Sk.exportSymbol(\"Sk.misceval.loadname\",Sk.misceval.loadname);Sk.misceval.call=function(p,h,f,b,m){m=Array.prototype.slice.call(arguments,4);return Sk.misceval.apply(p,\nh,f,b,m)};Sk.exportSymbol(\"Sk.misceval.call\",Sk.misceval.call);Sk.misceval.callAsync=function(p,h,f,b,m,n){n=Array.prototype.slice.call(arguments,5);return Sk.misceval.applyAsync(p,h,f,b,m,n)};Sk.exportSymbol(\"Sk.misceval.callAsync\",Sk.misceval.callAsync);Sk.misceval.callOrSuspend=function(p,h,f,b,m){m=Array.prototype.slice.call(arguments,4);return Sk.misceval.applyOrSuspend(p,h,f,b,m)};Sk.exportSymbol(\"Sk.misceval.callOrSuspend\",Sk.misceval.callOrSuspend);Sk.misceval.callsim=function(p,h){h=Array.prototype.slice.call(arguments,\n1);return Sk.misceval.apply(p,void 0,void 0,void 0,h)};Sk.exportSymbol(\"Sk.misceval.callsim\",Sk.misceval.callsim);Sk.misceval.callsimArray=function(p,h,f){h=h||[];return Sk.misceval.retryOptionalSuspensionOrThrow(Sk.misceval.callsimOrSuspendArray(p,h,f))};Sk.exportSymbol(\"Sk.misceval.callsimArray\",Sk.misceval.callsimArray);Sk.misceval.callsimAsync=function(p,h,f){f=Array.prototype.slice.call(arguments,2);return Sk.misceval.applyAsync(p,h,void 0,void 0,void 0,f)};Sk.exportSymbol(\"Sk.misceval.callsimAsync\",\nSk.misceval.callsimAsync);Sk.misceval.callsimOrSuspend=function(p,h){h=Array.prototype.slice.call(arguments,1);return Sk.misceval.applyOrSuspend(p,void 0,void 0,void 0,h)};Sk.exportSymbol(\"Sk.misceval.callsimOrSuspend\",Sk.misceval.callsimOrSuspend);Sk.misceval.callsimOrSuspendArray=function(p,h,f){h=h||[];return void 0!==p&&p.tp$call?p.tp$call(h,f):Sk.misceval.applyOrSuspend(p,void 0,void 0,f,h)};Sk.exportSymbol(\"Sk.misceval.callsimOrSuspendArray\",Sk.misceval.callsimOrSuspendArray);Sk.misceval.apply=\nfunction(p,h,f,b,m){p=Sk.misceval.applyOrSuspend(p,h,f,b,m);return p instanceof Sk.misceval.Suspension?Sk.misceval.retryOptionalSuspensionOrThrow(p):p};Sk.exportSymbol(\"Sk.misceval.apply\",Sk.misceval.apply);Sk.misceval.defaultHandlers={};Sk.misceval.asyncToPromise=function(p,h){return new Promise(function(f,b){try{(function g(n){try{for(var t=function(){try{g(n.resume())}catch(x){b(x)}},l=function(x){try{n.data.result=x,t()}catch(v){b(v)}},q=function(x){try{n.data.error=x,t()}catch(v){b(v)}};n instanceof\nSk.misceval.Suspension;){const x=n.data.type;let v=h&&(h[x]||h[\"*\"]);v||(v=Sk.misceval.defaultHandlers[x]||Sk.misceval.defaultHandlers[\"*\"]);if(v){var w=v(n);if(w){w.then(g,b);return}}if(\"Sk.promise\"===x){n.data.promise.then(l,q);return}if(\"Sk.yield\"===x){Sk.global.setImmediate(t);return}if(\"Sk.delay\"===x){Sk.global.setImmediate(t);return}if(n.optional)n=n.resume();else throw new Sk.builtin.SuspensionError(\"Unhandled non-optional suspension of type '\"+n.data.type+\"'\");}f(n)}catch(x){b(x)}})(p())}catch(m){b(m)}})};\nSk.exportSymbol(\"Sk.misceval.asyncToPromise\",Sk.misceval.asyncToPromise);Sk.misceval.applyAsync=function(p,h,f,b,m,n){return Sk.misceval.asyncToPromise(function(){return Sk.misceval.applyOrSuspend(h,f,b,m,n)},p)};Sk.exportSymbol(\"Sk.misceval.applyAsync\",Sk.misceval.applyAsync);Sk.misceval.chain=function(p,h){for(var f=1,b=p,m,n;;){if(f==arguments.length)return b;if(b&&b.$isSuspension)break;b=arguments[f](b);f++}n=Array(arguments.length-f);for(m=0;m\np[b++]},h,f)};Sk.misceval.arrayFromIterable=function(p,h){if(void 0===p)return[];if(void 0===p.ht$type&&void 0!==p.sk$asarray)return p.sk$asarray();const f=[];p=Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(p),b=>{f.push(b)}),()=>f);return h?p:Sk.misceval.retryOptionalSuspensionOrThrow(p)};Sk.misceval.Break=function(p){if(!(this instanceof Sk.misceval.Break))return new Sk.misceval.Break(p);this.brValue=p};Sk.exportSymbol(\"Sk.misceval.Break\",Sk.misceval.Break);Sk.misceval.applyOrSuspend=function(p,\nh,f,b,m){var n;if(null==p||p===Sk.builtin.none.none$)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(p)+\"' object is not callable\");\"function\"===typeof p&&void 0===p.tp$call&&(p=new Sk.builtin.func(p));var g=p.tp$call;if(void 0!==g){if(f)for(f=f.tp$iter(),n=f.tp$iternext();void 0!==n;n=f.tp$iternext())m.push(n);if(h)for(f=Sk.abstr.iter(h),n=f.tp$iternext();void 0!==n;n=f.tp$iternext()){if(!Sk.builtin.checkString(n))throw new Sk.builtin.TypeError(\"Function keywords must be strings\");b.push(n.v);\nb.push(Sk.abstr.objectGetItem(h,n,!1))}return g.call(p,m,b,h)}g=p.__call__;if(void 0!==g)return m.unshift(p),Sk.misceval.apply(g,h,f,b,m);throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(p)+\"' object is not callable\");};Sk.exportSymbol(\"Sk.misceval.applyOrSuspend\",Sk.misceval.applyOrSuspend);Sk.misceval.promiseToSuspension=function(p){var h=new Sk.misceval.Suspension;h.resume=function(){if(h.data.error)throw h.data.error;return h.data.result};h.data={type:\"Sk.promise\",promise:p};return h};Sk.exportSymbol(\"Sk.misceval.promiseToSuspension\",\nSk.misceval.promiseToSuspension);Sk.misceval.buildClass=function(p,h,f,b,m,n){f=new Sk.builtin.str(f);const g=new Sk.builtin.tuple(b);n=n||[];b=b||[];let t;var l=!0;const q=n.indexOf(\"metaclass\");-1{Sk.abstr.objectSetItem(w,new Sk.builtin.str(C),x[C])});return Sk.misceval.callsimOrSuspendArray(t,[f,g,w],n)};Sk.exportSymbol(\"Sk.misceval.buildClass\",Sk.misceval.buildClass)},function(D,R){Sk.builtin.callable_iter_=\nSk.abstr.buildIteratorClass(\"callable_iterator\",{constructor:function(a,d){if(!Sk.builtin.checkCallable(a))throw new Sk.builtin.TypeError(\"iter(v, w): v must be callable\");this.$callable=a;this.$sentinel=d;this.$flag=!1},iternext(a){if(!0!==this.$flag){if(a)return a=Sk.misceval.callsimOrSuspendArray(this.$callable,[]),Sk.misceval.chain(a,d=>{if(Sk.misceval.richCompareBool(d,this.$sentinel,\"Eq\",!0))this.$flag=!0;else return d});a=Sk.misceval.callsimArray(this.$callable,[]);if(Sk.misceval.richCompareBool(a,\nthis.$sentinel,\"Eq\",!1))this.$flag=!0;else return a}},flags:{sk$unacceptableBase:!0}});Sk.builtin.seq_iter_=Sk.abstr.buildIteratorClass(\"iterator\",{constructor:function(a){this.$index=0;this.$seq=a},iternext(a){let d;d=Sk.misceval.tryCatch(()=>this.$seq.mp$subscript(new Sk.builtin.int_(this.$index++),a),c=>{if(c instanceof Sk.builtin.IndexError||c instanceof Sk.builtin.StopIteration)this.gi$ret=c.$value||Sk.builtin.none.none$;else throw c;});return a?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)},\nmethods:{__length_hint__:{$flags:{NoArgs:!0},$meth(){if(this.$seq.sq$length)return this.$seq.sq$length()-this.$index;throw new Sk.builtin.NotImplementedError(\"len is not implemented for \"+Sk.abstr.typeName(this.$seq));}}},flags:{sk$unacceptableBase:!0}});Sk.exportSymbol(\"Sk.builtin.callable_iter_\",Sk.builtin.callable_iter_)},function(D,R){Sk.builtin.list=Sk.abstr.buildNativeClass(\"list\",{constructor:function(c){void 0===c?c=[]:Array.isArray(c)||(c=Sk.misceval.arrayFromIterable(c));Sk.asserts.assert(this instanceof\nSk.builtin.list,\"bad call to list, use 'new' with an Array of python objects\");this.v=c;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$doc:\"Built-in mutable sequence.\\n\\nIf no argument is given, the constructor creates a new empty list.\\nThe argument must be an iterable if specified.\",tp$new:Sk.generic.new,tp$init(c,e){Sk.abstr.checkNoKwargs(\"list\",e);Sk.abstr.checkArgsLen(\"list\",c,0,1);return Sk.misceval.chain(Sk.misceval.arrayFromIterable(c[0],\n!0),k=>{this.v=k})},$r(){if(this.in$repr)return new Sk.builtin.str(\"[...]\");this.in$repr=!0;const c=this.v.map(e=>Sk.misceval.objectRepr(e));this.in$repr=!1;return new Sk.builtin.str(\"[\"+c.join(\", \")+\"]\")},tp$richcompare:Sk.generic.seqCompare,tp$iter(){return new a(this)},sq$length(){return this.v.length},sq$concat(c){if(!(c instanceof Sk.builtin.list))throw new Sk.builtin.TypeError(\"can only concatenate list to list\");return new Sk.builtin.list(this.v.concat(c.v))},sq$contains(c){for(let e=this.tp$iter(),\nk=e.tp$iternext();void 0!==k;k=e.tp$iternext())if(k===c||Sk.misceval.richCompareBool(k,c,\"Eq\"))return!0;return!1},sq$repeat(c){if(!Sk.misceval.isIndex(c))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(c)+\"'\");c=Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);if(c*this.v.length>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;const e=[];for(let k=0;k{e.push(this.v[k])});return new Sk.builtin.list(e)}throw new Sk.builtin.TypeError(\"list indices must be integers or slices, not \"+Sk.abstr.typeName(c));},mp$ass_subscript(c,e){void 0===e?this.del$subscript(c):this.ass$subscript(c,e)},sq$inplace_concat(c){return c===this?\n(this.v.push(...this.v),this):Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(c),e=>{this.v.push(e)}),()=>this)},sq$inplace_repeat(c){if(!Sk.misceval.isIndex(c))throw new Sk.builtin.TypeError(\"can't multiply sequence by non-int of type '\"+Sk.abstr.typeName(c)+\"'\");c=Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);const e=this.v.length;if(0>=c)this.v.length=0;else if(c*e>Number.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;for(let k=1;k{this.v.push(e)}),\n()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:\"($self, iterable, /)\",$doc:\"Extend list by appending elements from the iterable.\"},pop:{$meth(c){c=void 0===c?this.v.length-1:Sk.misceval.asIndexSized(c,Sk.builtin.OverflowError);c=this.list$inRange(c,\"pop index out of range\");const e=this.v[c];this.v.splice(c,1);return e},$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, index=-1, /)\",$doc:\"Remove and return item at index (default last).\\n\\nRaises IndexError if list is empty or index is out of range.\"},\nremove:{$meth(c){c=this.list$indexOf(c);if(-1===c)throw new Sk.builtin.ValueError(\"list.remove(x): x not in list\");this.v.splice(c,1);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:\"($self, value, /)\",$doc:\"Remove first occurrence of value.\\n\\nRaises ValueError if the value is not present.\"},sort:{$meth(c,e){if(c.length)throw new Sk.builtin.TypeError(\"sort() takes no positional arguments\");const [k,p]=Sk.abstr.copyKeywordsToNamedArgs(\"sort\",[\"key\",\"reverse\"],c,e,[Sk.builtin.none.none$,\nSk.builtin.bool.false$]);return this.list$sort(void 0,k,p)},$flags:{FastCall:!0},$textsig:\"($self, /, *, key=None, reverse=False)\",$doc:\"Stable sort *IN PLACE*.\"},index:{$meth(c,e,k){if(void 0!==e&&!Sk.misceval.isIndex(e)||void 0!==k&&!Sk.misceval.isIndex(k))throw new Sk.builtin.TypeError(\"slice indices must be integers or have an __index__ method\");e=this.list$indexOf(c,e,k);if(-1===e)throw new Sk.builtin.ValueError(Sk.misceval.objectRepr(c)+\" is not in list\");return new Sk.builtin.int_(e)},$flags:{MinArgs:1,\nMaxArgs:3},$textsig:\"($self, value, start=0, stop=sys.maxsize, /)\",$doc:\"Return first index of value.\\n\\nRaises ValueError if the value is not present.\"},count:{$meth(c){let e=0;const k=this.v.length;for(let p=0;pc&&(c+=this.v.length);if(0<=c&&c{k.push(p)});if(!Sk.builtin.checkIterable(e))throw new Sk.builtin.TypeError(\"must assign iterable to extended slice\");c=Sk.misceval.arrayFromIterable(e);if(k.length!==c.length)throw new Sk.builtin.ValueError(\"attempt to assign sequence of size \"+c.length+\" to extended slice of size \"+k.length);for(e=0;e{this.v.splice(p-k,1);k+=e})},valueOf(){return this.v}}});Sk.exportSymbol(\"Sk.builtin.list\",\nSk.builtin.list);Sk.builtin.list.py2$methods={sort:{$name:\"sort\",$meth(c,e){const [k,p,h]=Sk.abstr.copyKeywordsToNamedArgs(\"sort\",[\"cmp\",\"key\",\"reverse\"],c,e,[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]);return this.list$sort(k,p,h)},$flags:{FastCall:!0},$textsig:\"($self, cmp=None, key=None, reverse=False)\",$doc:\"Stable sort *IN PLACE*.\"}};var a=Sk.abstr.buildIteratorClass(\"list_iterator\",{constructor:function(c){this.$index=0;this.$seq=c.v},iternext:Sk.generic.iterNextWithArray,\nmethods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),d=Sk.abstr.buildIteratorClass(\"list_reverseiterator\",{constructor:function(c){this.$index=c.v.length-1;this.$seq=c.v},iternext(){const c=this.$seq[this.$index--];if(void 0===c)this.tp$iternext=()=>{};else return c},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$unacceptableBase:!0}})},function(D,R,a){function d(r){var y=r.replace(z,\"\").replace(G,\"_\").toLowerCase();\ny=L[y];return void 0===y?r:y}function c(r,y,F){if(void 0===y)y=\"utf-8\";else if(Sk.builtin.checkString(y))y=y.$jsstr();else throw new Sk.builtin.TypeError(r+\"() argument \"+(\"bytesstr\".includes(r)?2:1)+\" must be str not \"+Sk.abstr.typeName(y));if(void 0===F)F=\"strict\";else if(Sk.builtin.checkString(F))F=F.$jsstr();else throw new Sk.builtin.TypeError(r+\"() argument \"+(\"bytesstr\".includes(r)?3:2)+\" must be str not \"+Sk.abstr.typeName(F));return{encoding:y,errors:F}}function e(r){if(\"strict\"!==r&&\"ignore\"!==\nr&&\"replace\"!==r)throw new Sk.builtin.LookupError(\"Unsupported or invalid error type '\"+r+\"'\");}function k(r,y,F){r=r.$jsstr();y=d(y);e(F);if(\"ascii\"===y){y=[];for(J in r){const Q=r.charCodeAt(J);if(127=r?\"\\\\x\":\"\\\\u\";r=r.toString(16);3===r.length&&(r=r.slice(1,3));return r=1===r.length?y+\"0\"+r:y+r}function h(r,y,F,J){r=r.decode(y);if(\"replace\"===F)return r;if(\"strict\"===F){F=r.indexOf(\"\\ufffd\");if(-1===F)return r;throw new Sk.builtin.UnicodeDecodeError(`'${J}' codec can't decode byte 0x ${y[F].toString(16)} in position ${F}: invalid start byte`);}return r.replace(/\\ufffd/g,\"\")}function f(r,y){({encoding:r,errors:y}=c(\"decode\",r,y));r=\nd(r);e(y);if(\"ascii\"===r){r=this.v;var F=\"\";for(let J=0;J=F&&yF)return new Sk.builtin.tuple([new Sk.builtin.bytes,new Sk.builtin.bytes,this])}else if(F=this.find$subleft(y,0,this.v.length),0>F)return new Sk.builtin.tuple([this,new Sk.builtin.bytes,new Sk.builtin.bytes]);return new Sk.builtin.tuple([new Sk.builtin.bytes(this.v.subarray(0,F)),new Sk.builtin.bytes(y),new Sk.builtin.bytes(this.v.subarray(F+y.length))])}}function g(r,y){return function(F){var J=void 0===F||F===Sk.builtin.none.none$?new Uint8Array([9,10,11,12,13,32,133]):this.get$raw(F);F=0;var Q=\nthis.v.length;if(r)for(;FF&&J.includes(this.v[Q-1]);)Q--;J=new Uint8Array(Q-F);for(Q=0;Q=r||32===r}function q(r){return 97<=r&&122>=r}function w(r){return 65<=r&&90>=r}function x(r){return 48<=r&&57>=r}function v(r,y){return function(){return 0===this.v.length?y?Sk.builtin.bool.true$:Sk.builtin.bool.false$:\nthis.v.every(F=>r(F))?Sk.builtin.bool.true$:Sk.builtin.bool.false$}}function C(r,y){return function(){let F=!1;for(let J=0;J0<=y&&255>=y),\"bad internal call to bytes with array\"),this.v=new Uint8Array(r);else if(\"string\"===typeof r){let y;\nconst F=new Uint8Array(r.length),J=r.length;for(let Q=0;Q bytes\\nbytes(string, encoding[, errors]) -> bytes\\nbytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\\nbytes(int) -> bytes object of size given by the parameter initialized with null bytes\\nbytes() -> empty bytes object\\n\\nConstruct an immutable array of bytes from:\\n - an iterable yielding integers in range(256)\\n - a text string encoded using the specified encoding\\n - any object implementing the buffer API.\\n - an integer\",\ntp$new(r,y){if(this!==Sk.builtin.bytes.prototype)return this.$subtype_new(r,y);y=y||[];let F;if(1>=r.length&&0===+y.length)r=r[0];else{[r,y,F]=Sk.abstr.copyKeywordsToNamedArgs(\"bytes\",[null,\"encoding\",\"errors\"],r,y);({encoding:y,errors:F}=c(\"bytes\",y,F));if(!Sk.builtin.checkString(r))throw new Sk.builtin.TypeError(\"encoding or errors without a string argument\");return k(r,y,F)}if(void 0===r)return new Sk.builtin.bytes;if(void 0!==(y=Sk.abstr.lookupSpecial(r,Sk.builtin.str.$bytes)))return r=Sk.misceval.callsimOrSuspendArray(y,\n[]),Sk.misceval.chain(r,J=>{if(!Sk.builtin.checkBytes(J))throw new Sk.builtin.TypeError(\"__bytes__ returned non-bytes (type \"+Sk.abstr.typeName(J)+\")\");return J});if(Sk.misceval.isIndex(r)){r=Sk.misceval.asIndexSized(r,Sk.builtin.OverflowError);if(0>r)throw new Sk.builtin.ValueError(\"negative count\");return new Sk.builtin.bytes(r)}if(Sk.builtin.checkBytes(r))return new Sk.builtin.bytes(r.v);if(Sk.builtin.checkString(r))throw new Sk.builtin.TypeError(\"string argument without an encoding\");if(Sk.builtin.checkIterable(r)){let J=\n[];r=Sk.misceval.iterFor(Sk.abstr.iter(r),Q=>{Q=Sk.misceval.asIndexSized(Q);if(0>Q||255new Sk.builtin.bytes(J))}throw new Sk.builtin.TypeError(\"cannot convert '\"+Sk.abstr.typeName(r)+\"' object into bytes\");},$r(){let r,y=\"'\";const F=-1!==this.v.indexOf(34);let J=\"\";for(let Q=0;Qr||10r||13r||126r.length||F[J]>r[J];case \"GtE\":return J===Q&&F.length>=r.length||F[J]>=r[J]}},tp$hash(){return(new Sk.builtin.str(this.$jsstr())).tp$hash()},tp$as_sequence_or_mapping:!0,mp$subscript(r){if(Sk.misceval.isIndex(r)){let y=Sk.misceval.asIndexSized(r,\nSk.builtin.IndexError);if(void 0!==y){0>y&&(y=this.v.length+y);if(0>y||y>=this.v.length)throw new Sk.builtin.IndexError(\"index out of range\");return new Sk.builtin.int_(this.v[y])}}else if(r instanceof Sk.builtin.slice){const y=[];r.sssiter$(this.v.length,F=>{y.push(this.v[F])});return new Sk.builtin.bytes(new Uint8Array(y))}throw new Sk.builtin.TypeError(\"byte indices must be integers or slices, not \"+Sk.abstr.typeName(r));},sq$length(){return this.v.length},sq$concat(r){if(!(r instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError(\"can't concat \"+\nSk.abstr.typeName(r)+\" to bytes\");const y=new Uint8Array(this.v.length+r.v.length);let F;for(F=0;FNumber.MAX_SAFE_INTEGER)throw new Sk.builtin.OverflowError;if(0>=\nr)return new Sk.builtin.bytes;r=new Uint8Array(y);let F=0;for(;Fr||255y?Infinity:y;r=Sk.builtin.checkNone(r)?null:this.get$raw(r);if(null!==r&&!r.length)throw new Sk.builtin.ValueError(\"empty separator\");return{sep:r,maxsplit:y}},find$left:m(!1),\nfind$right:m(!0),find$subleft:function(r,y,F){F=F-r.length+1;let J=y;for(;JQ===this.v[J+X]))return J;J++}return-1},find$subright(r,y,F){let J=F-r.length;for(;J>=y;){if(r.every((Q,X)=>Q===this.v[J+X]))return J;J--}return-1},$subtype_new(r,y){const F=new this.constructor;r=Sk.builtin.bytes.prototype.tp$new(r,y);F.v=r.v;return F},sk$asarray(){const r=[];this.v.forEach(y=>{r.push(new Sk.builtin.int_(y))});return r},valueOf(){return this.v}},flags:{str$encode:k,$decode:f,check$encodeArgs:c},\nmethods:{__getnewargs__:{$meth(){return new Sk.builtin.tuple(new Sk.builtin.bytes(this.v))},$flags:{NoArgs:!0},$textsig:null,$doc:null},capitalize:{$meth(){const r=this.v.length;if(0===r)return new Sk.builtin.bytes(this.v);const y=new Uint8Array(r);let F=this.v[0];y[0]=q(F)?F-32:F;for(let J=1;J copy of B\\n\\nReturn a copy of B with only its first character capitalized (ASCII)\\nand the rest lower-cased.\"},\ncenter:{$meth:t(\"center\",!1,!0),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"B.center(width[, fillchar]) -> copy of B\\n\\nReturn B centered in a string of length width. Padding is\\ndone using the specified fill character (default is a space).\"},count:{$meth(r,y,F){r=this.get$tgt(r);({start:y,end:F}=Sk.builtin.slice.startEnd$wrt(this,y,F));let J=0;if(\"number\"===typeof r)for(;yX===this.v[Q+ba])&&(J++,Q+=r.length-1)}return new Sk.builtin.int_(J)},\n$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.count(sub[, start[, end]]) -> int\\n\\nReturn the number of non-overlapping occurrences of subsection sub in\\nbytes B[start:end]. Optional arguments start and end are interpreted\\nas in slice notation.\"},decode:{$meth:f,$flags:{NamedArgs:[\"encoding\",\"errors\"]},$textsig:\"($self, /, encoding='utf-8', errors='strict')\",$doc:\"Decode the bytes using the codec registered for encoding.\\n\\n encoding\\n The encoding with which to decode the bytes.\\n errors\\n The error handling scheme to use for the handling of decoding errors.\\n The default is 'strict' meaning that decoding errors raise a\\n UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\\n as well as any other name registered with codecs.register_error that\\n can handle UnicodeDecodeErrors.\"},\nendswith:{$meth:b(\"endswith\",(r,y)=>{const F=r.length-y.length;return 0<=F&&y.every((J,Q)=>J===r[F+Q])}),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.endswith(suffix[, start[, end]]) -> bool\\n\\nReturn True if B ends with the specified suffix, False otherwise.\\nWith optional start, test B beginning at that position.\\nWith optional end, stop comparing B at that position.\\nsuffix can also be a tuple of bytes to try.\"},expandtabs:{$meth(r){r=Sk.misceval.asIndexSized(r,Sk.builtin.OverflowError,\"an integer is required (got type {tp$nam})\");\nconst y=[];let F=0;for(let Q=0;Q copy of B\\n\\nReturn a copy of B where all tab characters are expanded using spaces.\\nIf tabsize is not given, a tab size of 8 characters is assumed.\"},find:{$meth:function(r,y,F){return new Sk.builtin.int_(this.find$left(r,\ny,F))},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.find(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},hex:{$meth(){let r=\"\";for(let y=0;y string\\n\\nCreate a string of hexadecimal numbers from a bytes object.\\nExample: b'\\\\xb9\\\\x01\\\\xef'.hex() -> 'b901ef'.\"},\nindex:{$meth:function(r,y,F){r=this.find$left(r,y,F);if(-1===r)throw new Sk.builtin.ValueError(\"subsection not found\");return new Sk.builtin.int_(r)},$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.index(sub[, start[, end]]) -> int\\n\\nReturn the lowest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaises ValueError when the subsection is not found.\"},isalnum:{$meth:v(r=>x(r)||\nq(r)||w(r)),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isalnum() -> bool\\n\\nReturn True if all characters in B are alphanumeric\\nand there is at least one character in B, False otherwise.\"},isalpha:{$meth:v(r=>65<=r&&90>=r||97<=r&&122>=r),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isalpha() -> bool\\n\\nReturn True if all characters in B are alphabetic\\nand there is at least one character in B, False otherwise.\"},isascii:{$meth:v(r=>0<=r&&127>=r,!0),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isascii() -> bool\\n\\nReturn True if B is empty or all characters in B are ASCII,\\nFalse otherwise.\"},\nisdigit:{$meth:v(x),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isdigit() -> bool\\n\\nReturn True if all characters in B are digits\\nand there is at least one character in B, False otherwise.\"},islower:{$meth:C(q,w),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.islower() -> bool\\n\\nReturn True if all cased characters in B are lowercase and there is\\nat least one cased character in B, False otherwise.\"},isspace:{$meth:v(l),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isspace() -> bool\\n\\nReturn True if all characters in B are whitespace\\nand there is at least one character in B, False otherwise.\"},\nistitle:{$meth:function(){let r=!1,y=!1;for(let F=0;F bool\\n\\nReturn True if B is a titlecased string and there is at least one\\ncharacter in B, i.e. uppercase characters may only follow uncased\\ncharacters and lowercase characters only cased ones. Return False\\notherwise.\"},\nisupper:{$meth:C(w,q),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.isupper() -> bool\\n\\nReturn True if all cased characters in B are uppercase and there is\\nat least one cased character in B, False otherwise.\"},join:{$meth(r){const y=[];let F=0;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(r),J=>{if(!(J instanceof Sk.builtin.bytes))throw new Sk.builtin.TypeError(\"sequence item \"+F+\": expected a bytes-like object, \"+Sk.abstr.typeName(J)+\" found\");F++;y.length&&y.push(...this.v);y.push(...J.v)}),\n()=>new Sk.builtin.bytes(new Uint8Array(y)))},$flags:{OneArg:!0},$textsig:\"($self, iterable_of_bytes, /)\",$doc:\"Concatenate any number of bytes objects.\\n\\nThe bytes whose method is called is inserted in between each pair.\\n\\nThe result is returned as a new bytes object.\\n\\nExample: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.\"},ljust:{$meth:t(\"ljust\",!1,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"B.ljust(width[, fillchar]) -> copy of B\\n\\nReturn B left justified in a string of length width. Padding is\\ndone using the specified fill character (default is a space).\"},\nlower:{$meth:E(r=>w(r)?r+32:r),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.lower() -> copy of B\\n\\nReturn a copy of B with all ASCII characters converted to lowercase.\"},lstrip:{$meth:g(!0,!1),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip leading bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip leading ASCII whitespace.\"},partition:{$meth:n(!1),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the bytes into three parts using the given separator.\\n\\nThis will search for the separator sep in the bytes. If the separator is found,\\nreturns a 3-tuple containing the part before the separator, the separator\\nitself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing the original bytes\\nobject and two empty bytes objects.\"},\nreplace:{$meth(r,y,F){r=this.get$raw(r);y=this.get$raw(y);F=void 0===F?-1:Sk.misceval.asIndexSized(F,Sk.builtin.OverflowError);F=0>F?Infinity:F;const J=[];let Q=0;for(var X=0;X int\\n\\nReturn the highest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nReturn -1 on failure.\"},rindex:{$meth:function(r,y,F){r=this.find$right(r,y,F);if(-1===r)throw new Sk.builtin.ValueError(\"subsection not found\");return new Sk.builtin.int_(r)},\n$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.rindex(sub[, start[, end]]) -> int\\n\\nReturn the highest index in B where subsection sub is found,\\nsuch that sub is contained within B[start,end]. Optional\\narguments start and end are interpreted as in slice notation.\\n\\nRaise ValueError when the subsection is not found.\"},rjust:{$meth:t(\"rjust\",!0,!1),$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"B.rjust(width[, fillchar]) -> copy of B\\n\\nReturn B right justified in a string of length width. Padding is\\ndone using the specified fill character (default is a space)\"},\nrpartition:{$meth:n(!0),$flags:{OneArg:!0},$textsig:\"($self, sep, /)\",$doc:\"Partition the bytes into three parts using the given separator.\\n\\nThis will search for the separator sep in the bytes, starting at the end. If\\nthe separator is found, returns a 3-tuple containing the part before the\\nseparator, the separator itself, and the part after it.\\n\\nIf the separator is not found, returns a 3-tuple containing two empty bytes\\nobjects and the original bytes object.\"},rsplit:{$meth:function(r,y){({sep:r,\nmaxsplit:y}=this.get$splitArgs(r,y));const F=[];let J=0,Q=this.v.length;if(null!==r){for(;0<=Q&&JQ)break;r=Q+1;for(Q--;0<=Q&&!l(this.v[Q]);)Q--;F.push(new Sk.builtin.bytes(this.v.subarray(Q+1,r)));J++}if(0<=Q){for(;l(this.v[Q]);)Q--;0<=Q&&F.push(new Sk.builtin.bytes(this.v.subarray(0,\nQ+1)))}}return new Sk.builtin.list(F.reverse())},$flags:{NamedArgs:[\"sep\",\"maxsplit\"],Defaults:[Sk.builtin.none.none$,-1]},$textsig:\"($self, /, sep=None, maxsplit=-1)\",$doc:\"Return a list of the sections in the bytes, using sep as the delimiter.\\n\\n sep\\n The delimiter according which to split the bytes.\\n None (the default value) means split on ASCII whitespace characters\\n (space, tab, return, newline, formfeed, vertical tab).\\n maxsplit\\n Maximum number of splits to do.\\n -1 (the default value) means no limit.\\n\\nSplitting is done starting at the end of the bytes and working to the front.\"},\nrstrip:{$meth:g(!1,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip trailing bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip trailing ASCII whitespace.\"},split:{$meth:function(r,y){({sep:r,maxsplit:y}=this.get$splitArgs(r,y));const F=[],J=this.v.length;let Q=0,X=0;if(null!==r){for(;Xy.length<=r.length&&y.every((F,J)=>F===r[J])),$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"B.startswith(prefix[, start[, end]]) -> bool\\n\\nReturn True if B starts with the specified prefix, False otherwise.\\nWith optional start, test B beginning at that position.\\nWith optional end, stop comparing B at that position.\\nprefix can also be a tuple of bytes to try.\"},strip:{$meth:g(!0,!0),$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, bytes=None, /)\",$doc:\"Strip leading and trailing bytes contained in the argument.\\n\\nIf the argument is omitted or None, strip leading and trailing ASCII whitespace.\"},\nswapcase:{$meth:E(r=>w(r)?r+32:q(r)?r-32:r),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.swapcase() -> copy of B\\n\\nReturn a copy of B with uppercase ASCII characters converted\\nto lowercase ASCII and vice versa.\"},title:{$meth(){const r=this.v.length,y=new Uint8Array(r);let F=!1;for(let J=0;J copy of B\\n\\nReturn a titlecased version of B, i.e. ASCII words start with uppercase\\ncharacters, all remaining cased characters have lowercase.\"},\nupper:{$meth:E(r=>q(r)?r-32:r),$flags:{NoArgs:!0},$textsig:null,$doc:\"B.upper() -> copy of B\\n\\nReturn a copy of B with all ASCII characters converted to uppercase.\"},zfill:{$meth(r){r=Sk.misceval.asIndexSized(r,Sk.builtin.IndexError);const y=r-this.v.length;if(0>=y)return new Sk.builtin.bytes(this.v);const F=new Uint8Array(r);let J=0,Q;if(43===this.v[0]||45===this.v[0])F[0]=this.v[0],J++;F.fill(48,J,J+y);Q=J;for(J+=y;J copy of B\\n\\nPad a numeric string B with zeros on the left, to fill a field\\nof the specified width. B is never truncated.\"}},classmethods:{fromhex:{$meth:function(r){function y(ia){for(let oa=X;oa b'\\\\\\\\xb9\\\\\\\\x01\\\\\\\\xef'.\"}}});var U=Sk.abstr.buildIteratorClass(\"bytes_iterator\",{constructor:function(r){this.$index=0;this.$seq=r.v},iternext(){const r=\nthis.$seq[this.$index++];if(void 0!==r)return new Sk.builtin.int_(r)},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}});Sk.exportSymbol(\"Sk.builtin.bytes\",Sk.builtin.bytes)},function(D,R,a){(function(d){(function(c){function e(){}function k(){}var p=String.fromCharCode,h={}.toString,f=h.call(c.SharedArrayBuffer),b=h(),m=c.Uint8Array,n=m||Array,g=m?ArrayBuffer:n,t=g.isView||function(x){return x&&\"length\"in x},l=h.call(g.prototype);g=k.prototype;\nvar q=c.TextEncoder,w=new (m?Uint16Array:n)(32);e.prototype.decode=function(x){if(!t(x)){var v=h.call(x);if(v!==l&&v!==f&&v!==b)throw TypeError(\"Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'\");x=m?new n(x):x||[]}for(var C=v=\"\",E=0,L=x.length|0,z=L-32|0,G,K,S=0,U=0,r,y=0,F=-1;E>4){case 15:r=x[E=E+1|0]&255;if(2!==r>>6||247>6?U+4|0:24,K=K+256&768;case 13:case 12:r=x[E=E+1|0]&255,S<<=6,S|=(K&31)<<6|r&63,U=U+7|0,E>6&&S>>U&&1114112>S?(K=S,S=S-65536|0,0<=S&&(F=(S>>10)+55296|0,K=(S&1023)+56320|0,31>y?(w[y]=F,y=y+1|0,F=-1):(r=F,F=K,K=r))):(K>>=8,E=E-K-1|0,K=65533),S=U=0,G=E<=z?32:L-E|0;default:w[y]=K;continue;case 11:case 10:case 9:case 8:}w[y]=65533}C+=p(w[0],w[1],w[2],w[3],w[4],w[5],w[6],w[7],w[8],w[9],w[10],w[11],w[12],w[13],w[14],w[15],w[16],w[17],w[18],w[19],w[20],\nw[21],w[22],w[23],w[24],w[25],w[26],w[27],w[28],w[29],w[30],w[31]);32>y&&(C=C.slice(0,y-32|0));if(E>>31,F=-1,C.length=G)C[L]=G;else{if(2047>=G)C[L]=192|G>>6;else{a:{if(55296<=G)if(56319>=G){var K=x.charCodeAt(E=E+1|0)|0;if(56320<=K&&57343>=K){G=(G<<10)+K-56613888|0;if(65535<\nG){C[L]=240|G>>18;C[L=L+1|0]=128|G>>12&63;C[L=L+1|0]=128|G>>6&63;C[L=L+1|0]=128|G&63;continue}break a}G=65533}else 57343>=G&&(G=65533);!z&&E<<1>12;C[L=L+1|0]=128|G>>6&63}C[L=L+1|0]=128|G&63}}return m?C.subarray(0,L):C.slice(0,L)};q||(c.TextDecoder=e,c.TextEncoder=k)})(\"undefined\"==typeof d?\"undefined\"==typeof self?this:self:d)}).call(this,a(0))},function(D,R){Sk.builtin.tuple=Sk.abstr.buildNativeClass(\"tuple\",{constructor:function(d){void 0===\nd?d=[]:Array.isArray(d)||(d=Sk.misceval.arrayFromIterable(d));Sk.asserts.assert(this instanceof Sk.builtin.tuple,\"bad call to tuple, use 'new' with an Array of python objects\");this.v=d;this.in$repr=!1},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:\"Built-in immutable sequence.\\n\\nIf no argument is given, the constructor returns an empty tuple.\\nIf iterable is specified the tuple is initialized from iterable's items.\\n\\nIf the argument is a tuple, the return value is the same object.\",\n$r(){if(this.in$repr)return new Sk.builtin.str(\"(...)\");this.in$repr=!0;let d=this.v.map(c=>Sk.misceval.objectRepr(c));this.in$repr=!1;d=d.join(\", \");1===this.v.length&&(d+=\",\");return new Sk.builtin.str(\"(\"+d+\")\")},tp$new(d,c){if(this!==Sk.builtin.tuple.prototype)return this.$subtype_new(d,c);Sk.abstr.checkNoKwargs(\"tuple\",c);Sk.abstr.checkArgsLen(\"tuple\",d,0,1);d=d[0];return void 0===d?new Sk.builtin.tuple([]):d.constructor===Sk.builtin.tuple?d:Sk.misceval.chain(Sk.misceval.arrayFromIterable(d,\n!0),e=>new Sk.builtin.tuple(e))},tp$hash(){let d,c=3430008,e=1000003;const k=this.v.length;for(let p=0;pd&&(d=this.v.length+d);if(0>d||d>=this.v.length)throw new Sk.builtin.IndexError(\"tuple index out of range\");return this.v[d]}if(d instanceof\nSk.builtin.slice){const c=[];d.sssiter$(this.v.length,e=>{c.push(this.v[e])});return new Sk.builtin.tuple(c)}throw new Sk.builtin.TypeError(\"tuple indices must be integers or slices, not \"+Sk.abstr.typeName(d));},sq$length(){return this.v.length},sq$repeat(d){d=Sk.misceval.asIndexSized(d,Sk.builtin.OverflowError);if(1===d&&this.constructor===Sk.builtin.tuple)return this;const c=[];for(let e=0;e{this.$seq=E.$items();this.$version=E.$version;C&&(this.$seq=this.$seq.reverse());this.tp$iternext=this.constructor.prototype.tp$iternext;return this.tp$iternext()}},iternext:v,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},\nflags:{sk$unacceptableBase:!0},proto:{next$item:p}})}function p(){if(this.$version!==this.$orig.$version){if(this.$seq.length!==this.$orig.get$size())throw new Sk.builtin.RuntimeError(\"dict changed size during iteration\");throw new Sk.builtin.RuntimeError(\"dictionary keys changed during iteration\");}return this.$seq[this.$index++]}Sk.builtin.dict=Sk.abstr.buildNativeClass(\"dict\",{constructor:function(x){void 0===x&&(x=[]);Sk.asserts.assert(Array.isArray(x)&&0===x.length%2&&this instanceof Sk.builtin.dict,\n\"bad call to dict constructor\");this.size=0;this.entries=Object.create(null);this.buckets={};for(let v=0;v new empty dictionary\\ndict(mapping) -> new dictionary initialized from a mapping object's\\n (key, value) pairs\\ndict(iterable) -> new dictionary initialized as if via:\\n d = {}\\n for k, v in iterable:\\n d[k] = v\\ndict(**kwargs) -> new dictionary initialized with the name=value pairs\\n in the keyword argument list. For example: dict(one=1, two=2)\",\n$r(){if(this.in$repr)return new Sk.builtin.str(\"{...}\");this.in$repr=!0;const x=this.$items().map(v=>{var [C,E]=v;return Sk.misceval.objectRepr(C)+\": \"+Sk.misceval.objectRepr(E)});this.in$repr=!1;return new Sk.builtin.str(\"{\"+x.join(\", \")+\"}\")},tp$new:Sk.generic.new,tp$init(x,v){return this.update$common(x,v,\"dict\")},tp$iter(){return new n(this)},tp$richcompare(x,v){let C;if(!(x instanceof Sk.builtin.dict)||\"Eq\"!==v&&\"NotEq\"!==v)return Sk.builtin.NotImplemented.NotImplemented$;if(x===this)C=!0;else if(this.size!==\nx.size)C=!1;else{let E;C=this.$items().every(L=>{var [z,G]=L;E=x.mp$lookup(z);return void 0!==E&&(E===G||Sk.misceval.richCompareBool(G,E,\"Eq\"))})}return\"Eq\"===v?C:!C},nb$or(x){if(!(x instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;const v=this.dict$copy();v.dict$merge(x);return v},nb$reflected_or(x){if(!(x instanceof Sk.builtin.dict))return Sk.builtin.NotImplemented.NotImplemented$;x=x.dict$copy();x.dict$merge(this);return x},nb$inplace_or(x){return Sk.misceval.chain(this.update$onearg(x),\n()=>this)},sq$length(){return this.get$size()},sq$contains(x){return void 0!==this.mp$lookup(x)},mp$subscript(x,v){var C=this.mp$lookup(x);if(void 0!==C)return C;C=Sk.abstr.lookupSpecial(this,Sk.builtin.str.$missing);if(void 0!==C)return x=Sk.misceval.callsimOrSuspendArray(C,[x]),v?x:Sk.misceval.retryOptionalSuspensionOrThrow(x);throw new Sk.builtin.KeyError(x);},mp$ass_subscript(x,v){if(void 0===v){if(x=this.dict$delItem(x))throw x;}else this.dict$setItem(x,v)}},methods:{__reversed__:{$meth(){return new l(this)},\n$flags:{NoArgs:!0},$textsig:null,$doc:\"Return a reverse iterator over the dict keys.\"},get:{$meth(x,v){return this.mp$lookup(x)||v||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, key, default=None, /)\",$doc:\"Return the value for key if key is in the dictionary, else default.\"},setdefault:{$meth(x,v){if(this.ob$type!==Sk.builtin.dict){var C=this.mp$lookup(x);if(void 0!==C)return C;v||(v=Sk.builtin.none.none$);this.dict$setItem(x,v)}else{const E=a(x);C=\"string\"===typeof E?this.entries[E]:\nthis.get$bucket_item(x,E);if(void 0!==C)return C[1];v||(v=Sk.builtin.none.none$);\"string\"===typeof E?this.entries[E]=[x,v]:this.set$bucket_item(x,v,E);this.size++;this.$version++}return v},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($self, key, default=None, /)\",$doc:\"Insert key with a value of default if key is not in the dictionary.\\n\\nReturn the value for key if key is in the dictionary, else default.\"},pop:{$meth(x,v){const C=this.pop$item(x);if(void 0!==C)return C[1];if(void 0!==v)return v;throw new Sk.builtin.KeyError(x);\n},$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\\nIf key is not found, d is returned if given, otherwise KeyError is raised\"},popitem:{$meth(){const x=this.get$size();if(0===x)throw new Sk.builtin.KeyError(\"popitem(): dictionary is empty\");const [v,C]=this.$items()[x-1];this.pop$item(v);return new Sk.builtin.tuple([v,C])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.popitem() -> (k, v), remove and return some (key, value) pair as a\\n2-tuple; but raise KeyError if D is empty.\"},\nkeys:{$meth(){return new f(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$meth(){return new m(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$meth(){return new b(this)},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.values() -> an object providing a view on D's values\"},update:{$meth(x,v){return Sk.misceval.chain(this.update$common(x,v,\"update\"),()=>Sk.builtin.none.none$)},\n$flags:{FastCall:!0},$textsig:null,$doc:\"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\\nIf E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\\nIf E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\\nIn either case, this is followed by: for k in F: D[k] = F[k]\"},clear:{$meth(){this.dict$clear();return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.clear() -> None. Remove all items from D.\"},copy:{$meth(){return this.dict$copy()},\n$flags:{NoArgs:!0},$textsig:null,$doc:\"D.copy() -> a shallow copy of D\"}},classmethods:Object.assign({fromkeys:{$meth:function(x,v){v=v||Sk.builtin.none.none$;let C=this===Sk.builtin.dict?new this:this.tp$call([],[]);return Sk.misceval.chain(C,E=>{C=E;return Sk.misceval.iterFor(Sk.abstr.iter(x),L=>C.mp$ass_subscript(L,v,!0))},()=>C)},$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($type, iterable, value=None, /)\",$doc:\"Create a new dictionary with keys from iterable and values set to value.\"}},Sk.generic.classGetItem),\nproto:{quick$lookup:function(x){x=this.entries[x.$savedKeyHash];if(void 0!==x)return x[1]},mp$lookup:function(x){const v=a(x);x=\"string\"===typeof v?this.entries[v]:this.get$bucket_item(x,v);if(void 0!==x)return x[1]},get$size(){return this.size},sk$asarray(){return this.$items().map(x=>x[0])},update$common:function(x,v,C){Sk.abstr.checkArgsLen(C,x,0,1);x=x[0];let E;void 0!==x&&(E=this.update$onearg(x));return Sk.misceval.chain(E,()=>{if(v)for(let L=0;Lvoid 0===z)&&delete this.buckets[v],E},set$bucket_item:function(x,v,C){let E=this.buckets[C];x=[x,v];void 0===E?(this.buckets[C]=[x],C=\"#\"+C+\"_0\"):(v=E.indexOf(void 0),-1!==v?(C=\n\"#\"+C+\"_\"+v,E[v]=x):(C=\"#\"+C+\"_\"+E.length,E.push(x)));this.entries[C]=x},pop$item:function(x){const v=a(x);\"string\"===typeof v?(x=this.entries[v],delete this.entries[v]):x=this.pop$bucket_item(x,v);if(void 0!==x)return this.size--,this.$version++,x},dict$merge:function(x){if(x.tp$iter===Sk.builtin.dict.prototype.tp$iter){var v=x.tp$iter();for(let C=v.tp$iternext();void 0!==C;C=v.tp$iternext()){const E=x.mp$subscript(C);this.dict$setItem(C,E)}}else{v=Sk.abstr.lookupSpecial(x,Sk.builtin.str.$keys);\nif(void 0===v)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(x)+\"' object is not a mapping\");return Sk.misceval.chain(Sk.misceval.callsimOrSuspendArray(v),C=>Sk.misceval.iterFor(Sk.abstr.iter(C),E=>Sk.misceval.chain(Sk.abstr.objectGetItem(x,E,!0),L=>{this.dict$setItem(E,L)})))}},dict$merge_seq:function(x){let v=0;return Sk.misceval.iterFor(Sk.abstr.iter(x),C=>{if(!Sk.builtin.checkIterable(C))throw new Sk.builtin.TypeError(\"cannot convert dictionary update sequence element #\"+v+\" to a sequence\");\nC=Sk.misceval.arrayFromIterable(C);if(2!==C.length)throw new Sk.builtin.ValueError(\"dictionary update sequence element #\"+v+\" has length \"+C.length+\"; 2 is required\");this.dict$setItem(C[0],C[1]);v++})}}});const h={tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,$r(){if(this.in$repr)return new Sk.builtin.str(\"...\");this.in$repr=!0;let x=Sk.misceval.arrayFromIterable(this);x=x.map(v=>Sk.misceval.objectRepr(v));this.in$repr=!1;return new Sk.builtin.str(Sk.abstr.typeName(this)+\n\"([\"+x.join(\", \")+\"])\")},tp$richcompare(x,v){if(!(Sk.builtin.checkAnySet(x)||x instanceof f||x instanceof m))return Sk.builtin.NotImplemented.NotImplemented$;const C=this.sq$length(),E=x.sq$length();switch(v){case \"NotEq\":case \"Eq\":let L;this===x?L=!0:C===E&&(L=c(this,x));return\"NotEq\"===v?!L:L;case \"Lt\":return CE&&c(x,this);case \"GtE\":return C>=E&&c(x,this)}},nb$subtract(x){const v=d(this);return v.difference.$meth.call(v,x)},nb$and(x){const v=\nd(this);return v.intersection.$meth.call(v,x)},nb$or(x){const v=d(this);return v.union.$meth.call(v,x)},nb$xor(x){const v=d(this);return v.symmetric_difference.$meth.call(v,x)},sq$length(){return this.dict.get$size()}};var f=e(\"dict_keys\",{sq$contains(x){return void 0!==this.dict.mp$lookup(x)},tp$iter(){return new n(this.dict)}},function(){return new l(this.dict)}),b=e(\"dict_values\",{tp$iter(){return new t(this.dict)}},function(){return new w(this.dict)}),m=e(\"dict_items\",{sq$contains(x){if(!(x instanceof\nSk.builtin.tuple&&2===x.sq$length()))return!1;var v=x.mp$subscript(new Sk.builtin.int_(0));x=x.mp$subscript(new Sk.builtin.int_(1));v=this.dict.mp$lookup(v);return void 0===v?!1:v===x||Sk.misceval.richCompareBool(v,x,\"Eq\")},tp$iter(){return new g(this.dict)}},function(){return new q(this.dict)}),n=k(\"dict_keyiterator\",function(){const x=this.next$item();return x&&x[0]}),g=k(\"dict_itemiterator\",function(){const x=this.next$item();return x&&new Sk.builtin.tuple([x[0],x[1]])}),t=k(\"dict_valueiterator\",\nfunction(){const x=this.next$item();return x&&x[1]}),l=k(\"dict_reversekeyiterator\",n.prototype.tp$iternext,!0),q=k(\"dict_reverseitemiterator\",g.prototype.tp$iternext,!0),w=k(\"dict_reversevalueiterator\",t.prototype.tp$iternext,!0);Sk.builtin.dict.py2$methods={has_key:{$name:\"has_key\",$flags:{OneArg:!0},$meth(x){return new Sk.builtin.bool(this.sq$contains(x))},$doc:\"D.has_key(k) -> True if D has a key k, else False\"},keys:{$name:\"keys\",$meth(){return new Sk.builtin.list(this.sk$asarray())},$flags:{NoArgs:!0},\n$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$name:\"items\",$meth(){return new Sk.builtin.list(this.$items().map(x=>{var [v,C]=x;return new Sk.builtin.tuple([v,C])}))},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$name:\"values\",$meth(){return new Sk.builtin.list(this.$items().map(x=>{[,x]=x;return x}))},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.values() -> an object providing a view on D's values\"}}},\nfunction(D,R){function a(d,c){Object.defineProperties(d,{entries:{get:()=>{const e=Object.create(null);Object.entries(c).forEach(k=>{var [p,h]=k;p=Sk.unfixReserved(p);p.includes(\"$\")||(p=new Sk.builtin.str(p),e[p.$savedKeyHash]=[p,h])});return e},configurable:!0},size:{get:()=>Object.keys(c).map(e=>Sk.unfixReserved(e)).filter(e=>!e.includes(\"$\")).length,configurable:!0}})}Sk.builtin.mappingproxy=Sk.abstr.buildNativeClass(\"mappingproxy\",{constructor:function(d){Sk.asserts.assert(this instanceof Sk.builtin.mappingproxy,\n\"bad call to mapping proxy, use 'new'\");if(void 0!==d){const c=d.constructor;c===Object||null===c||d.hasOwnProperty(\"sk$object\")?(this.mapping=new Sk.builtin.dict([]),a(this.mapping,d)):Sk.builtin.checkMapping(d)?this.mapping=d:Sk.asserts.fail(\"unhandled case for mappingproxy\")}},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$hash:Sk.builtin.none.none$,tp$new(d,c){Sk.abstr.checkNoKwargs(\"mappingproxy\",c);Sk.abstr.checkOneArg(\"mappingproxy\",d,c);d=d[0];if(!Sk.builtin.checkMapping(d))throw new Sk.builtin.TypeError(\"mappingproxy() argument must be a mapping, not \"+\nSk.abstr.typeName(d));c=new Sk.builtin.mappingproxy;c.mapping=d;return c},tp$richcompare(d,c){return Sk.misceval.richCompareBool(this.mapping,d,c)},tp$str(){return this.mapping.tp$str()},$r(){return new Sk.builtin.str(\"mappingproxy(\"+Sk.misceval.objectRepr(this.mapping)+\")\")},mp$subscript(d,c){return this.mapping.mp$subscript(d,c)},sq$contains(d){return this.mapping.sq$contains(d)},sq$length(){return this.mapping.sq$length()},tp$iter(){return this.mapping.tp$iter()},tp$as_number:!0,nb$or(d){d instanceof\nSk.builtin.mappingproxy&&(d=d.mapping);return Sk.abstr.numberBinOp(this.mapping,d,\"BitOr\")},nb$reflected_or(d){d instanceof Sk.builtin.mappingproxy&&(d=d.mapping);return Sk.abstr.numberBinOp(d,this.mapping,\"BitOr\")},nb$inplace_or(d){throw new Sk.builtin.TypeError(\"'|=' is not supported by \"+Sk.abstr.typeName(this)+\"; use '|' instead\");}},methods:{get:{$meth(d,c){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$get),d,c)},$flags:{FastCall:!0},$textsig:null,$doc:\"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.\"},\nkeys:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$keys),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.keys() -> a set-like object providing a view on D's keys\"},items:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$items),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.items() -> a set-like object providing a view on D's items\"},values:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$values),[])},$flags:{NoArgs:!0},$textsig:null,\n$doc:\"D.values() -> a set-like object providing a view on D's values\"},copy:{$meth(){return Sk.misceval.callsimArray(this.mapping.tp$getattr(this.str$copy),[])},$flags:{NoArgs:!0},$textsig:null,$doc:\"D.copy() -> a shallow copy of D\"}},classmethods:Sk.generic.classGetItem,proto:{str$get:new Sk.builtin.str(\"get\"),str$copy:new Sk.builtin.str(\"copy\"),str$keys:new Sk.builtin.str(\"keys\"),str$items:new Sk.builtin.str(\"items\"),str$values:new Sk.builtin.str(\"values\"),mp$lookup(d){return this.mapping.mp$lookup(d)}},\nflags:{sk$unacceptableBase:!0}})},function(D,R){function a(c,e,k){try{const p=e.tp$getattr(k);c.tp$setattr(k,p)}catch(p){}}function d(c,e){a(c,e,Sk.builtin.str.$module);a(c,e,Sk.builtin.str.$name);a(c,e,Sk.builtin.str.$qualname);a(c,e,Sk.builtin.str.$doc);a(c,e,Sk.builtin.str.$ann)}Sk.builtin.property=Sk.abstr.buildNativeClass(\"property\",{constructor:function(c,e,k,p){this.prop$get=c||Sk.builtin.none.none$;this.prop$set=e||Sk.builtin.none.none$;this.prop$del=k||Sk.builtin.none.none$;this.getter$doc=\nc&&!p;this.prop$doc=p||c&&c.$doc||Sk.builtin.none.none$},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(c,e){c=Sk.abstr.copyKeywordsToNamedArgs(\"property\",[\"fget\",\"fset\",\"fdel\",\"doc\"],c,e,Array(4).fill(Sk.builtin.none.none$));this.prop$get=c[0];this.prop$set=c[1];this.prop$del=c[2];Sk.builtin.checkNone(c[3])?(this.getter$doc=!0,Sk.builtin.checkNone(c[0])||(this.prop$doc=c[0].$doc||c[3])):this.prop$doc=c[3];this.ob$type!==Sk.builtin.property&&this.tp$setattr(Sk.builtin.str.$doc,\nthis.prop$doc)},tp$doc:\"Property attribute.\\n\\n fget\\n function to be used for getting an attribute value\\n fset\\n function to be used for setting an attribute value\\n fdel\\n function to be used for del'ing an attribute\\n doc\\n docstring\\n\\nTypical use is to define a managed attribute x:\\n\\nclass C(object):\\n def getx(self): return self._x\\n def setx(self, value): self._x = value\\n def delx(self): del self._x\\n x = property(getx, setx, delx, 'I'm the 'x' property.')\\n\\nDecorators make defining new properties or modifying existing ones easy:\\n\\nclass C(object):\\n @property\\n def x(self):\\n 'I am the 'x' property.'\\n return self._x\\n @x.setter\\n def x(self, value):\\n self._x = value\\n @x.deleter\\n def x(self):\\n del self._x\",\ntp$descr_get(c,e,k){if(null===c)return this;if(void 0===this.prop$get)throw new Sk.builtin.AttributeError(\"unreadable attribute\");c=Sk.misceval.callsimOrSuspendArray(this.prop$get,[c]);return k?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},tp$descr_set(c,e,k){let p;p=null==e?this.prop$del:this.prop$set;if(Sk.builtin.checkNone(p))throw new Sk.builtin.AttributeError(\"can't \"+(null==e?\"delete\":\"set\")+\" attribute\");if(!p.tp$call)throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(p)+\"' is not callable\");\nc=null==e?p.tp$call([c]):p.tp$call([c,e]);return k?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)}},methods:{getter:{$meth(c){return this.$copy([c,this.prop$set,this.prop$del])},$flags:{OneArg:!0}},setter:{$meth(c){return this.$copy([this.prop$get,c,this.prop$del])},$flags:{OneArg:!0}},deleter:{$meth(c){return this.$copy([this.prop$get,this.prop$set,c])},$flags:{OneArg:!0}}},getsets:{fget:{$get(){return this.prop$get}},fset:{$get(){return this.prop$set}},fdel:{$get(){return this.prop$del}},__doc__:{$get(){return this.prop$doc},\n$set(c){this.prop$doc=c=c||Sk.builtin.none.none$}}},proto:{$copy(c){const e=this.ob$type;this.getter$doc||c.push(this.prop$doc);return e===Sk.builtin.property?new e(...c):e.tp$call(c)}}});Sk.builtin.classmethod=Sk.abstr.buildNativeClass(\"classmethod\",{constructor:function(c){this.cm$callable=c;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,tp$new:Sk.generic.new,tp$init(c,e){Sk.abstr.checkNoKwargs(\"classmethod\",e);Sk.abstr.checkArgsLen(\"classmethod\",c,1,1);this.cm$callable=c[0];\nd(this,c[0])},$r(){return new Sk.builtin.str(``)},tp$doc:\"classmethod(function) -> method\\n\\nConvert a function to be a class method.\\n\\nA class method receives the class as implicit first argument,\\njust like an instance method receives the instance.\\nTo declare a class method, use this idiom:\\n\\n class C:\\n @classmethod\\n def f(cls, arg1, arg2, ...):\\n ...\\n\\nIt can be called either on the class (e.g. C.f()) or on an instance\\n(e.g. C().f()). The instance is ignored except for its class.\\nIf a class method is called for a derived class, the derived class\\nobject is passed as the implied first argument.\\n\\nClass methods are different than C++ or Java static methods.\\nIf you want those, see the staticmethod builtin.\",\ntp$descr_get(c,e,k){const p=this.cm$callable;if(void 0===p)throw new Sk.builtin.RuntimeError(\"uninitialized classmethod object\");null==e&&(e=c.ob$type);return(c=p.tp$descr_get)?c.call(p,e,null,k):new Sk.builtin.method(p,e)}},getsets:{__func__:{$get(){return this.cm$callable}},__wrapped__:{$get(){return this.cm$callable}},__dict__:Sk.generic.getSetDict}});Sk.builtin.staticmethod=Sk.abstr.buildNativeClass(\"staticmethod\",{constructor:function(c){this.sm$callable=c;this.$d=new Sk.builtin.dict},slots:{tp$getattr:Sk.generic.getAttr,\ntp$new:Sk.generic.new,tp$init(c,e){Sk.abstr.checkNoKwargs(\"staticmethod\",e);Sk.abstr.checkArgsLen(\"staticmethod\",c,1,1);this.sm$callable=c[0];d(this,c[0])},$r(){return new Sk.builtin.str(``)},tp$call(c,e){return Sk.misceval.callsimOrSuspendArray(this.sm$callable,c,e)},tp$doc:\"staticmethod(function) -> method\\n\\nConvert a function to be a static method.\\n\\nA static method does not receive an implicit first argument.\\nTo declare a static method, use this idiom:\\n\\n class C:\\n @staticmethod\\n def f(arg1, arg2, ...):\\n ...\\n\\nIt can be called either on the class (e.g. C.f()) or on an instance\\n(e.g. C().f()). The instance is ignored except for its class.\\n\\nStatic methods in Python are similar to those found in Java or C++.\\nFor a more advanced concept, see the classmethod builtin.\",\ntp$descr_get(c,e){if(void 0===this.sm$callable)throw new Sk.builtin.RuntimeError(\"uninitialized staticmethod object\");return this.sm$callable}},getsets:{__func__:{$get(){return this.sm$callable}},__wrapped__:{$get(){return this.sm$callable}},__dict__:Sk.generic.getSetDict}})},function(D,R){function a(r,y){return function(F){if(!(F instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let J=this.v;F=F.v;if(\"number\"===typeof J&&\"number\"===typeof F){const Q=r(J,F);if(m(Q))return new Sk.builtin.int_(Q)}J=\ng(J);F=g(F);return new Sk.builtin.int_(y(J,F))}}function d(r,y){return function(F){if(!(F instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let J=this.v;F=F.v;if(\"number\"===typeof J&&\"number\"===typeof F)return r(J,F);J=g(J);F=g(F);return y(J,F)}}function c(r,y){return function(){let F=this.v;if(\"number\"===typeof F){const J=r(F);if(void 0!==J)return new Sk.builtin.int_(J);F=g(F)}return new Sk.builtin.int_(y(F))}}function e(){return new Sk.builtin.int_(this.v)}function k(r,\ny){return function(F){if(!(F instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let J=this.v;F=F.v;if(0===F)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");if(\"number\"===typeof J&&\"number\"===typeof F)return new Sk.builtin.int_(r(J,F));J=g(J);F=g(F);return new Sk.builtin.int_(JSBI.numberIfSafe(y(J,F)))}}function p(r,y){return function(F){if(!(F instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;if(F.nb$isnegative())throw new Sk.builtin.ValueError(\"negative shift count\");\nlet J=this.v;if(0===J)return new Sk.builtin.int_(0);F=F.v;if(\"number\"===typeof J&&\"number\"===typeof F&&53>F){const Q=r(J,F);if(void 0!==Q)return new Sk.builtin.int_(Q)}J=g(J);F=g(F);return new Sk.builtin.int_(y(J,F))}}function h(r,y){return function(F){if(!(F instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;let J=this.v;F=F.v;if(\"number\"===typeof J&&\"number\"===typeof F&&Math.abs(J)=-Number.MAX_SAFE_INTEGER}function n(r){return r<=Number.MAX_SAFE_INTEGER&&r>=-Number.MAX_SAFE_INTEGER?+r:JSBI.BigInt(r)}\nfunction g(r){return\"number\"===typeof r?JSBI.BigInt(r):r}function t(r,y){y=y!==Sk.builtin.none.none$?Sk.misceval.asIndexOrThrow(y):null;if(r instanceof Sk.builtin.str)return null===y&&(y=10),new Sk.builtin.int_(Sk.str2number(r.v,y));if(null!==y)throw new Sk.builtin.TypeError(\"int() can't convert non-string with explicit base\");if(void 0!==r.nb$int)return r.nb$int();if(void 0!==r.nb$index)return new Sk.builtin.int_(r.nb$index());if(y=Sk.abstr.lookupSpecial(r,Sk.builtin.str.$trunc)){y=Sk.misceval.callsimArray(y,\n[]);if(!Sk.builtin.checkInt(y))throw new Sk.builtin.TypeError(Sk.builtin.str.$trunc.$jsstr()+\" returned non-Integral (type \"+Sk.abstr.typeName(r)+\")\");return new Sk.builtin.int_(y.v)}throw new Sk.builtin.TypeError(\"int() argument must be a string, a bytes-like object or a number, not '\"+Sk.abstr.typeName(r)+\"'\");}function l(r){if(!Sk.builtin.checkString(r))throw new Sk.builtin.TypeError(\"'byteorder' must be str, not \"+Sk.abstr.typeName(r));r=r.toString();if(\"little\"===r)return 1;if(\"big\"===r)return 0;\nthrow new Sk.builtin.ValueError(\"byteorder must be either 'little' or 'big'\");}Sk.builtin.int_=Sk.abstr.buildNativeClass(\"int\",{constructor:function(r){Sk.asserts.assert(this instanceof Sk.builtin.int_,\"bad call to int use 'new'\");let y;if(\"number\"===typeof r){if(-6r)return K[r];y=r}else if(JSBI.__isBigInt(r))y=r;else{if(void 0===r)return S;if(\"string\"===typeof r)y=n(r);else{if(r.nb$int)return r.nb$int();Sk.asserts.fail(\"bad argument to int constructor\")}}this.v=y},slots:{tp$as_number:!0,\ntp$doc:\"int(x=0) -> integer\\nint(x, base=10) -> integer\\n\\nConvert a number or string to an integer, or return 0 if no arguments\\nare given. If x is a number, return x.__int__(). For floating point\\nnumbers, this truncates towards zero.\\n\\nIf x is not a number or if base is given, then x must be a string,\\nbytes, or bytearray instance representing an integer literal in the\\ngiven base. The literal can be preceded by '+' or '-' and be surrounded\\nby whitespace. The base defaults to 10. Valid bases are 0 and 2-36.\\nBase 0 means to interpret the base from the string as an integer literal.\\n>>> int('0b100', base=0)\\n4\",\n$r(){return new Sk.builtin.str(this.v.toString())},tp$hash(){var r=this.v;if(\"number\"===typeof r){if(-1===r)return-2;if(536870911>r&&-536870911r==y,JSBI.equal),ob$ne:d((r,y)=>r!=y,JSBI.notEqual),ob$gt:d((r,y)=>r>y,JSBI.greaterThan),ob$ge:d((r,y)=>r>=y,JSBI.greaterThanOrEqual),ob$lt:d((r,y)=>rr<=y,JSBI.lessThanOrEqual),nb$int:e,nb$index(){return this.v},nb$float(){var r=this.v;if(\"number\"===typeof r)return new Sk.builtin.float_(r);r=parseFloat(JSBI.toNumber(r));if(Infinity===r||-Infinity===r)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");return new Sk.builtin.float_(r)},\nnb$isnegative(){const r=this.v;return\"number\"===typeof r?0>r:JSBI.lessThan(r,JSBI.__ZERO)},nb$ispositive(){const r=this.v;return\"number\"===typeof r?0<=r:JSBI.greaterThanOrEqual(r,JSBI.__ZERO)},nb$bool(){return 0!==this.v},nb$positive:e,nb$negative:c(r=>-r,JSBI.unaryMinus),nb$add:a((r,y)=>r+y,(r,y)=>JSBI.numberIfSafe(JSBI.add(r,y))),nb$subtract:a((r,y)=>r-y,(r,y)=>JSBI.numberIfSafe(JSBI.subtract(r,y))),nb$multiply:a((r,y)=>r*y,(r,y)=>r===JSBI.__ZERO||y===JSBI.__ZERO?0:JSBI.multiply(r,y)),nb$divide:function(r){if(!Sk.__future__.python3)return this.nb$floor_divide(r);\nif(!(r instanceof Sk.builtin.int_))return Sk.builtin.NotImplemented.NotImplemented$;var y=this.v,F=r.v;if(0===F)throw new Sk.builtin.ZeroDivisionError(\"division by zero\");if(\"number\"===typeof y&&\"number\"===typeof F)return new Sk.builtin.float_(y/F);y=g(y);F=g(F);r=JSBI.lessThan(JSBI.bitwiseXor(y,F),JSBI.__ZERO);if(JSBI.equal(y,JSBI.__ZERO))return new Sk.builtin.float_(r?-0:0);y=f(y);F=f(F);if(JSBI.greaterThanOrEqual(y,JSBI.multiply(E,F)))throw new Sk.builtin.OverflowError(\"int/int too large to represent as a float\");\nvar J=y.toString(2).length-F.toString(2).length,Q=JSBI.BigInt(0>J?-J:J);if(0<=J&&JSBI.greaterThanOrEqual(y,JSBI.multiply(JSBI.exponentiate(v,Q),F))||0>J&&JSBI.greaterThanOrEqual(JSBI.multiply(y,JSBI.exponentiate(v,Q)),F))J+=1;J=Math.max(J,x)-w;y=JSBI.leftShift(y,JSBI.BigInt(Math.max(-J,0)));F=JSBI.leftShift(F,JSBI.BigInt(Math.max(J,0)));Q=JSBI.divide(y,F);y=JSBI.remainder(y,F);y=JSBI.multiply(v,y);if(JSBI.greaterThan(y,F)||JSBI.equal(y,F)&&JSBI.equal(JSBI.remainder(Q,v),C))Q=JSBI.add(Q,C);Q=JSBI.toNumber(Q);\nif(Infinity===Q||-Infinity===Q)throw new Sk.builtin.OverflowError(\"int/int too large to represent as a float\");F=Q*Math.pow(2,J);return new Sk.builtin.float_(r?-F:F)},nb$floor_divide:k((r,y)=>Math.floor(r/y),b),nb$remainder:k((r,y)=>r-Math.floor(r/y)*y,(r,y)=>JSBI.subtract(r,JSBI.multiply(y,b(r,y)))),nb$divmod(r){const y=this.nb$floor_divide(r);r=this.nb$remainder(r);return y===Sk.builtin.NotImplemented.NotImplemented$||r===Sk.builtin.NotImplemented.NotImplemented$?Sk.builtin.NotImplemented.NotImplemented$:\nnew Sk.builtin.tuple([y,r])},nb$and:h((r,y)=>r&y,JSBI.bitwiseAnd),nb$or:h((r,y)=>r|y,JSBI.bitwiseOr),nb$xor:h((r,y)=>r^y,JSBI.bitwiseXor),nb$abs:c(Math.abs,f),nb$lshift:p((r,y)=>{r=2*r*z[y];if(m(r))return r},JSBI.leftShift),nb$rshift:p((r,y)=>{Math.floor(r/z[y+1])},(r,y)=>JSBI.numberIfSafe(JSBI.signedRightShift(r,y))),nb$invert:c(r=>Math.abs(r)JSBI.numberIfSafe(JSBI.bitwiseNot(r))),nb$power(r,y){let F;void 0!==y&&Sk.builtin.checkNone(y)&&(y=void 0);if(!(r instanceof Sk.builtin.int_&&\n(void 0===y||y instanceof Sk.builtin.int_)))return Sk.builtin.NotImplemented.NotImplemented$;const J=r.nb$isnegative();if(J&&void 0===y)return this.nb$float().nb$power(r.nb$float());let Q=this.v;r=r.v;if(\"number\"===typeof Q&&\"number\"===typeof r){const X=Math.pow(Q,r);if(m(X)&&(F=new Sk.builtin.int_(X),void 0===y))return F}if(void 0!==y){if(J)throw new Sk.builtin.ValueError(\"pow() 2nd argument cannot be negative when 3rd argument specified\");if(0===y.v)throw new Sk.builtin.ValueError(\"pow() 3rd argument cannot be 0\");\nreturn void 0!==F?F.nb$remainder(y):new Sk.builtin.int_(JSBI.numberIfSafe(JSBI.powermod(g(Q),g(r),g(y.v))))}return new Sk.builtin.int_(JSBI.exponentiate(g(Q),g(r)))},nb$long(){return new Sk.builtin.lng(this.v)}},getsets:{real:{$get:e,$doc:\"the real part of a complex number\"},imag:{$get(){return S},$doc:\"the imaginary part of a complex number\"},numerator:{$get:e},denominator:{$get(){return U}}},classmethods:{from_bytes:{$meth(r,y){Sk.abstr.checkArgsLen(\"from_bytes\",r,0,2);let [F,J,Q]=Sk.abstr.copyKeywordsToNamedArgs(\"from_bytes\",\n[\"bytes\",\"byteorder\",\"signed\"],r,y,[Sk.builtin.bool.false$]);r=l(J);F instanceof Sk.builtin.bytes||(F=Sk.misceval.callsimArray(Sk.builtin.bytes,[F]));if(Sk.misceval.isTrue(Q))throw new Sk.builtin.NotImplementedError(\"from_bytes with signed=True is not yet implemented in Skulpt\");const X=[];F.valueOf().forEach(ba=>{X.push(ba.toString(16).padStart(2,\"0\"))});r&&X.reverse();r=new Sk.builtin.int_(JSBI.numberIfSafe(JSBI.BigInt(\"0x\"+(X.join(\"\")||\"0\"))));return this===Sk.builtin.int_?r:Sk.misceval.callsimArray(this,\n[r])},$flags:{FastCall:!0}}},methods:{conjugate:{$meth:e,$flags:{NoArgs:!0},$textsig:null,$doc:\"Returns self, the complex conjugate of any int.\"},bit_length:{$meth(){let r=this.v;if(0===r)return new Sk.builtin.int_(0);r=\"number\"===typeof r?Math.abs(r):f(r);return new Sk.builtin.int_(r.toString(2).length)},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Number of bits necessary to represent self in binary.\\n\\n>>> bin(37)\\n'0b100101'\\n>>> (37).bit_length()\\n6\"},to_bytes:{$meth(r,y){Sk.abstr.checkArgsLen(\"to_bytes\",\nr,0,2);let [F,J,Q]=Sk.abstr.copyKeywordsToNamedArgs(\"to_bytes\",[\"length\",\"byteorder\",\"signed\"],r,y,[Sk.builtin.bool.false$]);r=l(J);F=Sk.misceval.asIndexSized(F,Sk.builtin.OverflowError);if(0>F)throw new Sk.builtin.ValueError(\"length argument must be non-negative\");if(Sk.misceval.isTrue(Q))throw new Sk.builtin.NotImplementedError(\"to_bytes with signed=True is not yet implemented in Skulpt\");if(this.nb$isnegative())throw new Sk.builtin.OverflowError(\"can't convert negative int to unsigned\");y=JSBI.BigInt(this.v).toString(16);\ny.length%2&&(y=\"0\"+y);var X=y.length/2;if(X>F){if(0===F&&\"00\"===y)return new Sk.builtin.bytes;throw new Sk.builtin.OverflowError(\"int too big to convert\");}const ba=Array(F).fill(0);X=F-X;let ia=0;for(;XMath.abs(y))return new Sk.builtin.int_(0);if(!Sk.__future__.bankers_rounding)return new Sk.builtin.int_(Math.round(y/\nr)*r);y/=r;F=Math.round(y);return new Sk.builtin.int_((.5===(0y||36= 2 and <= 36\");\"string\"===typeof y&&(y=Number(y));if(\"0x\"===r.substring(0,2).toLowerCase())if(16===y||0===y)r=r.substring(2),y=16;else{if(34>y)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+y+\": '\"+F+\"'\");}else if(\"0b\"===\nr.substring(0,2).toLowerCase())if(2===y||0===y)r=r.substring(2),y=2;else{if(12>y)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+y+\": '\"+F+\"'\");}else if(\"0o\"===r.substring(0,2).toLowerCase())if(8===y||0===y)r=r.substring(2),y=8;else{if(25>y)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+y+\": '\"+F+\"'\");}else if(\"0\"===r.charAt(0)){if(\"0\"===r)return 0;if(8===y||0===y)y=8}0===y&&(y=10);if(-1!==r.indexOf(\"_\")){if(-1!==r.indexOf(\"__\"))throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+\ny+\": '\"+F+\"'\");r=10!==y?r.replace(L,\"\"):r.charAt(0)+r.substring(1).replace(L,\"\")}if(0===r.length)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+y+\": '\"+F+\"'\");for(Q=0;Q=X?ba=X-48:65<=X&&90>=X?ba=X-65+10:97<=X&&122>=X&&(ba=X-97+10);if(ba>=y)throw new Sk.builtin.ValueError(\"invalid literal for int() with base \"+y+\": '\"+F+\"'\");}J&&(r=\"-\"+r);ba=parseInt(r,y);if(m(ba))return ba;F=!1;\"-\"===r[0]&&(F=!0,r=r.substring(1));y=JSBI.BigInt(y);\nJ=C;Q=JSBI.__ZERO;for(X=r.length-1;0<=X;X--)ba=r.charCodeAt(X),48<=ba&&57>=ba?ba-=48:65<=ba&&90>=ba?ba=ba-65+10:97<=ba&&122>=ba&&(ba=ba-97+10),ba=JSBI.multiply(JSBI.BigInt(ba),J),Q=JSBI.add(Q,ba),J=JSBI.multiply(J,y);F&&(Q=JSBI.multiply(Q,JSBI.BigInt(-1)));return r=Q};Sk.builtin.int_.py2$methods={};Sk.longFromStr=function(r,y){if(Sk.__future__.python3)return new Sk.builtin.int_(n(r));r=Sk.str2number(r,y);return new Sk.builtin.lng(r)};Sk.exportSymbol(\"Sk.longFromStr\",Sk.longFromStr);Sk.builtin.int_.withinThreshold=\nm;Sk.builtin.int_.stringToNumberOrBig=n;const z=[.5,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,0x800000000000,281474976710656,562949953421312,0x4000000000000,\n0x8000000000000,4503599627370496,9007199254740992];Sk.builtin.lng=Sk.abstr.buildNativeClass(\"long\",{base:Sk.builtin.int_,constructor:function(r){r=Sk.builtin.int_.call(this,r);void 0!==r&&(this.v=r.v)},slots:{$r(){return new Sk.builtin.str(this.v.toString()+\"L\")},tp$as_number:!0,nb$negative(){return new Sk.builtin.lng(G.nb$negative.call(this).v)},nb$positive(){return new Sk.builtin.lng(G.nb$positive.call(this).v)}}});const G=Sk.builtin.int_.prototype,K=[];for(D=-5;257>D;D++)K[D]=Object.create(Sk.builtin.int_.prototype,\n{v:{value:D}});const S=K[0],U=K[1]},function(D,R){const a=Sk.builtin.int_.prototype;Sk.builtin.bool=Sk.abstr.buildNativeClass(\"bool\",{constructor:function(d){return Sk.misceval.isTrue(d)?Sk.builtin.bool.true$:Sk.builtin.bool.false$},base:Sk.builtin.int_,slots:{tp$doc:\"bool(x) -> bool\\n\\nReturns True when the argument x is true, False otherwise.\\nThe builtins True and False are the only two instances of the class bool.\\nThe class bool is a subclass of the class int, and cannot be subclassed.\",tp$new(d,\nc){Sk.abstr.checkNoKwargs(\"bool\",c);Sk.abstr.checkArgsLen(\"bool\",d,0,1);return new Sk.builtin.bool(d[0])},$r(){return this.v?this.str$True:this.str$False},tp$as_number:!0,nb$and(d){return d.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v&d.v):a.nb$and.call(this,d)},nb$or(d){return d.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v|d.v):a.nb$or.call(this,d)},nb$xor(d){return d.ob$type===Sk.builtin.bool?new Sk.builtin.bool(this.v^d.v):a.nb$xor.call(this,d)}},flags:{sk$unacceptableBase:!0},\nmethods:{__format__:{$meth(){return this.$r()},$flags:{OneArg:!0}}},proto:{str$False:new Sk.builtin.str(\"False\"),str$True:new Sk.builtin.str(\"True\"),valueOf(){return!!this.v}}});Sk.exportSymbol(\"Sk.builtin.bool\",Sk.builtin.bool);Sk.builtin.bool.true$=Object.create(Sk.builtin.bool.prototype,{v:{value:1,enumerable:!0}});Sk.builtin.bool.false$=Object.create(Sk.builtin.bool.prototype,{v:{value:0,enumerable:!0}})},function(D,R){function a(g){const t=[g,0];if(0===g)return t;var l=Math.abs(g);let q=Math.max(-1023,\nMath.floor(Math.log2(l))+1);for(l*=Math.pow(2,-q);.5>l;)l*=2,q--;for(;1<=l;)l*=.5,q++;0>g&&(l=-l);t[0]=l;t[1]=q;return t}function d(){return new Sk.builtin.float_(this.v)}function c(g){return function(t){const l=this.v;t=t.v;if(\"number\"!==typeof t)if(JSBI.__isBigInt(t)){if(t=parseFloat(JSBI.toNumber(t)),Infinity==t||-Infinity==t)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");}else return Sk.builtin.NotImplemented.NotImplemented$;return g(l,t)}}function e(g,t){return function(l){const q=\nthis.v;l=l.v;if(\"number\"!==typeof l){if(!JSBI.__isBigInt(l))return Sk.builtin.NotImplemented.NotImplemented$;if(void 0!==t)return t(q,l)}return g(q,l)}}function k(g){const t=c(g);return function(l,q){if(void 0!==q&&!Sk.builtin.checkNone(q))throw new Sk.builtin.TypeError(\"pow() 3rd argument not allowed unless all arguments are integers\");return t.call(this,l)}}function p(g,t){if(0===t)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");return Infinity===g?Infinity===t||-Infinity===\ng?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(Infinity):-Infinity===g?Infinity===t||-Infinity===g?new Sk.builtin.float_(NaN):0>t?new Sk.builtin.float_(Infinity):new Sk.builtin.float_(-Infinity):new Sk.builtin.float_(g/t)}function h(g,t){if(Infinity===g||-Infinity===g)return new Sk.builtin.float_(NaN);if(0===t)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");return Infinity===t?0>g?new Sk.builtin.float_(-1):new Sk.builtin.float_(0):\n-Infinity===t?0>g||0!==g?new Sk.builtin.float_(0):new Sk.builtin.float_(-1):new Sk.builtin.float_(Math.floor(g/t))}function f(g,t){if(0===t)throw new Sk.builtin.ZeroDivisionError(\"integer division or modulo by zero\");if(0===g)return new Sk.builtin.float_(0);if(Infinity===t)return Infinity===g||-Infinity===g?new Sk.builtin.float_(NaN):0g?0l&&(l+=t):0>t&&0!==l&&(l+=t);0===l&&(0>t?l=-0:-Infinity===Infinity/l&&(l=0));return new Sk.builtin.float_(l)}\nfunction b(g,t){if(0>g&&0!==t%1)return(new Sk.builtin.complex(g,0)).nb$power(new Sk.builtin.complex(t,0));if(0===g&&0>t)throw new Sk.builtin.ZeroDivisionError(\"0.0 cannot be raised to a negative power\");const l=Math.pow(g,t);if(Infinity===Math.abs(l)&&Infinity!==Math.abs(g)&&Infinity!==Math.abs(t))throw new Sk.builtin.OverflowError(\"Numerical result out of range\");return new Sk.builtin.float_(l)}Sk.builtin.float_=Sk.abstr.buildNativeClass(\"float\",{constructor:function(g){Sk.asserts.assert(this instanceof\nSk.builtin.float_,\"bad call to float use 'new'\");if(\"number\"===typeof g)this.v=g;else if(void 0===g)this.v=0;else if(\"string\"===typeof g)this.v=parseFloat(g);else{if(g.nb$float)return g.nb$float();Sk.asserts.fail(\"bad argument to float constructor\")}},slots:{tp$getattr:Sk.generic.getAttr,tp$as_number:!0,tp$doc:\"Convert a string or number to a floating point number, if possible.\",tp$hash(){var g=this.v;if(!Number.isFinite(g))return Number.isNaN(g)?0:0t&&(g=-1,\nt=-t);let q=0,w;for(;t;)q=q<<28&536870911|q>>1,t*=268435456,l-=28,w=Math.trunc(t),t-=w,q+=w,536870911<=q&&(q-=536870911);l=0<=l?l%29:28-(-1-l)%29;q=(q<>29-l)*g;return-1===q?-2:q},$r(){return new Sk.builtin.str(this.str$(10,!0))},tp$new(g,t){if(t&&t.length)throw new Sk.builtin.TypeError(\"float() takes no keyword arguments\");if(g&&1g?Math.ceil(g):\nMath.floor(g);return Sk.builtin.int_.withinThreshold(g)?new Sk.builtin.int_(g):new Sk.builtin.int_(JSBI.BigInt(g))},nb$float:d,nb$long(){return new Sk.builtin.lng(this.nb$int().v)},nb$add:c((g,t)=>new Sk.builtin.float_(g+t)),nb$subtract:c((g,t)=>new Sk.builtin.float_(g-t)),nb$reflected_subtract:c((g,t)=>new Sk.builtin.float_(t-g)),nb$multiply:c((g,t)=>new Sk.builtin.float_(g*t)),nb$divide:c(p),nb$reflected_divide:c((g,t)=>p(t,g)),nb$floor_divide:c(h),nb$reflected_floor_divide:c((g,t)=>h(t,g)),nb$remainder:c(f),\nnb$reflected_remainder:c((g,t)=>f(t,g)),nb$divmod:c((g,t)=>new Sk.builtin.tuple([h(g,t),f(g,t)])),nb$reflected_divmod:c((g,t)=>new Sk.builtin.tuple([h(t,g),f(t,g)])),nb$power:k(b),nb$reflected_power:k((g,t)=>b(t,g)),nb$abs(){return new Sk.builtin.float_(Math.abs(this.v))},nb$negative(){return new Sk.builtin.float_(-this.v)},nb$positive(){return new Sk.builtin.float_(this.v)},nb$bool(){return 0!==this.v},nb$isnegative(){return 0>this.v},nb$ispositive(){return 0<=this.v},ob$eq:e((g,t)=>g==t,JSBI.EQ),\nob$ne:e((g,t)=>g!=t,JSBI.NE),ob$gt:e((g,t)=>g>t,JSBI.GT),ob$ge:e((g,t)=>g>=t,JSBI.GE),ob$lt:e((g,t)=>gg<=t,JSBI.LE)},getsets:{real:{$get:d,$doc:\"the real part of a complex number\"},imag:{$get(){return new Sk.builtin.float_(0)},$doc:\"the imaginary part of a complex number\"}},methods:{conjugate:{$meth:d,$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return self, the complex conjugate of any float.\"},__trunc__:{$meth(){return this.nb$int()},$flags:{NoArgs:!0},$textsig:\"($self, /)\",\n$doc:\"Return the Integral closest to x between 0 and x.\"},__round__:{$meth(g){return this.round$(g)},$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($self, ndigits=None, /)\",$doc:\"Return the Integral closest to x, rounding half toward even.\\n\\nWhen an argument is passed, work like built-in round(x, ndigits).\"},as_integer_ratio:{$meth(){if(!Number.isFinite(this.v)){if(Number.isNaN(this.v))throw new Sk.builtin.ValueError(\"cannot convert NaN to integer ratio\");throw new Sk.builtin.OverflowError(\"cannot convert Infinity to integer ratio\");\n}let [g,t]=a(this.v);for(var l=0;300>l&&g!=Math.floor(g);l++)g*=2,t--;l=new Sk.builtin.int_(Math.abs(t));let q=new Sk.builtin.int_(g),w=new Sk.builtin.int_(1);0>> (10.0).as_integer_ratio()\\n(10, 1)\\n>>> (0.0).as_integer_ratio()\\n(0, 1)\\n>>> (-.25).as_integer_ratio()\\n(-1, 4)\"},\nis_integer:{$meth(){return new Sk.builtin.bool(Number.isInteger(this.v))},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:\"Return True if the float is an integer.\"},__getnewargs__:{$meth(){return new Sk.builtin.tuple([this])},$flags:{NoArgs:!0},$textsig:\"($self, /)\",$doc:Sk.builtin.none.none$},__format__:{$meth:Sk.formatting.mkNumber__format__(!0),$flags:{OneArg:!0},$textsig:\"($self, format_spec, /)\",$doc:Sk.builtin.none.none$}},proto:{valueOf(){return this.v}}});const m=/_[eE]|[eE]_|\\._|_\\.|[+-]_|__/,\nn=/_(?=[^_])/g;Sk.builtin.float_.PyFloat_Check=function(g){return void 0===g?!1:Sk.builtin.checkNumber(g)||Sk.builtin.checkFloat(g)||g.ob$type.$isSubType(Sk.builtin.float_)?!0:!1};Sk.builtin.float_.prototype.toFixed=function(g){g=Sk.builtin.asnum$(g);return this.v.toFixed(g)};Sk.builtin.float_.prototype.round$=function(g){var t=Sk.builtin.asnum$(this);var l=void 0===g?0:Sk.misceval.asIndexSized(g);if(Sk.__future__.bankers_rounding){t*=Math.pow(10,l);var q=Math.round(t);l=(.5===(0l.length?t.toExponential():t.toExponential(11));if(0>l.indexOf(\"e\")&&0<=l.indexOf(\".\")){for(;\"0\"==l.charAt(l.length-1);)l=l.substring(0,l.length-1);\".\"==l.charAt(l.length-1)&&(l+=\"0\")}l=l.replace(/\\.0+e/,\"e\",\"i\");l=l.replace(/(e[-+])([1-9])$/,\"$10$2\");l=l.replace(/0+(e.*)/,\"$1\")}else l=t.toString(g);0===this.v&&-Infinity===1/this.v&&(l=\"-\"+l);0>l.indexOf(\".\")&&0>l.indexOf(\"E\")&&0>l.indexOf(\"e\")&&(l+=\n\".0\");return l};Sk.builtin.float_.py2$methods={}},function(D,R){function a(l){let q=l.v;if(\"number\"===typeof q)return q;l.nb$float&&(q=l.nb$float());if(void 0===q)throw new Sk.builtin.TypeError(\"a float is required\");return q.v}function d(l,q,w){if(w===Sk.builtin.complex.prototype)return new Sk.builtin.complex(l,q);w=new w.constructor;Sk.builtin.complex.call(w,l,q);return w}function c(l,q){return function(w){const x=this.real,v=this.imag;var C=w.real;const E=w.v;if(\"number\"===typeof C)w=w.imag;else if(\"number\"===\ntypeof E)C=E,w=0;else if(JSBI.__isBigInt(E)){if(void 0===q){if(C=parseFloat(JSBI.toNumber(E)),Infinity==C||-Infinity==C)throw new Sk.builtin.OverflowError(\"int too large to convert to float\");}else C=E.toString();w=0}else return Sk.builtin.NotImplemented.NotImplemented$;return l(x,v,C,w)}}function e(l,q,w,x){var v=Math.abs(w);const C=Math.abs(x);if(v>=C){if(0===v)throw new Sk.builtin.ZeroDivisionError(\"complex division by zero\");v=x/w;w+=x*v;x=(l+q*v)/w;l=(q-l*v)/w}else C>=v?(v=w/x,w=w*v+x,Sk.asserts.assert(0!==\nx),x=(l*v+q)/w,l=(q*v-l)/w):l=x=NaN;return new Sk.builtin.complex(x,l)}function k(l,q,w,x){if(0===w&&0===x){x=1;var v=0}else if(0===l&&0===q){if(0!==x||0>w)throw new Sk.builtin.ZeroDivisionError(\"complex division by zero\");v=x=0}else{const C=Math.hypot(l,q);v=Math.pow(C,w);l=Math.atan2(q,l);w*=l;0!==x&&(v/=Math.exp(l*x),w+=x*Math.log(C));x=v*Math.cos(w);v*=Math.sin(w)}return new Sk.builtin.complex(x,v)}function p(l,q,w){let x=1;var v=new Sk.builtin.complex(1,0);for(l=new Sk.builtin.complex(l,q);0<\nx&&w>=x;)w&x&&(v=new Sk.builtin.complex(v.real*l.real-v.imag*l.imag,v.real*l.imag+l.real*v.imag)),x<<=1,l=new Sk.builtin.complex(l.real*l.real-l.imag*l.imag,2*l.real*l.imag);return v}function h(l,q,w,x,v){v=!1;switch(q){case \"e\":case \"f\":case \"g\":break;case \"E\":v=!0;q=\"e\";break;case \"F\":v=!0;q=\"f\";break;case \"r\":if(0!==w)throw Error(\"Bad internall call\");w=17;q=\"g\";break;default:throw Error(\"Bad internall call\");}if(isNaN(l))l=\"nan\";else if(Infinity===l)l=\"inf\";else if(-Infinity===l)l=\"-inf\";else{x&\nh.Py_DTSF_ADD_DOT_0&&(q=\"g\");var C=\"%\"+(x&h.Py_DTSF_ALT?\"#\":\"\");null!=w&&(C=C+\".\"+w);C=new Sk.builtin.str(C+q);l=C.nb$remainder(new Sk.builtin.float_(l));l=l.v}x&h.Py_DTSF_SIGN&&\"-\"!==l[0]&&(l=\"+\"+l);v&&(l=l.toUpperCase());return l}Sk.builtin.complex=Sk.abstr.buildNativeClass(\"complex\",{constructor:function(l,q){Sk.asserts.assert(this instanceof Sk.builtin.complex,\"bad call to complex constructor, use 'new'\");this.real=l;this.imag=q},slots:{tp$as_number:!0,tp$doc:\"Create a complex number from a real part and an optional imaginary part.\\n\\nThis is equivalent to (real + imag*1j) where imag defaults to 0.\",\ntp$hash(){var l=(new Sk.builtin.float_(this.real)).tp$hash();l=1003*(new Sk.builtin.float_(this.imag)).tp$hash()+l;return Sk.builtin.int_.withinThreshold(l)?l:(new Sk.builtin.int_(JSBI.BigInt(l))).tp$hash()},tp$getattr:Sk.generic.getAttr,tp$new(l,q){l=Sk.abstr.copyKeywordsToNamedArgs(\"complex\",[\"real\",\"imag\"],l,q,[null,null]);{var w=l[1],x;let C=q=!1;var v=l[0];if(null!=v&&v.constructor===Sk.builtin.complex&&null==w)q=v;else if(Sk.builtin.checkString(v)){if(null!=w)throw new Sk.builtin.TypeError(\"complex() can't take second arg if first is a string\");\nq=Sk.builtin.complex.complex_subtype_from_string(v,this)}else{if(null!=w&&Sk.builtin.checkString(w))throw new Sk.builtin.TypeError(\"complex() second arg can't be a string\");null==v?l=null:(l=Sk.abstr.lookupSpecial(v,Sk.builtin.str.$complex),l=void 0!==l?Sk.misceval.callsimArray(l,[]):null);if(null!=l&&l!==Sk.builtin.NotImplemented.NotImplemented$){if(!f(l))throw new Sk.builtin.TypeError(\"__complex__ should return a complex object\");v=l}if(null!=v&&void 0===v.nb$float)throw new Sk.builtin.TypeError(\"complex() first argument must be a string or a number, not '\"+\nSk.abstr.typeName(v)+\"'\");if(null!=w&&void 0===w.nb$float)throw new Sk.builtin.TypeError(\"complex() second argument must be a number, not '\"+Sk.abstr.typeName(v)+\"'\");null==v?v=l=0:f(v)?(l=v.real,v=v.imag,q=!0):(l=a(v),v=0);null==w?w=x=0:f(w)?(x=w.real,w=w.imag,C=!0):(x=a(w),w=0);!0===C&&(l-=w);!0===q&&(x+=v);q=d(l,x,this)}}return q},tp$richcompare(l,q){if(\"Eq\"!==q&&\"NotEq\"!==q){if(Sk.builtin.checkNumber(l)||f(l))throw new Sk.builtin.TypeError(\"no ordering relation is defined for complex numbers\");\nreturn Sk.builtin.NotImplemented.NotImplemented$}return c(function(w,x,v,C){w=w==v&&x==C;return\"Eq\"===q?w:!w},!0).call(this,l)},$r(){{var l,q;let v=l=\"\";var w=this.real;var x=this.imag;if(q=0===w)q=1==(w?0>w?-1:1:0>1/w?-1:1);q?(w=\"\",q=h(x,\"g\",null,0,null)):(w=l=h(w,\"g\",null,0,null),q=h(x,\"g\",null,h.Py_DTSF_SIGN,null),0===x&&-Infinity===1/x&&q&&\"-\"!==q[0]&&(q=\"-\"+q),l=\"(\",v=\")\");x=new Sk.builtin.str(\"\"+l+w+q+\"j\"+v)}return x},nb$int(){throw new Sk.builtin.TypeError(\"can't convert complex to int\");},\nnb$long(){throw new Sk.builtin.TypeError(\"can't convert complex to long\");},nb$float(){throw new Sk.builtin.TypeError(\"can't convert complex to float\");},nb$positive(){return new Sk.builtin.complex(this.real,this.imag)},nb$negative(){return new Sk.builtin.complex(-this.real,-this.imag)},nb$bool(){return this.real||this.imag},nb$add:c((l,q,w,x)=>new Sk.builtin.complex(l+w,q+x)),nb$subtract:c((l,q,w,x)=>new Sk.builtin.complex(l-w,q-x)),nb$reflected_subtract:c((l,q,w,x)=>new Sk.builtin.complex(w-l,x-\nq)),nb$multiply:c((l,q,w,x)=>new Sk.builtin.complex(w*l-x*q,l*x+q*w)),nb$divide:c(e),nb$reflected_divide:c((l,q,w,x)=>e(w,x,l,q)),nb$floor_divide(l){throw new Sk.builtin.TypeError(\"can't take floor of complex number.\");},nb$reflected_floor_divide(l){throw new Sk.builtin.TypeError(\"can't take floor of complex number.\");},nb$remainder(l){throw new Sk.builtin.TypeError(\"can't mod complex numbers.\");},nb$reflected_remainder(l){throw new Sk.builtin.TypeError(\"can't mod complex numbers.\");},nb$divmod(l){throw new Sk.builtin.TypeError(\"can't take floor or mod of complex number.\");\n},nb$power(l,q){if(null!=q&&!Sk.builtin.checkNone(q))throw new Sk.builtin.ValueError(\"complex modulo\");return g.call(this,l)},nb$reflected_power(l,q){if(null!=q&&!Sk.builtin.checkNone(q))throw new Sk.builtin.ValueError(\"complex modulo\");return t.call(this,l)},nb$abs(){var l=this.real;const q=this.imag;if(!Number.isFinite(l)||!Number.isFinite(q))return Infinity===l||-Infinity===l?new Sk.builtin.float_(Math.abs(l)):Infinity===q||-Infinity===q?new Sk.builtin.float_(Math.abs(q)):new Sk.builtin.float_(NaN);\nl=Math.hypot(l,q);if(!Number.isFinite(l))throw new Sk.builtin.OverflowError(\"absolute value too large\");return new Sk.builtin.float_(l)}},getsets:{real:{$get(){return new Sk.builtin.float_(this.real)},$doc:\"the real part of a complex number\"},imag:{$get(){return new Sk.builtin.float_(this.imag)},$doc:\"the imaginary part of a complex number\"}},methods:{conjugate:{$meth(){return new Sk.builtin.complex(this.real,-this.imag)},$flags:{NoArgs:!0},$textsig:null,$doc:\"complex.conjugate() -> complex\\n\\nReturn the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.\"},\n__getnewargs__:{$meth(){return new Sk.builtin.tuple([new Sk.builtin.float_(this.real),new Sk.builtin.float_(this.imag)])},$flags:{NoArgs:!0},$textsig:null,$doc:Sk.builtin.none.none$},__format__:{$meth(l){if(Sk.builtin.checkString(l))throw new Sk.builtin.NotImplementedError(\"__format__ is not implemented for complex type.\");throw new Sk.builtin.TypeError(\"__format__ requires str\");},$flags:{OneArg:!0},$textsig:null,$doc:\"complex.__format__() -> str\\n\\nConvert to a string according to format_spec.\"}}});\nSk.exportSymbol(\"Sk.builtin.complex\",Sk.builtin.complex);const f=Sk.builtin.checkComplex,b=/_[eE]|[eE]_|\\._|_\\.|[+-]_|_j|j_/,m=/_(?=[^_])/g;Sk.builtin.complex.complex_subtype_from_string=function(l,q){q=q||Sk.builtin.complex.prototype;var w=0,x=0,v=!1;if(Sk.builtin.checkString(l))l=Sk.ffi.remapToJs(l);else if(\"string\"!==typeof l)throw new TypeError(\"provided unsupported string-alike argument\");if(-1!==l.indexOf(\"\\x00\")||0===l.length||\"\"===l)throw new Sk.builtin.ValueError(\"complex() arg is a malformed string\");\nvar C=0;l=l.replace(/inf|infinity/gi,\"Infinity\");for(l=l.replace(/nan/gi,\"NaN\");\" \"===l[C];)C++;if(\"(\"===l[C])for(v=!0,C++;\" \"===l[C];)C++;if(-1!==l.indexOf(\"_\")){if(b.test(l))throw new Sk.builtin.ValueError(\"could not convert string to complex: '\"+l+\"'\");l=l.charAt(0)+l.substring(1).replace(m,\"\")}var E=/^(?:[+-]?(?:(?:(?:\\d*\\.\\d+)|(?:\\d+\\.?))(?:[eE][+-]?\\d+)?|NaN|Infinity))/;var L=l.substr(C);var z=L.match(E);if(null!==z)if(C+=z[0].length,\"j\"===l[C]||\"J\"===l[C])x=parseFloat(z[0]),C++;else if(\"+\"===\nl[C]||\"-\"===l[C]){w=parseFloat(z[0]);z=l.substr(C).match(E);null!==z?(x=parseFloat(z[0]),C+=z[0].length):(x=\"+\"===l[C]?1:-1,C++);if(\"j\"!==l[C]&&\"J\"!==l[C])throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");C++}else w=parseFloat(z[0]);else z=z=L.match(/^([+-]?[jJ])/),null!==z&&(x=1===z[0].length?1:\"+\"===z[0][0]?1:-1,C+=z[0].length);for(;\" \"===l[C];)C++;if(v){if(\")\"!==l[C])throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");for(C++;\" \"===l[C];)C++}if(l.length!==C)throw new Sk.builtin.ValueError(\"complex() arg is malformed string\");\nreturn d(w,x,q)};const n=(l,q,w,x)=>{const v=w|0;return 0===x&&w===v?(100v?l=k(l,q,v,0):0n(w,x,l,q));h.Py_DTSF_SIGN=1;h.Py_DTSF_ADD_DOT_0=2;h.Py_DTSF_ALT=4;h.Py_DTST_FINITE=0;h.Py_DTST_INFINITE=1;h.Py_DTST_NAN=2},function(D,R){Sk.builtin.slice=Sk.abstr.buildNativeClass(\"slice\",{constructor:function(a,d,c){void 0===d&&void 0===c&&(d=a,a=Sk.builtin.none.none$);void 0===d&&(d=Sk.builtin.none.none$);void 0===\nc&&(c=Sk.builtin.none.none$);this.start=a;this.stop=d;this.step=c},slots:{tp$getattr:Sk.generic.getAttr,tp$doc:\"slice(stop)\\nslice(start, stop[, step])\\n\\nCreate a slice object. This is used for extended slicing (e.g. a[0:10:2]).\",tp$hash:Sk.builtin.none.none$,tp$new(a,d){Sk.abstr.checkNoKwargs(\"slice\",d);Sk.abstr.checkArgsLen(\"slice\",a,1,3);return new Sk.builtin.slice(...a)},$r(){const a=Sk.misceval.objectRepr(this.start),d=Sk.misceval.objectRepr(this.stop),c=Sk.misceval.objectRepr(this.step);return new Sk.builtin.str(\"slice(\"+\na+\", \"+d+\", \"+c+\")\")},tp$richcompare(a,d){if(a.ob$type!==Sk.builtin.slice)return Sk.builtin.NotImplemented.NotImplemented$;const c=new Sk.builtin.tuple([this.start,this.stop,this.step]);a=new Sk.builtin.tuple([a.start,a.stop,a.step]);return c.tp$richcompare(a,d)}},getsets:{start:{$get(){return this.start}},step:{$get(){return this.step}},stop:{$get(){return this.stop}}},methods:{indices:{$meth:function(a){a=Sk.misceval.asIndexSized(a,Sk.builtin.OverflowError);if(0>a)throw new Sk.builtin.TypeError(\"length should not be negative\");\nconst {start:d,stop:c,step:e}=this.slice$indices(a);return new Sk.builtin.tuple([new Sk.builtin.int_(d),new Sk.builtin.int_(c),new Sk.builtin.int_(e)])},$doc:\"S.indices(len) -> (start, stop, stride)\\n\\nAssuming a sequence of length len, calculate the start and stop\\nindices, and the stride length of the extended slice described by\\nS. Out of bounds indices are clipped in a manner consistent with the\\nhandling of normal slices.\",$textsig:null,$flags:{OneArg:!0}}},proto:{slice$as_indices(a){let d;var c=\na?e=>Sk.misceval.asIndexSized(e,null,\"slice indices must be integers or None or have an __index__ method\"):e=>Sk.misceval.asIndexOrThrow(e,\"slice indices must be integers or None or have an __index__ method\");if(Sk.builtin.checkNone(this.step))d=1;else if(d=c(this.step),0===d)throw new Sk.builtin.ValueError(\"slice step cannot be zero\");a=Sk.builtin.checkNone(this.start)?null:c(this.start);c=Sk.builtin.checkNone(this.stop)?null:c(this.stop);return{start:a,stop:c,step:d}},$wrt(a,d,c,e,k){k=k?p=>JSBI.__isBigInt(p)?\nJSBI.add(p,JSBI.BigInt(a)):p+a:p=>p+a;0d&&(d=k(d),0>d&&(d=0)),null===c?c=a:c>a?c=a:0>c&&(c=k(c))):(null===d?d=a-1:d>=a?d=a-1:0>d&&(d=k(d)),null===c?c=-1:0>c&&(c=k(c),0>c&&(c=-1)));return{start:d,stop:c,step:e}},slice$indices(a,d){let {start:c,stop:e,step:k}=this.slice$as_indices(!0,d);return this.$wrt(a,c,e,k,d)},sssiter$(a,d){let {start:c,stop:e,step:k}=this.slice$indices(a,!0);if(0e;a+=k)d(a)}},flags:{sk$unacceptableBase:!0}});Sk.builtin.slice.startEnd$wrt=\nfunction(a,d,c){a=a.sq$length();void 0===d||Sk.builtin.checkNone(d)?d=0:(d=Sk.misceval.asIndexSized(d,null,\"slice indices must be integers or have an __index__ method\"),0>d&&(d+=a,0>d&&(d=0)));void 0===c||Sk.builtin.checkNone(c)?c=a:(c=Sk.misceval.asIndexSized(c,null,\"slice indices must be integers or have an __index__ method\"),0>c?(c+=a,0>c&&(c=0)):c>a&&(c=a));return{start:d,end:c}}},function(D,R){function a(e){return function(k){return Sk.builtin.checkAnySet(k)?e.call(this,k):Sk.builtin.NotImplemented.NotImplemented$}}\nfunction d(e){e instanceof Sk.builtin.set&&e.tp$hash===Sk.builtin.none.none$&&(e=new Sk.builtin.frozenset(Sk.misceval.arrayFromIterable(e)));return e}D={};Sk.builtin.set=Sk.abstr.buildNativeClass(\"set\",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e));Sk.asserts.assert(this instanceof Sk.builtin.set,\"Bad call to set - must be called with an Array and 'new'\");const k=[];for(let p=0;p new empty set object\\nset(iterable) -> new set object\\n\\nBuild an unordered collection of unique elements.\",tp$init(e,k){Sk.abstr.checkNoKwargs(\"set\",k);Sk.abstr.checkArgsLen(\"set\",e,0,1);this.set$clear();return(e=e[0])&&this.set$update(e)},tp$new:Sk.generic.new,$r(){if(this.in$repr)return new Sk.builtin.str(Sk.abstr.typeName(this)+\"(...)\");this.in$repr=!0;const e=this.sk$asarray().map(k=>\nSk.misceval.objectRepr(k));this.in$repr=!1;return Sk.__future__.python3?0===e.length?new Sk.builtin.str(Sk.abstr.typeName(this)+\"()\"):this.ob$type!==Sk.builtin.set?new Sk.builtin.str(Sk.abstr.typeName(this)+\"({\"+e.join(\", \")+\"})\"):new Sk.builtin.str(\"{\"+e.join(\", \")+\"}\"):new Sk.builtin.str(Sk.abstr.typeName(this)+\"([\"+e.join(\", \")+\"])\")},tp$iter(){return new c(this)},tp$richcompare(e,k){if(!Sk.builtin.checkAnySet(e))return Sk.builtin.NotImplemented.NotImplemented$;switch(k){case \"NotEq\":case \"Eq\":return e=\nthis===e?!0:this.get$size()!==e.get$size()?!1:Sk.misceval.isTrue(this.set$issubset(e)),\"Eq\"===k?e:!e;case \"LtE\":return this===e||Sk.misceval.isTrue(this.set$issubset(e));case \"GtE\":return this===e||Sk.misceval.isTrue(e.set$issubset(this));case \"Lt\":return this.get$size()e.get$size()&&Sk.misceval.isTrue(e.set$issubset(this))}},nb$subtract:a(function(e){return this.difference.$meth.call(this,e)}),nb$and:a(function(e){return this.intersection.$meth.call(this,\ne)}),nb$or:a(function(e){return this.union.$meth.call(this,e)}),nb$xor:a(function(e){return this.symmetric_difference.$meth.call(this,e)}),nb$inplace_subtract:a(function(e){e===this&&(e=e.set$copy());return Sk.misceval.chain(this.difference_update.$meth.call(this,e),()=>this)}),nb$inplace_and:a(function(e){return Sk.misceval.chain(this.intersection_update.$meth.call(this,e),()=>this)}),nb$inplace_or:a(function(e){return Sk.misceval.chain(this.update.$meth.call(this,e),()=>this)}),nb$inplace_xor:a(function(e){e===\nthis&&(e=e.set$copy());return Sk.misceval.chain(this.symmetric_difference_update.$meth.call(this,e),()=>this)}),sq$length(){return this.get$size()},sq$contains(e){e=d(e);return this.v.sq$contains(e)}},methods:{add:{$meth(e){this.set$add(e);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Add an element to a set.\\n\\nThis has no effect if the element is already present.\"},clear:{$meth(){this.set$clear();return Sk.builtin.none.none$},$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove all elements from this set.\"},\ncopy:{$meth(){return this.set$copy()},$flags:{NoArgs:!0},$textsig:null,$doc:\"Return a shallow copy of a set.\"},discard:{$meth(e){e=d(e);this.set$discard(e);return Sk.builtin.none.none$},$flags:{OneArg:!0},$textsig:null,$doc:\"Remove an element from a set if it is a member.\\n\\nIf the element is not a member, do nothing.\"},difference:{$meth(...e){const k=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,p=>k.set$difference_update(p)),()=>k)},$flags:{MinArgs:0},$textsig:null,$doc:\"Return the difference of two or more sets as a new set.\\n\\n(i.e. all elements that are in this set but not the others.)\"},\ndifference_update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,k=>this.set$difference_update(k)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:\"Remove all elements of another set from this set.\"},intersection:{$meth(...e){return this.set$intersection_multi(...e)},$flags:{MinArgs:0},$textsig:null,$doc:\"Return the intersection of two sets as a new set.\\n\\n(i.e. all elements that are in both sets.)\"},intersection_update:{$meth(...e){return Sk.misceval.chain(this.set$intersection_multi(...e),\nk=>{this.swap$bodies(k);return Sk.builtin.none.none$})},$flags:{MinArgs:0},$textsig:null,$doc:\"Update a set with the intersection of itself and another.\"},isdisjoint:{$meth(e){return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),k=>{if(this.sq$contains(k))return new Sk.misceval.Break(Sk.builtin.bool.false$)}),k=>k||Sk.builtin.bool.true$)},$flags:{OneArg:!0},$textsig:null,$doc:\"Return True if two sets have a null intersection.\"},issubset:{$meth(e){Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e));\nreturn Sk.misceval.chain(e,k=>this.set$issubset(k))},$flags:{OneArg:!0},$textsig:null,$doc:\"Report whether another set contains this set.\"},issuperset:{$meth(e){Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e));return Sk.misceval.chain(e,k=>k.set$issubset(this))},$flags:{OneArg:!0},$textsig:null,$doc:\"Report whether this set contains another set.\"},pop:{$meth(){if(0===this.get$size())throw new Sk.builtin.KeyError(\"pop from an empty set\");return Sk.misceval.callsimArray(this.v.popitem,[this.v]).v[0]},\n$flags:{NoArgs:!0},$textsig:null,$doc:\"Remove and return an arbitrary set element.\\nRaises KeyError if the set is empty.\"},remove:{$meth(e){const k=d(e);if(this.v.mp$lookup(k))return this.v.mp$ass_subscript(k),Sk.builtin.none.none$;throw new Sk.builtin.KeyError(e);},$flags:{OneArg:!0},$textsig:null,$doc:\"Remove an element from a set; it must be a member.\\n\\nIf the element is not a member, raise a KeyError.\"},symmetric_difference:{$meth(e){let k;return Sk.misceval.chain(this.set$make_basetype(e),p=>\n{k=p;return k.set$symmetric_diff_update(this)},()=>k)},$flags:{OneArg:!0},$textsig:null,$doc:\"Return the symmetric difference of two sets as a new set.\\n\\n(i.e. all elements that are in exactly one of the sets.)\"},symmetric_difference_update:{$meth(e){Sk.builtin.checkAnySet(e)||(e=this.set$make_basetype(e));return Sk.misceval.chain(e,k=>this.set$symmetric_diff_update(k),()=>Sk.builtin.none.none$)},$flags:{OneArg:!0},$textsig:null,$doc:\"Update a set with the symmetric difference of itself and another.\"},\nunion:{$meth(...e){const k=this.set$copy();return Sk.misceval.chain(Sk.misceval.iterArray(e,p=>k.set$update(p)),()=>k)},$flags:{MinArgs:0},$textsig:null,$doc:\"Return the union of sets as a new set.\\n\\n(i.e. all elements that are in either set.)\"},update:{$meth(...e){return Sk.misceval.chain(Sk.misceval.iterArray(e,k=>this.set$update(k)),()=>Sk.builtin.none.none$)},$flags:{MinArgs:0},$textsig:null,$doc:\"Update a set with the union of itself and others.\"}},classmethods:Sk.generic.classGetItem,proto:Object.assign(D,\n{sk$asarray(){return this.v.sk$asarray()},get$size(){return this.v.sq$length()},set$add(e){this.v.mp$ass_subscript(e,!0)},set$make_basetype(e){return Sk.misceval.chain(Sk.misceval.arrayFromIterable(e,!0),k=>new this.sk$builtinBase(k))},set$discard(e){return this.v.pop$item(e)},set$clear(){this.v.dict$clear()},set$copy(){const e=new this.sk$builtinBase;e.v=this.v.dict$copy();return e},set$difference_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),k=>{this.set$discard(k)})},set$intersection(e){const k=\nnew this.sk$builtinBase;return Sk.misceval.chain(Sk.misceval.iterFor(Sk.abstr.iter(e),p=>{this.sq$contains(p)&&k.set$add(p)}),()=>k)},set$intersection_multi(...e){if(!e.length)return this.set$copy();let k=this;return Sk.misceval.chain(Sk.misceval.iterArray(e,p=>Sk.misceval.chain(k.set$intersection(p),h=>{k=h})),()=>k)},set$issubset(e){const k=this.get$size(),p=e.get$size();if(k>p)return Sk.builtin.bool.false$;for(let h=this.tp$iter(),f=h.tp$iternext();void 0!==f;f=h.tp$iternext())if(!e.sq$contains(f))return Sk.builtin.bool.false$;\nreturn Sk.builtin.bool.true$},set$symmetric_diff_update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),k=>{void 0===this.set$discard(k)&&this.set$add(k)})},set$update(e){return Sk.misceval.iterFor(Sk.abstr.iter(e),k=>{this.set$add(k)})},swap$bodies(e){this.v=e.v}})});Sk.exportSymbol(\"Sk.builtin.set\",Sk.builtin.set);R=Sk.builtin.set.prototype;Sk.builtin.frozenset=Sk.abstr.buildNativeClass(\"frozenset\",{constructor:function(e){void 0===e?e=[]:Array.isArray(e)||(e=Sk.misceval.arrayFromIterable(e));Sk.asserts.assert(this instanceof\nSk.builtin.frozenset,\"bad call to frozen set - must be called with 'new'\");const k=[];for(let p=0;p empty frozenset object\\nfrozenset(iterable) -> frozenset object\\n\\nBuild an immutable unordered collection of unique elements.\",tp$hash(){let e=1927868237;const k=this.sk$asarray();e*=k.length+1;for(let p=0;pp.length?new Sk.builtin.frozenset(p):Sk.builtin.frozenset.$emptyset)},$r:R.$r,tp$iter:R.tp$iter,tp$richcompare:R.tp$richcompare,nb$subtract:R.nb$subtract,\nnb$and:R.nb$and,nb$or:R.nb$or,nb$xor:R.nb$xor,sq$length:R.sq$length,sq$contains:R.sq$contains},methods:{copy:Object.assign({},R.copy.d$def,{$meth(){return this.constructor===this.sk$builtinBase?this:new Sk.builtin.frozenset(this.sk$asarray())}}),difference:R.difference.d$def,intersection:R.intersection.d$def,isdisjoint:R.isdisjoint.d$def,issubset:R.issubset.d$def,issuperset:R.issuperset.d$def,symmetric_difference:R.symmetric_difference.d$def,union:R.union.d$def},classmethods:Sk.generic.classGetItem,\nproto:Object.assign({$subtype_new(e,k){const p=new this.constructor;return Sk.misceval.chain(Sk.builtin.frozenset.prototype.tp$new(e),h=>{p.v=h.v;return p})}},D)});Sk.builtin.frozenset.$emptyset=new Sk.builtin.frozenset([]);Sk.exportSymbol(\"Sk.builtin.frozenset\",Sk.builtin.frozenset);var c=Sk.abstr.buildIteratorClass(\"set_iterator\",{constructor:function(e){this.$index=0;this.$seq=e.sk$asarray();this.$orig=e},iternext:Sk.generic.iterNextWithArrayCheckSize,methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},\nflags:{sk$unacceptableBase:!0}})},function(D,R){Sk.builtin.print=function(a,d){let [c,e,k]=Sk.abstr.copyKeywordsToNamedArgs(\"print\",[\"sep\",\"end\",\"file\",\"flush\"],[],d);if(void 0===c||Sk.builtin.checkNone(c))c=\" \";else if(Sk.builtin.checkString(c))c=c.$jsstr();else throw new Sk.builtin.TypeError(\"sep must be None or a string, not \"+Sk.abstr.typeName(c));if(void 0===e||Sk.builtin.checkNone(e))e=\"\\n\";else if(Sk.builtin.checkString(e))e=e.$jsstr();else throw new Sk.builtin.TypeError(\"end must be None or a string, not \"+\nSk.abstr.typeName(e));let p;if(void 0!==k&&!Sk.builtin.checkNone(k)&&(p=Sk.abstr.lookupSpecial(k,Sk.builtin.str.$write),void 0===p))throw new Sk.builtin.AttributeError(\"'\"+Sk.abstr.typeName(k)+\"' object has no attribute 'write'\");const h=new Sk.builtin.str(a.map(f=>(new Sk.builtin.str(f)).toString()).join(c)+e);if(void 0!==p)Sk.misceval.callsimArray(p,[h]);else return Sk.misceval.chain(Sk.importModule(\"sys\",!1,!0),f=>(p=Sk.abstr.lookupSpecial(f.$d.stdout,Sk.builtin.str.$write))&&Sk.misceval.callsimOrSuspendArray(p,\n[h]))};Sk.builtin.print.co_fastcall=1},function(D,R){Sk.builtin.module=Sk.abstr.buildNativeClass(\"module\",{constructor:function(){this.$d={}},slots:{tp$doc:\"Create a module object.\\n\\nThe name must be a string; the optional doc argument can have any type.\",tp$getattr(a,d){var c=this.$d[a.$mangled];if(void 0!==c)return c;c=this.ob$type.$typeLookup(a);if(void 0!==c){const k=c.tp$descr_get;return k?k.call(c,this,this.ob$type,d):c}const e=this.$d.__getattr__;if(void 0!==e)return c=Sk.misceval.tryCatch(()=>\nSk.misceval.callsimOrSuspendArray(e,[a]),k=>{if(!(k instanceof Sk.builtin.AttributeError))throw k;}),d?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},tp$setattr:Sk.generic.setAttr,tp$new:Sk.generic.new,tp$init(a,d){const [c,e]=Sk.abstr.copyKeywordsToNamedArgs(\"module\",[\"name\",\"doc\"],a,d,[Sk.builtin.none.none$]);Sk.builtin.pyCheckType(\"module\",\"string\",c);this.init$dict(c,e)},$r(){let a=this.get$name();if(void 0!==a){var d=this.get$mod_reprf();if(void 0!==d)return Sk.misceval.callsimOrSuspendArray(d,\n[this])}a=void 0===a?\"'?'\":a;d=this.from$file();d=void 0===d?this.empty_or$loader():d;return new Sk.builtin.str(\"\")}},getsets:{__dict__:{$get(){return new Sk.builtin.mappingproxy(this.$d)}}},methods:{__dir__:{$meth(){const a=this.tp$getattr(Sk.builtin.str.$dict);if(!Sk.builtin.checkMapping(a))throw new Sk.builtin.TypeError(\"__dict__ is not a dictionary\");const d=a.mp$lookup(Sk.builtin.str.$dir);return void 0!==d?Sk.misceval.callsimOrSuspendArray(d,[]):new Sk.builtin.list(Sk.misceval.arrayFromIterable(a))},\n$flags:{NoArgs:!0},$doc:\"__dir__() -> list\\nspecialized dir() implementation\"}},proto:{sk$hasDict:!0,init$dict(a,d){this.$d.__name__=a;this.$d.__doc__=d;this.$d.__package__=Sk.builtin.none.none$;this.$d.__spec__=Sk.builtin.none.none$;this.$d.__loader__=Sk.builtin.none.none$},sk$attrError(){let a=this.get$name();a=void 0===a?\"module\":\"module \"+a;this.$initializing&&(a=\"(most likely due to a circular import) partially initialized \"+a);return a},get$name(){const a=this.tp$getattr(Sk.builtin.str.$name);\nreturn a&&Sk.misceval.objectRepr(a)},from$file(){const a=this.tp$getattr(Sk.builtin.str.$file);return a&&\" from \"+Sk.misceval.objectRepr(a)},empty_or$loader(){if(this.$js&&this.$js.includes(\"$builtinmodule\"))return\" (built-in)\";const a=this.tp$getattr(Sk.builtin.str.$loader);return void 0===a||Sk.builtin.checkNone(a)?\"\":\" (\"+Sk.misceval.objectRepr(a)+\")\"},get$mod_reprf(){const a=this.tp$getattr(Sk.builtin.str.$loader);return a&&a.tp$getattr(this.str$mod_repr)},str$mod_repr:new Sk.builtin.str(\"module_repr\")}});\nSk.exportSymbol(\"Sk.builtin.module\",Sk.builtin.module)},function(D,R){Sk.builtin.structseq_types={};Sk.builtin.make_structseq=function(a,d,c,e,k){e=void 0===e?{}:e;k=void 0===k?null:k;const p=a+\".\"+d,h=[],f={};Object.keys(c).forEach((g,t)=>{h.push(g);f[g]={$get(){return this.v[t]},$doc:c[g]}});const b=h.length;let m=b;Object.keys(e).forEach((g,t)=>{f[g]={$get(){return this.$hidden[t]||Sk.builtin.none.none$},$doc:e[g]};m++});var n=Sk.abstr.buildNativeClass(p,{constructor:function(g,t){Sk.asserts.assert(this instanceof\nn);Sk.builtin.tuple.call(this,g);this.$hidden=t||[]},base:Sk.builtin.tuple,slots:{tp$new(g,t){Sk.abstr.checkOneArg(p,g,t);g=Sk.misceval.arrayFromIterable(g[0]);if(g.lengthm)throw new Sk.builtin.TypeError(p+\"() takes an at most \"+m+\"-sequence (\"+g.length+\"-sequence given)\");return new n(g.slice(0,b),g.slice(b))},tp$doc:k?k:Sk.builtin.none.none$,$r(){var g;if(0===this.v.length)return new Sk.builtin.str(p+\n\"()\");var t=[];for(g=0;g\")}},iternext(a,d){var c=this;if(this.gi$running)throw new Sk.builtin.ValueError(\"generator already executing\");this.gi$running=!0;void 0===d&&(d=Sk.builtin.none.none$);this.gi$sentvalue=d;d=[this];this.func_closure&&d.push(this.func_closure);return function p(k){if(k instanceof Sk.misceval.Suspension){if(a)return new Sk.misceval.Suspension(p,k);k=Sk.misceval.retryOptionalSuspensionOrThrow(k)}c.gi$running=!1;Sk.asserts.assert(void 0!==k);if(Array.isArray(k))return c.gi$resumeat=\nk[0],k=k[1];c.gi$ret=k}(this.func_code.apply(this.func_globals,d))},methods:{send:{$meth(a){return Sk.misceval.chain(this.tp$iternext(!0,a),d=>{if(void 0===d)throw d=this.gi$ret,void 0!==d&&d!==Sk.builtin.none.none$?new Sk.builtin.StopIteration(d):new Sk.builtin.StopIteration;return d})},$flags:{OneArg:!0},$doc:\"send(arg) -> send 'arg' into generator,\\nreturn next yielded value or raise StopIteration.\"}}});Sk.exportSymbol(\"Sk.builtin.generator\",Sk.builtin.generator);Sk.builtin.makeGenerator=function(a,\nd){var c,e=new Sk.builtin.generator(null,null,null);e.tp$iternext=a;for(c in d)d.hasOwnProperty(c)&&(e[c]=d[c]);return e};Sk.exportSymbol(\"Sk.builtin.makeGenerator\",Sk.builtin.makeGenerator)},function(D,R){Sk.builtin.file=function(a,d,c){var e;if(!(this instanceof Sk.builtin.file))return new Sk.builtin.file(a,d,c);this.mode=d;this.name=Sk.ffi.remapToJs(a);this.closed=!1;if(\"/dev/stdout\"===this.name)this.data$=Sk.builtin.none.none$,this.fileno=1;else if(\"/dev/stdin\"===this.name)this.fileno=0;else if(\"/dev/stderr\"===\nthis.name)this.fileno=2;else{if(\"w\"===Sk.ffi.remapToJs(this.mode))this.fileno=Sk.builtin.file.currentFileno++;else for(e in this.fileno=Sk.inBrowser?10:11,this.data$=Sk.read(a.v),this.lineList=this.data$.split(\"\\n\"),this.lineList=this.lineList.slice(0,-1),this.lineList)this.lineList[e]+=\"\\n\";this.currentLine=0}this.pos$=0;Sk.fileopen&&10<=this.fileno&&Sk.fileopen(this);return this};Sk.builtin.file.currentFileno=12;Sk.abstr.setUpInheritance(\"file\",Sk.builtin.file,Sk.builtin.object);Sk.abstr.setUpBuiltinMro(Sk.builtin.file);\nSk.builtin.file.prototype.$r=function(){return new Sk.builtin.str(\"<\"+(this.closed?\"closed\":\"open\")+\"file '\"+this.name+\"', mode '\"+Sk.ffi.remapToJs(this.mode)+\"'>\")};Sk.builtin.file.prototype.tp$iter=function(){var a={tp$iter:function(){return a},$obj:this,$index:this.currentLine,$lines:this.lineList,tp$iternext:function(){if(!(a.$index>=a.$lines.length))return new Sk.builtin.str(a.$lines[a.$index++])}};return a};Sk.abstr.setUpSlots(Sk.builtin.file);Sk.builtin.file.prototype.__enter__=new Sk.builtin.func(function(a){return a});\nSk.builtin.file.prototype.__exit__=new Sk.builtin.func(function(a){return Sk.misceval.callsimArray(Sk.builtin.file.prototype.close,[a])});Sk.builtin.file.prototype.close=new Sk.builtin.func(function(a){a.closed=!0;return Sk.builtin.none.none$});Sk.builtin.file.prototype.flush=new Sk.builtin.func(function(a){});Sk.builtin.file.prototype.fileno=new Sk.builtin.func(function(a){return this.fileno});Sk.builtin.file.prototype.isatty=new Sk.builtin.func(function(a){return!1});Sk.builtin.file.prototype.read=\nnew Sk.builtin.func(function(a,d){var c=a.data$.length;if(a.closed)throw new Sk.builtin.ValueError(\"I/O operation on closed file\");var e=void 0===d?c:Sk.ffi.remapToJs(d);e=new Sk.builtin.str(a.data$.substr(a.pos$,e));a.pos$=void 0===d?c:a.pos$+Sk.ffi.remapToJs(d);a.pos$>=c&&(a.pos$=c);return e});Sk.builtin.file.$readline=function(a,d,c){if(0===a.fileno){a=Sk.ffi.remapToJs(c);a=Sk.inputfun(a?a:\"\");if(a instanceof Promise||a&&\"function\"===typeof a.then){var e=new Sk.misceval.Suspension;e.resume=function(){if(e.data.error)throw e.data.error;\nreturn new Sk.builtin.str(e.data.result)};e.data={type:\"Sk.promise\",promise:a};return e}return new Sk.builtin.str(a)}d=\"\";a.currentLinea(B,T)));if(\"object\"===Z){Z=I.constructor;if(Z===Object&&Object.getPrototypeOf(I)===x||void 0===Z)return T.dictHook?T.dictHook(I):f(I,T);if(Z===Uint8Array)return new Sk.builtin.bytes(I);if(Z===Set)return T.setHook?T.setHook(I):h(I,T);if(Z===Map){if(T.mapHook)return T.mapHook(I);const B=new Sk.builtin.dict;I.forEach((u,A)=>{B.mp$ass_subscript(a(A,T),a(u,T))});return B}return Z===Sk.misceval.Suspension?I:T.proxyHook?\nT.proxyHook(I):b(I)}if(T.unhandledHook)return T.unhandledHook(I);Sk.asserts.fail(\"unhandled remap case of type \"+Z)}function d(I,T){if(void 0===I||null===I)return I;const Z=I.valueOf();if(null===Z)return Z;const B=typeof Z;T=T||{};if(\"string\"===B)return T.stringHook?T.stringHook(Z):Z;if(\"symbol\"===B||\"boolean\"===B)return Z;if(\"number\"===B)return T.numberHook?T.numberHook(Z,I):Z;if(JSBI.__isBigInt(Z))return T.bigintHook?T.bigintHook(Z,I):Z;if(Array.isArray(Z))return T.arrayHook?T.arrayHook(Z,I):Z.map(u=>\nd(u,T));if(Z.sk$object)return I instanceof Sk.builtin.dict?T.dictHook?T.dictHook(I):e(I,T):I instanceof Sk.builtin.set?T.setHook?T.setHook(I):new Set(c(I,T)):T.unhandledHook?T.unhandledHook(I):void 0;if(\"object\"===B)return T.objectHook?T.objectHook(Z,I):Z;if(\"function\"===B)return T.funcHook?T.funcHook(Z,I):Z;Sk.asserts.fail(\"unhandled type \"+B)}function c(I,T){return Array.from(I,Z=>d(Z,T))}function e(I,T){const Z={};I.$items().forEach(B=>{var [u,A]=B;Z[u.valueOf()]=d(A,T)});return Z}function k(I){return Number.isInteger(I)?\nMath.abs(I)a(Z,T)))}function h(I,T){return new Sk.builtin.set(Array.from(I,Z=>a(Z,T)))}function f(I,T){const Z=new Sk.builtin.dict;Object.entries(I).forEach(B=>{var [u,A]=B;Z.mp$ass_subscript(new Sk.builtin.str(u),a(A,T))});return Z}function b(I,T){if(null===I||void 0===I)return Sk.builtin.none.none$;var Z=typeof I;if(\"object\"!==Z&&\n\"function\"!==Z)return a(I);T=T||{};const B=z.get(I);if(B){if(T.bound===B.$bound)return B;T.name||(T.name=B.$name)}\"function\"===Z?T=new Q(I,T):Array.isArray(I)?T=new aa(I):(Z=Object.getPrototypeOf(I),T=Z===C?new X(I):Z===E?new ia(I):new Q(I,T));z.set(I,T);return T}function m(I,T){I=I.toString();void 0===T?delete this.js$wrapped[I]:this.js$wrapped[I]=d(T,J)}function n(I){return Sk.generic.getAttr.call(this,I)||this.$lookup(I)}function g(){this.js$wrapped.clear()}function t(){return Sk.misceval.callsimOrSuspendArray(Sk.builtin.dict,\n[this])}function l(){return this.js$wrapped.size}function q(I){I=d(I,J);if(this.js$wrapped.has(I))return this.proxy$getItem(I)}function w(I){I=d(I,J);if(this.js$wrapped.has(I)){const T=this.proxy$getItem(I);this.js$wrapped.delete(I);return T}}Sk.ffi={remapToPy:a,remapToJs:d,remapToJsOrWrap:function(I){return d(I,J)},toPy:a,toJs:d,isTrue:function(I){return null!=I&&I.nb$bool?I.nb$bool():I.sq$length?0!==I.sq$length():!!I},toJsString:function(I){return String(I)},toJsNumber:function(I){return Number(I)},\ntoJsArray:c,toJsHashMap:e,toPyDict:f,toPyFloat:function(I){return new Sk.builtin.float_(Number(I))},toPyInt:function(I){if(\"number\"===typeof I)return I=Math.trunc(I),Math.abs(I)a(Z,T)))},toPySet:h,numberToPy:k,proxy:b};const x=Object.prototype,v=Function.prototype,C=Map.prototype,E=Set.prototype,L=/^-?\\d+$/,z=new WeakMap,G=new WeakMap,K=I=>b(I),S=I=>Object.isFrozen(I)?\np(I,r):b(I),U=I=>String(I),r={arrayHook:S,dictHook:K,unhandledHook:U,setHook:K,mapHook:K},y=(I,T)=>({dictHook:K,funcHook:Z=>b(Z,{bound:I,name:T}),unhandledHook:U,arrayHook:S,setHook:K,mapHook:K}),F=I=>({dictHook:K,proxyHook:T=>b(T,{name:I}),arrayHook:S,setHook:K,mapHook:K}),J={unhandledHook:I=>{var T=z.get(I);if(T)return T;T={v:I,$isPyWrapped:!0,unwrap:()=>I};if(void 0===I.tp$call)return z.set(I,T),T;if(I.ob$type===Sk.builtin.method){var Z=I.im_self,B=I.im_func;let u=G.get(Z);void 0===u&&(u=new Map,\nG.set(Z,u));Z=u.get(B);if(void 0===Z)Z=I,u.set(B,I);else if(I=Z,B=z.get(I))return B}B=(...u)=>{u=u.map(H=>a(H,r));let A=Sk.misceval.tryCatch(()=>Sk.misceval.chain(I.tp$call(u),H=>d(H,J)),H=>{if(Sk.uncaughtException)Sk.uncaughtException(H);else throw H;});for(;A instanceof Sk.misceval.Suspension;){if(!A.optional||A.data&&\"Sk.debug\"===A.data.type&&\"Sk.debug\"in Sk.misceval.defaultHandlers)return Sk.misceval.asyncToPromise(()=>A);A=A.resume()}return A};z.set(I,Object.assign(B,T));return B},arrayHook:I=>\nI[qa]||I.map(T=>d(T,J))};D={__dir__:{$meth:function(){const I=[];for(var T=this.js$wrapped;null!=T&&T!==x&&T!==v;)I.push(...Object.getOwnPropertyNames(T)),T=Object.getPrototypeOf(T);T=c(Sk.misceval.callsimArray(Sk.builtin.type.prototype.__dir__,[this.ob$type]));return new p(new Set([...T,...I]))},$flags:{NoArgs:!0}}};const Q=Sk.abstr.buildNativeClass(\"Proxy\",{constructor:function(I,T){if(void 0===I)throw new Sk.builtin.TypeError(\"Proxy cannot be called from python\");this.js$wrapped=I;this.$module=\nnull;this.$methods=Object.create(null);this.in$repr=!1;T||(T={});Object.defineProperties(this,this.memoized$slots);\"function\"===typeof I?(this.is$callable=!0,this.$bound=T.bound,this.$name=T.name||I.name||\"(native JS)\",2>=this.$name.length&&(this.$name+=\" (native JS)\")):(this.is$callable=!1,delete this.is$type,this.is$type=!1,this.$name=T.name)},slots:{tp$doc:\"proxy for a javascript object\",tp$hash(){return Sk.builtin.object.prototype.tp$hash.call(this.js$wrapped)},tp$getattr(I){return this.$lookup(I)||\nSk.generic.getAttr.call(this,I)},tp$setattr:m,$r(){if(this.is$callable){if(this.is$type||!this.$bound)return new Sk.builtin.str(\"<\"+this.tp$name+\" '\"+this.$name+\"'>\");var I=Sk.misceval.objectRepr(b(this.$bound));return new Sk.builtin.str(\"\")}if(this.js$proto===x){if(this.in$repr)return new Sk.builtin.str(\"{...}\");this.in$repr=!0;I=Object.entries(this.js$wrapped).map(T=>{var [Z,B]=T;B=a(B,y(this.js$wrapped,Z));return\"'\"+Z+\"': \"+Sk.misceval.objectRepr(B)});\nI=new Sk.builtin.str(\"proxyobject({\"+I.join(\", \")+\"})\");this.in$repr=!1;return I}return new Sk.builtin.str(\"<\"+this.tp$name+\" \"+(\"proxyobject\"===this.tp$name?\"object\":\"proxyobject\")+\">\")},tp$as_sequence_or_mapping:!0,mp$subscript(I){const T=this.$lookup(I);if(void 0===T)throw new Sk.builtin.LookupError(I);return T},mp$ass_subscript(I,T){return this.tp$setattr(I,T)},sq$contains(I){return d(I)in this.js$wrapped},ob$eq(I){return this.js$wrapped===I.js$wrapped},ob$ne(I){return this.js$wrapped!==I.js$wrapped},\ntp$as_number:!0,nb$bool(){return this.js$proto===x?0new Sk.builtin.str(I)))},$flags:{NoArgs:!0}},get:{$meth(I,T){return this.$lookup(I)||T||Sk.builtin.none.none$},$flags:{MinArgs:1,MaxArgs:2}}}),getsets:{__class__:{$get(){return a(this.js$wrapped.constructor,r)},$set(){throw new Sk.builtin.TypeError(\"not writable\");\n}},__name__:{$get(){return new Sk.builtin.str(this.$name)}},__module__:{$get(){return this.$module||Sk.builtin.none.none$},$set(I){this.$module=I}}},proto:{valueOf(){return this.js$wrapped},$new(I,T){Sk.abstr.checkNoKwargs(\"__new__\",T);return a(new this.js$wrapped(...I.map(Z=>d(Z,J))),F(this.$name))},$call(I,T){Sk.abstr.checkNoKwargs(\"__call__\",T);return Sk.misceval.chain(this.js$wrapped.apply(this.$bound,I.map(Z=>d(Z,J))),Z=>Z instanceof Promise?Sk.misceval.promiseToSuspension(Z):Z,Z=>a(Z,r))},$lookup(I){I=\nI.toString();const T=this.js$wrapped[I];if(void 0!==T)return null!==T&&\"object\"===typeof T&&T.window===T&&null===Object.getPrototypeOf(T)?b(T,{name:\"CrossOriginWindow\"}):a(T,y(this.js$wrapped,I));if(I in this.js$wrapped)return Sk.builtin.none.none$},memoized$slots:{js$proto:{configurable:!0,get(){delete this.js$proto;return this.js$proto=Object.getPrototypeOf(this.js$wrapped)}},tp$iter:{configurable:!0,get(){delete this.tp$iter;return void 0!==this.js$wrapped[Symbol.iterator]?this.tp$iter=()=>b(this.js$wrapped[Symbol.iterator]()):\nthis.tp$iter=()=>{throw new Sk.builtin.TypeError(Sk.misceval.objectRepr(this)+\" is not iterable\");}}},tp$iternext:{configurable:!0,get(){delete this.tp$iternext;if(void 0!==this.js$wrapped.next)return this.tp$iternext=()=>{const I=this.js$wrapped.next().value;return I&&a(I,r)}}},sq$length:{configurable:!0,get(){delete this.sq$length;if(!this.is$callable&&void 0!==this.js$wrapped.length)return this.sq$length=()=>this.js$wrapped.length}},tp$call:{configurable:!0,get(){delete this.tp$call;if(this.is$callable)return this.tp$call=\nthis.is$type?this.$new:this.$call}},tp$name:{configurable:!0,get(){delete this.tp$name;if(this.is$callable)return this.tp$name=this.is$type?\"proxyclass\":this.$bound?\"proxymethod\":\"proxyfunction\";{const I=this.js$wrapped;let T=I[Symbol.toStringTag]||this.$name||I.constructor&&I.constructor.name||\"proxyobject\";\"Object\"===T?T=\"proxyobject\":2>=T.length&&(T=b(I.constructor).$name);return this.tp$name=T}}},is$type:{configurable:!0,get(){delete this.is$type;var I=this.js$wrapped;const T=I.prototype;if(void 0===\nT)return this.is$type=I===Sk.global.Proxy;{const Z=N.call(I).match(ja);I=null===Z?null:\"class\"===Z[0]?!0:!W.has(I)}return!0===I?this.is$type=!0:!1===I?this.is$type=!1:1{var [T,Z]=I;return[a(T,r),a(Z,r)]})},valueOf:Q.prototype.valueOf},flags:{sk$unacceptableBase:!0}}),ba=Sk.abstr.buildNativeClass(\"InternalProxySet\",\n{base:Sk.builtin.dict,constructor:function(I){Sk.builtin.dict.call(this);this.js$wrapped=I},proto:{proxy$getItem(I){return!0},mp$lookup:q,dict$setItem(I,T){this.js$wrapped.add(d(I,J))},dict$clear:g,pop$item:w,dict$copy:t,get$size:l,$items(){return[...this.js$wrapped].map(I=>[a(I,r),!0])}},flags:{sk$unacceptableBase:!0}}),ia=Sk.abstr.buildNativeClass(\"ProxySet\",{base:Sk.builtin.set,constructor:function(I){Sk.builtin.set.call(this);this.v=new ba(I);this.js$wrapped=I},slots:{tp$getattr:n},methods:D,\nproto:{$lookup:Q.prototype.$lookup,valueOf:Q.prototype.valueOf},flags:{sk$unacceptableBase:!0}}),oa={apply(I,T,Z){Z=c(Z,J);return I.apply(T,Z)}},pa={},la=Array.prototype,qa=Symbol(\"$proxy\"),na={get(I,T){if(T===qa)return I;const Z=I[T];return T in la?\"function\"===typeof Z?pa[T]||(pa[T]=new Proxy(Z,oa)):Z:void 0!==Z||T in I?a(Z,r):Z},set(I,T,Z){I[T]=d(Z,J);return!0}},aa=Sk.abstr.buildNativeClass(\"ProxyList\",{base:Sk.builtin.list,constructor:function(I){Sk.builtin.list.call(this,I);this.js$wrapped=this.v;\nthis.v=new Proxy(this.v,na)},slots:{tp$getattr:n,tp$setattr:m,$r(){return new Sk.builtin.str(\"proxylist(\"+Sk.builtin.list.prototype.$r.call(this)+\")\")}},methods:D,proto:{$lookup:Q.prototype.$lookup}}),ja=/^class|^function[a-zA-Z\\d\\(\\)\\{\\s]+\\[native code\\]\\s+\\}$/,N=v.toString,W=new Set([Number,String,Symbol,Boolean]);\"undefined\"!==typeof Sk.global.BigInt&&W.add(Sk.global.BigInt);const ea=Sk.abstr.buildNativeClass(\"ProxySymbol\",{constructor:function(I){this.v=I},slots:{$r(){return new Sk.builtin.str(this.toString())}},\nproto:{toString(){return this.v.toString()},valueOf(){return this.v}}})},function(D,R){function a(k,p,h){k=void 0===k?k:Sk.misceval.asIndexOrThrow(k);p=void 0===p?p:Sk.misceval.asIndexOrThrow(p);h=void 0===h?h:Sk.misceval.asIndexOrThrow(h);if(void 0===p&&void 0===h)p=k,k=0,h=1;else if(void 0===h)h=1;else if(0===h)throw new Sk.builtin.ValueError(\"range() step argument must not be zero\");const f=[];if(\"number\"===typeof k&&\"number\"===typeof p&&\"number\"===typeof h)if(0p;b+=h)f.push(new Sk.builtin.int_(b));else{k=b=JSBI.BigInt(k);h=JSBI.BigInt(h);p=JSBI.BigInt(p);if(JSBI.greaterThan(h,JSBI.__ZERO))for(;JSBI.lessThan(b,p);)f.push(new Sk.builtin.int_(d(b))),b=JSBI.add(b,h);else for(;JSBI.greaterThan(b,p);)f.push(new Sk.builtin.int_(d(b))),b=JSBI.add(b,h);k=d(k);h=d(h);p=d(p)}return new Sk.builtin.range_(k,p,h,f)}function d(k){return JSBI.lessThan(k,JSBI.__MAX_SAFE)&&JSBI.greaterThan(k,JSBI.__MIN_SAFE)?JSBI.toNumber(k):k}Sk.builtin.range_=Sk.abstr.buildNativeClass(\"range\",\n{constructor:function(k,p,h,f){this.start=k;this.stop=p;this.step=h;this.v=f},slots:{tp$getattr:Sk.generic.getAttr,tp$as_sequence_or_mapping:!0,tp$doc:\"range(stop) -> range object\\nrange(start, stop[, step]) -> range object\\n\\nReturn an object that produces a sequence of integers from start (inclusive)\\nto stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\\nstart defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\\nThese are exactly the valid indices for a list of 4 elements.\\nWhen step is given, it specifies the increment (or decrement).\",\ntp$new(k,p){Sk.abstr.checkNoKwargs(\"range\",p);Sk.abstr.checkArgsLen(\"range\",k,1,3);return a(k[0],k[1],k[2])},$r(){let k=\"range(\"+this.start+\", \"+this.stop;1!=this.step&&(k+=\", \"+this.step);return new Sk.builtin.str(k+\")\")},tp$richcompare(k,p){if(\"Eq\"!==p&&\"NotEq\"!==p||k.ob$type!==Sk.builtin.range_)return Sk.builtin.NotImplemented.NotImplemented$;k=new Sk.builtin.list(k.v);return(new Sk.builtin.list(this.v)).tp$richcompare(k,p)},tp$iter(){return new c(this)},nb$bool(){return 0!==this.v.length},sq$contains(k){const p=\nthis.v;for(let h=0;hk&&(k=this.v.length+k);if(0>k||k>=this.v.length)throw new Sk.builtin.IndexError(\"range object index out of range\");return this.v[k]}if(k.constructor===Sk.builtin.slice){const p=[],h=this.v;k.sssiter$(h.length,n=>{p.push(h[n])});let {start:f,stop:b,step:m}=k.slice$indices(h.length);f=Sk.misceval.asIndex(h[f])||\nthis.start;b=Sk.misceval.asIndex(h[b])||this.stop;m=\"number\"===typeof this.step?m*this.step:JSBI.multiply(this.step,JSBI.BigInt(m));return new Sk.builtin.range_(f,b,m,p)}throw new Sk.builtin.TypeError(\"range indices must be integers or slices, not \"+Sk.abstr.typeName(k));}},getsets:{start:{$get(){return new Sk.builtin.int_(this.start)}},step:{$get(){return new Sk.builtin.int_(this.step)}},stop:{$get(){return new Sk.builtin.int_(this.stop)}}},methods:{__reversed__:{$meth(){return new e(this)},$flags:{NoArgs:!0},\n$textsig:null,$doc:\"Return a reverse iterator.\"},count:{$meth(k){let p=0;for(let h=0;h integer -- return number of occurrences of value\"},index:{$meth(k){for(let p=0;p integer -- return index of value.\\nRaise ValueError if the value is not present.\"}},proto:{sk$asarray(){return this.v.slice(0)}},flags:{sk$unacceptableBase:!0}});var c=Sk.abstr.buildIteratorClass(\"range_iterator\",{constructor:function(k){this.$index=0;this.$seq=k.v},iternext(){return this.$seq[this.$index++]},methods:{__length_hint__:Sk.generic.iterLengthHintWithArrayMethodDef},flags:{sk$unacceptableBase:!0}}),e=\nSk.abstr.buildIteratorClass(\"range_reverseiterator\",{constructor:function(k){this.$seq=k.v;this.$index=this.$seq.length-1},iternext(){return this.$seq[this.$index--]},methods:{__length_hint__:Sk.generic.iterReverseLengthHintMethodDef},flags:{sk$unacceptableBase:!0}});Sk.builtin.range=Sk.builtin.xrange=function(k,p,h){k=a(k,p,h);return new Sk.builtin.list(k.v)}},function(D,R){Sk.builtin.enumerate=Sk.abstr.buildIteratorClass(\"enumerate\",{constructor:function(a,d){if(!(this instanceof Sk.builtin.enumerate))throw TypeError(\"Failed to construct 'enumerate': Please use the 'new' operator\");\nthis.$iterable=a;this.$index=d;return this},iternext(a){const d=Sk.misceval.chain(this.$iterable.tp$iternext(a),c=>{if(void 0!==c)return new Sk.builtin.tuple([new Sk.builtin.int_(this.$index++),c])});return a?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)},slots:{tp$doc:\"Return an enumerate object.\\n\\n iterable\\n an object supporting iteration\\n\\nThe enumerate object yields pairs containing a count (from start, which\\ndefaults to zero) and a value yielded by the iterable argument.\\n\\nenumerate is useful for obtaining an indexed list:\\n (0, seq[0]), (1, seq[1]), (2, seq[2]), ...\",\ntp$new(a,d){let [c,e]=Sk.abstr.copyKeywordsToNamedArgs(\"enumerate\",[\"iterable\",\"start\"],a,d,[new Sk.builtin.int_(0)]);c=Sk.abstr.iter(c);e=Sk.misceval.asIndexOrThrow(e);if(this===Sk.builtin.enumerate.prototype)return new Sk.builtin.enumerate(c,e);a=new this.constructor;Sk.builtin.enumerate.call(a,c,e);return a}},classmethods:Sk.generic.classGetItem});Sk.exportSymbol(\"Sk.builtin.enumerate\",Sk.builtin.enumerate)},function(D,R){Sk.builtin.filter_=Sk.abstr.buildIteratorClass(\"filter\",{constructor:function(a,\nd){this.$func=a;this.$iterable=d},iternext(a){const d=Sk.misceval.iterFor(this.$iterable,c=>Sk.misceval.chain(this.check$filter(c),e=>e?new Sk.misceval.Break(e):void 0));return a?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)},slots:{tp$doc:\"Return an iterator yielding those items of iterable for which function(item)\\nis true. If function is None, return the items that are true.\",tp$new(a,d){let [c,e]=Sk.abstr.copyKeywordsToNamedArgs(\"filter\",[\"predicate\",\"iterable\"],a,d,[]);c=Sk.builtin.checkNone(c)?\nnull:c;e=Sk.abstr.iter(e);if(this===Sk.builtin.filter_.prototype)return new Sk.builtin.filter_(c,e);a=new this.constructor;Sk.builtin.filter_.call(a,c,e);return a}},proto:{check$filter(a){let d;d=null===this.$func?a:Sk.misceval.callsimOrSuspendArray(this.$func,[a]);return Sk.misceval.chain(d,c=>Sk.misceval.isTrue(c)?a:void 0)}}});Sk.exportSymbol(\"Sk.builtin.filter_\",Sk.builtin.filter_)},function(D,R){Sk.builtin.map_=Sk.abstr.buildIteratorClass(\"map\",{constructor:function(a,d){this.$func=a;this.$iters=\nd},iternext(a){const d=[],c=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,e=>Sk.misceval.chain(e.tp$iternext(a),k=>{if(void 0===k)return new Sk.misceval.Break(!0);d.push(k)})),e=>e?void 0:Sk.misceval.callsimOrSuspendArray(this.$func,d));return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:\"map(func, *iterables) --\\x3e map object\\n\\nMake an iterator that computes the function using arguments from\\neach of the iterables. Stops when the shortest iterable is exhausted.\",tp$new(a,\nd){this===Sk.builtin.map_.prototype&&Sk.abstr.checkNoKwargs(\"map\",d);Sk.abstr.checkArgsLen(\"map\",a,2);d=a[0];const c=[];for(let e=1;ethis.$idx)){var d=Sk.misceval.tryCatch(()=>Sk.abstr.objectGetItem(this.$seq,new Sk.builtin.int_(this.$idx--),a),c=>{if(c instanceof Sk.builtin.IndexError)this.$idx=-1;else throw c;});return a?d:Sk.misceval.retryOptionalSuspensionOrThrow(d)}},slots:{tp$doc:\"Return a reverse iterator over the values of the given sequence.\",tp$new(a,d){this===Sk.builtin.reversed.prototype&&Sk.abstr.checkNoKwargs(\"reversed\",d);Sk.abstr.checkArgsLen(\"reversed\",a,1,1);a=a[0];d=Sk.abstr.lookupSpecial(a,\nSk.builtin.str.$reversed);if(void 0!==d)return Sk.misceval.callsimArray(d,[]);if(!Sk.builtin.checkSequence(a)||void 0===Sk.abstr.lookupSpecial(a,Sk.builtin.str.$len))throw new Sk.builtin.TypeError(\"'\"+Sk.abstr.typeName(a)+\"' object is not a sequence\");if(this===Sk.builtin.reversed.prototype)return new Sk.builtin.reversed(a);d=new this.constructor;Sk.builtin.reversed.call(d,a);return d}},methods:{__length_hint__:{$meth:function(){return 0<=this.$idx?new Sk.builtin.int_(this.$idx):new Sk.builtin.int_(0)},\n$flags:{NoArgs:!0}}}})},function(D,R){Sk.builtin.zip_=Sk.abstr.buildIteratorClass(\"zip\",{constructor:function(a){this.$iters=a;0===a.length&&(this.tp$iternext=()=>{})},iternext(a){const d=[],c=Sk.misceval.chain(Sk.misceval.iterArray(this.$iters,e=>Sk.misceval.chain(e.tp$iternext(a),k=>{if(void 0===k)return new Sk.misceval.Break(!0);d.push(k)})),e=>e?void 0:new Sk.builtin.tuple(d));return a?c:Sk.misceval.retryOptionalSuspensionOrThrow(c)},slots:{tp$doc:\"zip(iter1 [,iter2 [...]]) --\\x3e zip object\\n\\nReturn a zip object whose .__next__() method returns a tuple where\\nthe i-th element comes from the i-th iterable argument. The .__next__()\\nmethod continues until the shortest iterable in the argument sequence\\nis exhausted and then it raises StopIteration.\",\ntp$new(a,d){this===Sk.builtin.zip_.prototype&&Sk.abstr.checkNoKwargs(\"zip\",d);d=[];for(let c=0;c\":a.T_RARROW,\".\":a.T_DOT,\"...\":a.T_ELLIPSIS,\"/\":a.T_SLASH,\"//\":a.T_DOUBLESLASH,\"//=\":a.T_DOUBLESLASHEQUAL,\"/=\":a.T_SLASHEQUAL,\":\":a.T_COLON,\";\":a.T_SEMI,\"<\":a.T_LESS,\"<<\":a.T_LEFTSHIFT,\"<<=\":a.T_LEFTSHIFTEQUAL,\"<=\":a.T_LESSEQUAL,\"=\":a.T_EQUAL,\"==\":a.T_EQEQUAL,\">\":a.T_GREATER,\">=\":a.T_GREATEREQUAL,\">>\":a.T_RIGHTSHIFT,\">>=\":a.T_RIGHTSHIFTEQUAL,\"@\":a.T_AT,\"@=\":a.T_ATEQUAL,\"[\":a.T_LSQB,\"]\":a.T_RSQB,\"^\":a.T_CIRCUMFLEX,\"^=\":a.T_CIRCUMFLEXEQUAL,\"{\":a.T_LBRACE,\n\"|\":a.T_VBAR,\"|=\":a.T_VBAREQUAL,\"}\":a.T_RBRACE,\"~\":a.T_TILDE};var d={};(function(){for(var c in a)d[a[c]]=c})();[\"tok_name\",\"ISTERMINAL\",\"ISNONTERMINAL\",\"ISEOF\"].concat(Object.keys(d).map(function(c){return d[c]}));Sk.token={};Sk.token.tokens=a;Sk.token.tok_name=d;Sk.token.EXACT_TOKEN_TYPES=D;Sk.token.ISTERMINAL=function(c){return c=a.T_NT_OFFSET};Sk.token.ISEOF=function(c){return c==a.T_ENDMARKER};Sk.exportSymbol(\"Sk.token\",Sk.token);Sk.exportSymbol(\"Sk.token.tokens\",\nSk.token.tokens);Sk.exportSymbol(\"Sk.token.tok_name\",Sk.token.tok_name);Sk.exportSymbol(\"Sk.token.EXACT_TOKEN_TYPES\");Sk.exportSymbol(\"Sk.token.ISTERMINAL\",Sk.token.ISTERMINAL);Sk.exportSymbol(\"Sk.token.ISNONTERMINAL\",Sk.token.ISNONTERMINAL);Sk.exportSymbol(\"Sk.token.ISEOF\",Sk.token.ISEOF)},function(D,R,a){function d(la,qa,na,aa,ja){this.type=la;this.string=qa;this.start=na;this.end=aa;this.line=ja}function c(la){return\"(\"+Array.prototype.slice.call(arguments).join(\"|\")+\")\"}function e(la){return c.apply(null,\narguments)+\"?\"}function k(la,qa){for(var na=la.length;na--;)if(la[na]===qa)return!0;return!1}function p(la){la=la.normalize(\"NFKC\");return S.test(la)}function h(){return\" FR RF Br BR Fr r B R b bR f rb rB F Rf U rF u RB br fR fr rf Rb\".split(\" \")}function f(la){la?delete Sk.token.EXACT_TOKEN_TYPES[\"<>\"]:Sk.token.EXACT_TOKEN_TYPES[\"<>\"]=Sk.token.tokens.T_NOTEQUAL;y=Object.keys(Sk.token.EXACT_TOKEN_TYPES).sort();F=c.apply(this,y.reverse().map(function(qa){return qa&&t.test(qa)?qa.replace(g,\"\\\\$&\"):\nqa}));J=c(\"\\\\r?\\\\n\",F)}a.r(R);D=a(1);var b=Sk.token.tokens;const m=Sk.builtin.SyntaxError,n=Sk.builtin.SyntaxError;d.prototype.exact_type=function(){return this.type==b.T_OP&&this.string in Sk.token.EXACT_TOKEN_TYPES?Sk.token.EXACT_TOKEN_TYPES[this.string]:this.type};var g=/[\\\\^$.*+?()[\\]{}|]/g,t=RegExp(g.source);const {Lu:l,Ll:q,Lt:w,Lm:x,Lo:v,Nl:C,Mn:E,Mc:L,Nd:z,Pc:G}=D[\"default\"];D=l+q+w+x+v+C+\"_\\\\u1885-\\\\u1886\\\\u2118\\\\u212E\\\\u309B-\\\\u309C\";const K=\"[\"+D+\"]+[\"+(D+E+L+z+G+\"\\\\u00B7\\\\u0387\\\\u1369-\\\\u1371\\\\u19DA]*\"),\nS=new RegExp(\"^\"+K+\"$\");Sk.token.isIdentifier=p;(function(la){return c.apply(null,arguments)+\"*\"})(\"\\\\\\\\\\\\r?\\\\n[ \\\\f\\\\t]*\");e(\"#[^\\\\r\\\\n]*\");D=c(\"[0-9](?:_?[0-9])*\\\\.(?:[0-9](?:_?[0-9])*)?\",\"\\\\.[0-9](?:_?[0-9])*\")+e(\"[eE][-+]?[0-9](?:_?[0-9])*\");var U=c(D,\"[0-9](?:_?[0-9])*[eE][-+]?[0-9](?:_?[0-9])*\"),r=c(\"[0-9](?:_?[0-9])*[jJ]\",U+\"[jJ]\");D=c.apply(null,h());R=c(D+\"'''\",D+'\"\"\"');c(D+\"'[^\\\\n'\\\\\\\\]*(?:\\\\\\\\.[^\\\\n'\\\\\\\\]*)*'\",D+'\"[^\\\\n\"\\\\\\\\]*(?:\\\\\\\\.[^\\\\n\"\\\\\\\\]*)*\"');var y,F,J;f(!0);Sk.token.setupTokens=\nf;var Q=c(D+\"'[^\\\\n'\\\\\\\\]*(?:\\\\\\\\.[^\\\\n'\\\\\\\\]*)*\"+c(\"'\",\"\\\\\\\\\\\\r?\\\\n\"),D+'\"[^\\\\n\"\\\\\\\\]*(?:\\\\\\\\.[^\\\\n\"\\\\\\\\]*)*'+c('\"',\"\\\\\\\\\\\\r?\\\\n\")),X=c(\"\\\\\\\\\\\\r?\\\\n|$\",\"#[^\\\\r\\\\n]*\",R),ba={};D=h();for(let la of D)ba[la+\"'\"]=\"^[^'\\\\\\\\]*(?:\\\\\\\\.[^'\\\\\\\\]*)*'\",ba[la+'\"']='^[^\"\\\\\\\\]*(?:\\\\\\\\.[^\"\\\\\\\\]*)*\"',ba[la+\"'''\"]=\"^[^'\\\\\\\\]*(?:(?:\\\\\\\\.|'(?!''))[^'\\\\\\\\]*)*'''\",ba[la+'\"\"\"']='^[^\"\\\\\\\\]*(?:(?:\\\\\\\\.|\"(?!\"\"))[^\"\\\\\\\\]*)*\"\"\"';let ia=[],oa=[];for(let la of D)ia.push(la+'\"'),ia.push(la+\"'\"),oa.push(la+'\"\"\"'),oa.push(la+\"'''\");\nvar pa=new Map;Sk._tokenize=function(la,qa,na,aa){var ja=Sk.__future__.python3;if(pa.has(ja))ja=pa.get(ja);else{var N=ja?\"\":\"(?:L?)\";N=c(\"0[xX](?:_?[0-9a-fA-F])+\"+N,\"0[bB](?:_?[01])+\"+N,Sk.__future__.silent_octal_literal?\"0([oO]?)(?:_?[0-7])+\"+N:\"0([oO])(?:_?[0-7])+\"+N,\"(?:0(?:_?0)*|[1-9](?:_?[0-9])*)\"+N);N=c(r,U,N);N=\"[ \\\\f\\\\t]*\"+c(X,N,J,Q,K);N=new RegExp(N);pa.set(ja,N);ja=N}var W=N=0,ea=0,I=\"\",T=0,Z=null,B=[0],u,A=void 0,H=void 0,M,O;void 0!==na&&(\"utf-8-sig\"==na&&(na=\"utf-8\"),aa(new d(b.T_ENCODING,\nna,[0,0],[0,0],\"\")));for(var P=na=\"\";;){try{na=P,P=qa()}catch(ha){P=\"\"}N+=1;var V=0,ca=P.length;if(I){if(!P)throw new m(\"EOF in multi-line string\",la,H[0],H[1]);A.lastIndex=0;var Y=A.exec(P);if(Y)V=M=Y[0].length,aa(new d(b.T_STRING,I+P.substring(0,M),H,[N,M],Z+P)),I=\"\",T=0,Z=null;else{T&&\"\\\\\\n\"!==P.substring(P.length-2)&&\"\\\\\\r\\n\"!==P.substring(P.length-3)?(aa(new d(b.T_ERRORTOKEN,I+P,H,[N,P.length],Z)),I=\"\",Z=null):(I+=P,Z+=P);continue}}else if(0!=W||ea){if(!P)throw new m(\"EOF in multi-line statement\",\nla,N,0);ea=0}else{if(!P)break;for(u=0;VB[B.length-1]&&(B.push(u),aa(new d(b.T_INDENT,P.substring(V),[N,0],[N,V],P)));for(;u<\nB[B.length-1];){if(!k(B,u))throw new n(\"unindent does not match any outer indentation level\",la,N,V);B=B.slice(0,-1);aa(new d(b.T_DEDENT,\"\",[N,V],[N,V],P))}}for(;V\":Sk.token.tokens.T_GREATER,\"=\":Sk.token.tokens.T_EQUAL,\".\":Sk.token.tokens.T_DOT,\"%\":Sk.token.tokens.T_PERCENT,\"`\":Sk.token.tokens.T_BACKQUOTE,\"{\":Sk.token.tokens.T_LBRACE,\"}\":Sk.token.tokens.T_RBRACE,\"@\":Sk.token.tokens.T_AT,\"@=\":Sk.token.tokens.T_ATEQUAL,\n\"==\":Sk.token.tokens.T_EQEQUAL,\"!=\":Sk.token.tokens.T_NOTEQUAL,\"<>\":Sk.token.tokens.T_NOTEQUAL,\"<=\":Sk.token.tokens.T_LESSEQUAL,\">=\":Sk.token.tokens.T_GREATEREQUAL,\"~\":Sk.token.tokens.T_TILDE,\"^\":Sk.token.tokens.T_CIRCUMFLEX,\"<<\":Sk.token.tokens.T_LEFTSHIFT,\">>\":Sk.token.tokens.T_RIGHTSHIFT,\"**\":Sk.token.tokens.T_DOUBLESTAR,\"+=\":Sk.token.tokens.T_PLUSEQUAL,\"-=\":Sk.token.tokens.T_MINEQUAL,\"*=\":Sk.token.tokens.T_STAREQUAL,\"/=\":Sk.token.tokens.T_SLASHEQUAL,\"%=\":Sk.token.tokens.T_PERCENTEQUAL,\"&=\":Sk.token.tokens.T_AMPEREQUAL,\n\"|=\":Sk.token.tokens.T_VBAREQUAL,\"^=\":Sk.token.tokens.T_CIRCUMFLEXEQUAL,\"<<=\":Sk.token.tokens.T_LEFTSHIFTEQUAL,\">>=\":Sk.token.tokens.T_RIGHTSHIFTEQUAL,\"**=\":Sk.token.tokens.T_DOUBLESTAREQUAL,\"//\":Sk.token.tokens.T_DOUBLESLASH,\"//=\":Sk.token.tokens.T_DOUBLESLASHEQUAL,\"->\":Sk.token.tokens.T_RARROW,\"...\":Sk.token.tokens.T_ELLIPSIS};Sk.ParseTables={sym:{and_expr:257,and_test:258,annassign:259,arglist:260,argument:261,arith_expr:262,assert_stmt:263,async_funcdef:264,async_stmt:265,atom:266,atom_expr:267,\naugassign:268,break_stmt:269,classdef:270,comp_for:271,comp_if:272,comp_iter:273,comp_op:274,comparison:275,compound_stmt:276,continue_stmt:277,debugger_stmt:278,decorated:279,decorator:280,decorators:281,del_stmt:282,dictorsetmaker:283,dotted_as_name:284,dotted_as_names:285,dotted_name:286,encoding_decl:287,eval_input:288,except_clause:289,expr:290,expr_stmt:291,exprlist:292,factor:293,file_input:294,flow_stmt:295,for_stmt:296,funcdef:297,global_stmt:298,if_stmt:299,import_as_name:300,import_as_names:301,\nimport_from:302,import_name:303,import_stmt:304,lambdef:305,lambdef_nocond:306,nonlocal_stmt:307,not_test:308,or_test:309,parameters:310,pass_stmt:311,power:312,print_stmt:313,raise_stmt:314,return_stmt:315,shift_expr:316,simple_stmt:317,single_input:256,sliceop:318,small_stmt:319,star_expr:320,stmt:321,subscript:322,subscriptlist:323,suite:324,term:325,test:326,test_nocond:327,testlist:328,testlist_comp:329,testlist_star_expr:330,tfpdef:331,trailer:332,try_stmt:333,typedargslist:334,varargslist:335,\nvfpdef:336,while_stmt:337,with_item:338,with_stmt:339,xor_expr:340,yield_arg:341,yield_expr:342,yield_stmt:343},number2symbol:{256:\"single_input\",257:\"and_expr\",258:\"and_test\",259:\"annassign\",260:\"arglist\",261:\"argument\",262:\"arith_expr\",263:\"assert_stmt\",264:\"async_funcdef\",265:\"async_stmt\",266:\"atom\",267:\"atom_expr\",268:\"augassign\",269:\"break_stmt\",270:\"classdef\",271:\"comp_for\",272:\"comp_if\",273:\"comp_iter\",274:\"comp_op\",275:\"comparison\",276:\"compound_stmt\",277:\"continue_stmt\",278:\"debugger_stmt\",\n279:\"decorated\",280:\"decorator\",281:\"decorators\",282:\"del_stmt\",283:\"dictorsetmaker\",284:\"dotted_as_name\",285:\"dotted_as_names\",286:\"dotted_name\",287:\"encoding_decl\",288:\"eval_input\",289:\"except_clause\",290:\"expr\",291:\"expr_stmt\",292:\"exprlist\",293:\"factor\",294:\"file_input\",295:\"flow_stmt\",296:\"for_stmt\",297:\"funcdef\",298:\"global_stmt\",299:\"if_stmt\",300:\"import_as_name\",301:\"import_as_names\",302:\"import_from\",303:\"import_name\",304:\"import_stmt\",305:\"lambdef\",306:\"lambdef_nocond\",307:\"nonlocal_stmt\",\n308:\"not_test\",309:\"or_test\",310:\"parameters\",311:\"pass_stmt\",312:\"power\",313:\"print_stmt\",314:\"raise_stmt\",315:\"return_stmt\",316:\"shift_expr\",317:\"simple_stmt\",318:\"sliceop\",319:\"small_stmt\",320:\"star_expr\",321:\"stmt\",322:\"subscript\",323:\"subscriptlist\",324:\"suite\",325:\"term\",326:\"test\",327:\"test_nocond\",328:\"testlist\",329:\"testlist_comp\",330:\"testlist_star_expr\",331:\"tfpdef\",332:\"trailer\",333:\"try_stmt\",334:\"typedargslist\",335:\"varargslist\",336:\"vfpdef\",337:\"while_stmt\",338:\"with_item\",339:\"with_stmt\",\n340:\"xor_expr\",341:\"yield_arg\",342:\"yield_expr\",343:\"yield_stmt\"},dfas:{256:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],257:[[[[44,1]],[[45,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],258:[[[[46,1]],[[47,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,\n35:1,38:1,43:1}],259:[[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],{48:1}],260:[[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],261:[[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],262:[[[[55,1]],[[30,0],[43,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],263:[[[[24,1]],[[49,\n2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],{24:1}],264:[[[[10,1]],[[56,2]],[[0,2]]],{10:1}],265:[[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],{10:1}],266:[[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,33:1,35:1,38:1}],267:[[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,35:1,38:1}],268:[[[[67,1],[68,1],[69,1],\n[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],{67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:1,75:1,76:1,77:1,78:1,79:1}],269:[[[[39,1]],[[0,1]]],{39:1}],270:[[[[13,1]],[[25,2]],[[48,3],[35,4]],[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],{13:1}],271:[[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],{10:1,34:1}],272:[[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],{37:1}],273:[[[[87,1],[54,1]],[[0,1]]],{10:1,34:1,37:1}],274:[[[[88,1],[89,1],\n[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],{8:1,83:1,88:1,89:1,90:1,91:1,92:1,93:1,94:1}],275:[[[[95,1]],[[96,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],276:[[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],{4:1,10:1,13:1,20:1,21:1,34:1,37:1,41:1,42:1}],277:[[[[40,1]],[[0,1]]],{40:1}],278:[[[[17,1]],[[0,1]]],{17:1}],279:[[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],{41:1}],280:[[[[41,1]],\n[[105,2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],{41:1}],281:[[[[106,1]],[[106,1],[0,1]]],{41:1}],282:[[[[27,1]],[[82,2]],[[0,2]]],{27:1}],283:[[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,53:1}],284:[[[[105,1]],[[108,\n2],[0,1]],[[25,3]],[[0,3]]],{25:1}],285:[[[[109,1]],[[52,0],[0,1]]],{25:1}],286:[[[[25,1]],[[110,0],[0,1]]],{25:1}],287:[[[[25,1]],[[0,1]]],{25:1}],288:[[[[111,1]],[[2,1],[112,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],289:[[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],{113:1}],290:[[[[114,1]],[[115,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],291:[[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,\n4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],292:[[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],{6:1,7:1,9:1,11:1,12:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],293:[[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],294:[[[[2,0],[112,1],[121,0]],[[0,1]]],{2:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,\n17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1,112:1}],295:[[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],{5:1,23:1,31:1,39:1,40:1}],296:[[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],{34:1}],297:[[[[4,1]],[[25,2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],{4:1}],298:[[[[26,1]],[[25,2]],[[52,1],[0,2]]],{26:1}],299:[[[[37,1]],[[49,2]],\n[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{37:1}],300:[[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],{25:1}],301:[[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],{25:1}],302:[[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],{36:1}],303:[[[[32,1]],[[133,2]],[[0,2]]],{32:1}],304:[[[[134,1],[135,1]],[[0,1]]],{32:1,36:1}],305:[[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,2]],[[0,4]]],{14:1}],306:[[[[14,1]],\n[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],{14:1}],307:[[[[18,1]],[[25,2]],[[52,1],[0,2]]],{18:1}],308:[[[[8,1],[137,2]],[[46,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],309:[[[[138,1]],[[139,0],[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],310:[[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],{35:1}],311:[[[[28,1]],[[0,1]]],{28:1}],312:[[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],{6:1,7:1,9:1,11:1,12:1,19:1,25:1,29:1,33:1,\n35:1,38:1}],313:[[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],{16:1}],314:[[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],{5:1}],315:[[[[23,1]],[[111,2],[0,1]],[[0,2]]],{23:1}],316:[[[[143,1]],[[144,0],[142,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],317:[[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,\n15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],318:[[[[48,1]],[[49,2],[0,1]],[[0,2]]],{48:1}],319:[[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],{5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],320:[[[[15,1]],[[95,2]],[[0,2]]],{15:1}],321:[[[[1,1],[3,1]],[[0,1]]],{4:1,5:1,6:1,7:1,\n8:1,9:1,10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,41:1,42:1,43:1}],322:[[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],323:[[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1,48:1}],324:[[[[1,1],[2,2]],\n[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],{2:1,5:1,6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,16:1,17:1,18:1,19:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,30:1,31:1,32:1,33:1,35:1,36:1,38:1,39:1,40:1,43:1}],325:[[[[120,1]],[[161,0],[15,0],[162,0],[41,0],[163,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],326:[[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],327:[[[[165,\n1],[84,1]],[[0,1]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],328:[[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],329:[[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],330:[[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,15:1,19:1,\n22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],331:[[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],{25:1}],332:[[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],{35:1,38:1,110:1}],333:[[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],{20:1}],334:[[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,\n5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],335:[[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],\n[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],{15:1,25:1,53:1}],336:[[[[25,1]],[[0,1]]],{25:1}],337:[[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],{21:1}],338:[[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,38:1,43:1}],339:[[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],{42:1}],340:[[[[172,1]],[[173,0],[0,1]]],{6:1,7:1,9:1,11:1,12:1,19:1,22:1,25:1,29:1,30:1,33:1,\n35:1,38:1,43:1}],341:[[[[111,2],[36,1]],[[49,2]],[[0,2]]],{6:1,7:1,8:1,9:1,11:1,12:1,14:1,19:1,22:1,25:1,29:1,30:1,33:1,35:1,36:1,38:1,43:1}],342:[[[[31,1]],[[174,2],[0,1]],[[0,2]]],{31:1}],343:[[[[62,1]],[[0,1]]],{31:1}]},states:[[[[1,1],[2,1],[3,2]],[[0,1]],[[2,1]]],[[[44,1]],[[45,0],[0,1]]],[[[46,1]],[[47,0],[0,1]]],[[[48,1]],[[49,2]],[[50,3],[0,2]],[[49,4]],[[0,4]]],[[[51,1]],[[52,2],[0,1]],[[51,1],[0,2]]],[[[49,1],[15,2],[53,2]],[[50,2],[54,3],[0,1]],[[49,3]],[[0,3]]],[[[55,1]],[[30,0],[43,0],\n[0,1]]],[[[24,1]],[[49,2]],[[52,3],[0,2]],[[49,4]],[[0,4]]],[[[10,1]],[[56,2]],[[0,2]]],[[[10,1]],[[57,2],[56,2],[58,2]],[[0,2]]],[[[6,1],[25,1],[33,1],[9,1],[11,1],[12,2],[35,3],[38,4],[19,1],[7,5]],[[0,1]],[[59,1],[60,6]],[[61,1],[62,7],[63,7]],[[64,1],[63,8]],[[7,5],[0,5]],[[59,1]],[[61,1]],[[64,1]]],[[[29,1],[65,2]],[[65,2]],[[66,2],[0,2]]],[[[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[77,1],[78,1],[79,1]],[[0,1]]],[[[39,1]],[[0,1]]],[[[13,1]],[[25,2]],[[48,3],[35,4]],\n[[80,5]],[[61,6],[81,7]],[[0,5]],[[48,3]],[[61,6]]],[[[10,1],[34,2]],[[34,2]],[[82,3]],[[83,4]],[[84,5]],[[85,6],[0,5]],[[0,6]]],[[[37,1]],[[86,2]],[[85,3],[0,2]],[[0,3]]],[[[87,1],[54,1]],[[0,1]]],[[[88,1],[89,1],[8,2],[90,1],[88,1],[83,1],[91,1],[92,3],[93,1],[94,1]],[[0,1]],[[83,1]],[[8,1],[0,3]]],[[[95,1]],[[96,0],[0,1]]],[[[97,1],[98,1],[58,1],[99,1],[57,1],[100,1],[56,1],[101,1],[102,1]],[[0,1]]],[[[40,1]],[[0,1]]],[[[17,1]],[[0,1]]],[[[103,1]],[[56,2],[104,2],[99,2]],[[0,2]]],[[[41,1]],[[105,\n2]],[[2,4],[35,3]],[[61,5],[81,6]],[[0,4]],[[2,4]],[[61,5]]],[[[106,1]],[[106,1],[0,1]]],[[[27,1]],[[82,2]],[[0,2]]],[[[49,1],[107,2],[53,3]],[[48,4],[54,5],[52,6],[0,1]],[[54,5],[52,6],[0,2]],[[95,7]],[[49,7]],[[0,5]],[[49,8],[107,8],[0,6]],[[54,5],[52,9],[0,7]],[[52,6],[0,8]],[[49,10],[53,11],[0,9]],[[48,12]],[[95,13]],[[49,13]],[[52,9],[0,13]]],[[[105,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[109,1]],[[52,0],[0,1]]],[[[25,1]],[[110,0],[0,1]]],[[[25,1]],[[0,1]]],[[[111,1]],[[2,1],[112,2]],[[0,2]]],\n[[[113,1]],[[49,2],[0,1]],[[108,3],[52,3],[0,2]],[[49,4]],[[0,4]]],[[[114,1]],[[115,0],[0,1]]],[[[116,1]],[[117,2],[50,3],[118,4],[0,1]],[[111,4],[62,4]],[[116,5],[62,5]],[[0,4]],[[50,3],[0,5]]],[[[95,1],[107,1]],[[52,2],[0,1]],[[95,1],[107,1],[0,2]]],[[[119,2],[30,1],[22,1],[43,1]],[[120,2]],[[0,2]]],[[[2,0],[112,1],[121,0]],[[0,1]]],[[[122,1],[123,1],[124,1],[125,1],[126,1]],[[0,1]]],[[[34,1]],[[82,2]],[[83,3]],[[111,4]],[[48,5]],[[80,6]],[[127,7],[0,6]],[[48,8]],[[80,9]],[[0,9]]],[[[4,1]],[[25,\n2]],[[128,3]],[[48,4],[129,5]],[[80,6]],[[49,7]],[[0,6]],[[48,4]]],[[[26,1]],[[25,2]],[[52,1],[0,2]]],[[[37,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[130,1],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[25,1]],[[108,2],[0,1]],[[25,3]],[[0,3]]],[[[131,1]],[[52,2],[0,1]],[[131,1],[0,2]]],[[[36,1]],[[105,2],[19,3],[110,3]],[[32,4]],[[105,2],[19,3],[32,4],[110,3]],[[132,5],[15,5],[35,6]],[[0,5]],[[132,7]],[[61,5]]],[[[32,1]],[[133,2]],[[0,2]]],[[[134,1],[135,1]],[[0,1]]],[[[14,1]],[[48,2],[136,3]],[[49,4]],[[48,\n2]],[[0,4]]],[[[14,1]],[[48,2],[136,3]],[[86,4]],[[48,2]],[[0,4]]],[[[18,1]],[[25,2]],[[52,1],[0,2]]],[[[8,1],[137,2]],[[46,2]],[[0,2]]],[[[138,1]],[[139,0],[0,1]]],[[[35,1]],[[61,2],[140,3]],[[0,2]],[[61,2]]],[[[28,1]],[[0,1]]],[[[141,1]],[[53,2],[0,1]],[[120,3]],[[0,3]]],[[[16,1]],[[49,2],[142,3],[0,1]],[[52,4],[0,2]],[[49,5]],[[49,2],[0,4]],[[52,6],[0,5]],[[49,7]],[[52,8],[0,7]],[[49,7],[0,8]]],[[[5,1]],[[49,2],[0,1]],[[36,3],[52,3],[0,2]],[[49,4]],[[52,5],[0,4]],[[49,6]],[[0,6]]],[[[23,1]],[[111,\n2],[0,1]],[[0,2]]],[[[143,1]],[[144,0],[142,0],[0,1]]],[[[145,1]],[[2,2],[146,3]],[[0,2]],[[145,1],[2,2]]],[[[48,1]],[[49,2],[0,1]],[[0,2]]],[[[147,1],[148,1],[149,1],[150,1],[151,1],[152,1],[153,1],[154,1],[155,1],[156,1]],[[0,1]]],[[[15,1]],[[95,2]],[[0,2]]],[[[1,1],[3,1]],[[0,1]]],[[[49,1],[48,2]],[[48,2],[0,1]],[[49,3],[157,4],[0,2]],[[157,4],[0,3]],[[0,4]]],[[[158,1]],[[52,2],[0,1]],[[158,1],[0,2]]],[[[1,1],[2,2]],[[0,1]],[[159,3]],[[121,4]],[[160,1],[121,4]]],[[[120,1]],[[161,0],[15,0],[162,\n0],[41,0],[163,0],[0,1]]],[[[84,1],[164,2]],[[37,3],[0,1]],[[0,2]],[[84,4]],[[127,5]],[[49,2]]],[[[165,1],[84,1]],[[0,1]]],[[[49,1]],[[52,2],[0,1]],[[49,1],[0,2]]],[[[49,1],[107,1]],[[54,2],[52,3],[0,1]],[[0,2]],[[49,4],[107,4],[0,3]],[[52,3],[0,4]]],[[[49,1],[107,1]],[[52,2],[0,1]],[[49,1],[107,1],[0,2]]],[[[25,1]],[[48,2],[0,1]],[[49,3]],[[0,3]]],[[[35,1],[110,2],[38,3]],[[61,4],[81,5]],[[25,4]],[[166,6]],[[0,4]],[[61,4]],[[64,4]]],[[[20,1]],[[48,2]],[[80,3]],[[167,4],[168,5]],[[48,6]],[[48,7]],\n[[80,8]],[[80,9]],[[167,4],[127,10],[168,5],[0,8]],[[0,9]],[[48,11]],[[80,12]],[[168,5],[0,12]]],[[[15,1],[169,2],[53,3]],[[169,4],[52,5],[0,1]],[[50,6],[52,7],[0,2]],[[169,8]],[[52,5],[0,4]],[[169,9],[53,3],[0,5]],[[49,10]],[[15,11],[169,2],[53,3],[0,7]],[[52,12],[0,8]],[[50,13],[52,5],[0,9]],[[52,7],[0,10]],[[169,14],[52,15],[0,11]],[[0,12]],[[49,4]],[[52,15],[0,14]],[[169,16],[53,3],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[15,1],[53,2],[170,3]],[[170,5],[52,4],[0,1]],[[170,6]],[[50,7],[52,\n8],[0,3]],[[53,2],[170,9],[0,4]],[[52,4],[0,5]],[[52,10],[0,6]],[[49,11]],[[15,12],[53,2],[170,3],[0,8]],[[50,13],[52,4],[0,9]],[[0,10]],[[52,8],[0,11]],[[52,15],[170,14],[0,12]],[[49,5]],[[52,15],[0,14]],[[53,2],[170,16],[0,15]],[[50,17],[52,15],[0,16]],[[49,14]]],[[[25,1]],[[0,1]]],[[[21,1]],[[49,2]],[[48,3]],[[80,4]],[[127,5],[0,4]],[[48,6]],[[80,7]],[[0,7]]],[[[49,1]],[[108,2],[0,1]],[[95,3]],[[0,3]]],[[[42,1]],[[171,2]],[[48,3],[52,1]],[[80,4]],[[0,4]]],[[[172,1]],[[173,0],[0,1]]],[[[111,2],\n[36,1]],[[49,2]],[[0,2]]],[[[31,1]],[[174,2],[0,1]],[[0,2]]],[[[62,1]],[[0,1]]]],labels:[[0,\"EMPTY\"],[317,null],[4,null],[276,null],[1,\"def\"],[1,\"raise\"],[1,\"True\"],[3,null],[1,\"not\"],[1,\"None\"],[55,null],[2,null],[25,null],[1,\"class\"],[1,\"lambda\"],[16,null],[1,\"print\"],[1,\"debugger\"],[1,\"nonlocal\"],[52,null],[1,\"try\"],[1,\"while\"],[31,null],[1,\"return\"],[1,\"assert\"],[1,null],[1,\"global\"],[1,\"del\"],[1,\"pass\"],[54,null],[15,null],[1,\"yield\"],[1,\"import\"],[1,\"False\"],[1,\"for\"],[7,null],[1,\"from\"],[1,\n\"if\"],[9,null],[1,\"break\"],[1,\"continue\"],[49,null],[1,\"with\"],[14,null],[316,null],[19,null],[308,null],[1,\"and\"],[11,null],[326,null],[22,null],[261,null],[12,null],[35,null],[271,null],[325,null],[297,null],[339,null],[296,null],[26,null],[283,null],[8,null],[342,null],[329,null],[10,null],[266,null],[332,null],[45,null],[38,null],[40,null],[50,null],[46,null],[41,null],[42,null],[36,null],[43,null],[48,null],[44,null],[37,null],[39,null],[324,null],[260,null],[292,null],[1,\"in\"],[309,null],[273,\nnull],[327,null],[272,null],[28,null],[21,null],[27,null],[29,null],[1,\"is\"],[30,null],[20,null],[290,null],[274,null],[333,null],[299,null],[270,null],[337,null],[279,null],[265,null],[281,null],[264,null],[286,null],[280,null],[320,null],[1,\"as\"],[284,null],[23,null],[328,null],[0,null],[1,\"except\"],[340,null],[18,null],[330,null],[268,null],[259,null],[312,null],[293,null],[321,null],[269,null],[277,null],[314,null],[315,null],[343,null],[1,\"else\"],[310,null],[51,null],[1,\"elif\"],[300,null],[301,\nnull],[285,null],[303,null],[302,null],[335,null],[275,null],[258,null],[1,\"or\"],[334,null],[267,null],[34,null],[262,null],[33,null],[319,null],[13,null],[295,null],[263,null],[291,null],[311,null],[307,null],[313,null],[282,null],[298,null],[304,null],[278,null],[318,null],[322,null],[5,null],[6,null],[47,null],[17,null],[24,null],[305,null],[306,null],[323,null],[289,null],[1,\"finally\"],[331,null],[336,null],[338,null],[257,null],[32,null],[341,null]],keywords:{False:33,None:9,True:6,and:47,as:108,\nassert:24,\"break\":39,\"class\":13,\"continue\":40,\"debugger\":17,def:4,del:27,elif:130,\"else\":127,except:113,\"finally\":168,\"for\":34,from:36,global:26,\"if\":37,\"import\":32,\"in\":83,is:92,lambda:14,nonlocal:18,not:8,or:139,pass:28,print:16,raise:5,\"return\":23,\"try\":20,\"while\":21,\"with\":42,yield:31},tokens:{0:112,1:25,2:11,3:7,4:2,5:159,6:160,7:35,8:61,9:38,10:64,11:48,12:52,13:146,14:43,15:30,16:15,17:162,18:115,19:45,20:94,21:89,22:50,23:110,24:163,25:12,26:59,27:90,28:88,29:91,30:93,31:22,32:173,33:144,\n34:142,35:53,36:74,37:78,38:68,39:79,40:69,41:72,42:73,43:75,44:77,45:67,46:71,47:161,48:76,49:41,50:70,51:129,52:19,54:29,55:10},start:256}},function(D,R){function a(c,e){this.filename=c;this.grammar=e;this.p_flags=0;return this}function d(c,e){void 0===e&&(e=\"file_input\");c=new a(c,Sk.ParseTables);\"file_input\"===e?c.setup(Sk.ParseTables.sym.file_input):Sk.asserts.fail(\"todo;\");return c}a.FUTURE_PRINT_FUNCTION=\"print_function\";a.FUTURE_UNICODE_LITERALS=\"unicode_literals\";a.FUTURE_DIVISION=\"division\";\na.FUTURE_ABSOLUTE_IMPORT=\"absolute_import\";a.FUTURE_WITH_STATEMENT=\"with_statement\";a.FUTURE_NESTED_SCOPES=\"nested_scopes\";a.FUTURE_GENERATORS=\"generators\";a.CO_FUTURE_PRINT_FUNCTION=65536;a.CO_FUTURE_UNICODE_LITERALS=131072;a.CO_FUTURE_DIVISON=8192;a.CO_FUTURE_ABSOLUTE_IMPORT=16384;a.CO_FUTURE_WITH_STATEMENT=32768;a.prototype.setup=function(c){c=c||this.grammar.start;this.stack=[{dfa:this.grammar.dfas[c],state:0,node:{type:c,value:null,context:null,children:[]}}];this.used_names={}};a.prototype.addtoken=\nfunction(c,e,k){var p,h=this.classify(c,e,k);a:for(;;){var f=this.stack[this.stack.length-1];var b=f.dfa[0];var m=b[f.state];for(p=0;pt);this.shift(c,e,g,k);for(k=g;1===b[k].length&&0===b[k][0][0]&&b[k][0][1]===k;){this.pop();if(0===this.stack.length)return!0;f=this.stack[this.stack.length-1];k=f.state;b=f.dfa[0]}return!1}if(256<=t&&(n=this.grammar.dfas[t],n=n[1],n.hasOwnProperty(h))){this.push(t,\nthis.grammar.dfas[t],g,k);continue a}}b:{b=[0,f.state];for(f=m.length;f--;)if(m[f][0]===b[0]&&m[f][1]===b[1]){m=!0;break b}m=!1}if(m){if(this.pop(),0===this.stack.length)throw new Sk.builtin.SyntaxError(\"too much input\",this.filename);}else throw c=k[0][0],new Sk.builtin.SyntaxError(\"bad input\",this.filename,c,k);}};a.prototype.classify=function(c,e,k){if(c===Sk.token.tokens.T_NAME){this.used_names[e]=!0;var p=this.grammar.keywords.hasOwnProperty(e)&&this.grammar.keywords[e];\"print\"===e&&(this.p_flags&\na.CO_FUTURE_PRINT_FUNCTION||!0===Sk.__future__.print_function)&&(p=!1);if(p)return p}p=this.grammar.tokens.hasOwnProperty(c)&&this.grammar.tokens[c];if(!p){e=\"#\"+c;for(let h in Sk.token.tokens)if(Sk.token.tokens[h]==c){e=h;break}throw new Sk.builtin.SyntaxError(\"bad token \"+e,this.filename,k[0][0],k);}return p};a.prototype.shift=function(c,e,k,p){var h=this.stack[this.stack.length-1].dfa,f=this.stack[this.stack.length-1].node;f.children.push({type:c,value:e,lineno:p[0][0],col_offset:p[0][1],children:null});\nthis.stack[this.stack.length-1]={dfa:h,state:k,node:f}};a.prototype.push=function(c,e,k,p){c={type:c,value:null,lineno:p[0][0],col_offset:p[0][1],children:[]};this.stack[this.stack.length-1]={dfa:this.stack[this.stack.length-1].dfa,state:k,node:this.stack[this.stack.length-1].node};this.stack.push({dfa:e,state:0,node:c})};a.prototype.pop=function(){var c=this.stack.pop().node;if(c)if(0!==this.stack.length){var e=this.stack[this.stack.length-1].node;e.children.push(c)}else this.rootnode=c,this.rootnode.used_names=\nthis.used_names};Sk.parse=function(c,e){var k=Sk.token.tokens.T_COMMENT,p=Sk.token.tokens.T_NL,h=Sk.token.tokens.T_OP,f=Sk.token.tokens.T_ENDMARKER,b=Sk.token.tokens.T_ENCODING,m=!1,n=d(c);Sk._tokenize(c,function(g){var t=g.split(\"\\n\").reverse().map(function(l){return l+\"\\n\"});return function(){if(0===t.length)throw new Sk.builtin.Exception(\"EOF\");return t.pop()}}(e),\"utf-8\",function(g){var t=null;g.type!==k&&g.type!==p&&g.type!==b&&(g.type===h&&(t=Sk.OpMap[g.string]),n.addtoken(t||g.type,g.string,\n[g.start,g.end,g.line]),g.type===f&&(m=!0))});if(!m)throw new Sk.builtin.SyntaxError(\"incomplete input\",this.filename);return{cst:n.rootnode,flags:n.p_flags}};Sk.parseTreeDump=function(c,e){var k;e=e||\"\";var p=\"\"+e;if(256<=c.type)for(p+=Sk.ParseTables.number2symbol[c.type]+\"\\n\",k=0;k=d(u)||M+2==d(u)&&c(u,M+1).type==W.T_COMMA)throw new Sk.builtin.SyntaxError(\"named arguments must follow bare *\",B.c_filename,u.lineno);fa=c(u,M+1);fa.type==W.T_COMMA?(M+=2,M=K(B,u,M,V,ca)):(Y=G(B,fa),M+=3,MB.c_feature_version)return k(B,M,\"Async functions are only supported in Python 3.5 and greater\"),null;e(M,N.funcdef);var ca=n(c(M,P));if(f(B,ca,c(M,P),0))return null;var Y=S(B,c(M,P+1));if(!Y)return null;if(c(M,P+2).type==W.T_RARROW){O=aa(B,c(M,\nP+3));if(!O)return null;P+=2}if(c(M,P+3).type==W.T_TYPE_COMMENT){V=W.T_NEW_TYPE_COMMENT(c(M,P+3));if(!V)return null;P+=1}var da=q(B,c(M,P+3));if(!da)return null;if(1\":return Sk.astnodes.RShift;case \"&\":return Sk.astnodes.BitAnd;case \"^\":return Sk.astnodes.BitXor;case \"|\":return Sk.astnodes.BitOr;case \"*\":return\"*\"===u.value.charAt(1)?Sk.astnodes.Pow:Sk.astnodes.Mult;case \"@\":if(Sk.__future__.python3)return Sk.astnodes.MatMult;default:Sk.asserts.fail(\"invalid augassign\")}}function X(B,\nu){Sk.asserts.assert(0=u);Sk.asserts.assert(\"{\"==B.charAt(u-1));Sk.asserts.assert(\"}\"==B.charAt(A)||\"!\"==B.charAt(A)||\":\"==B.charAt(A));B=B.substring(u,A);/^\\s*$/.test(B)&&k(H,M,\"f-string: empty expression not allowed\");try{let P=Sk.parse(\"\",\"(\"+B+\")\");var O=Sk.astFromParse(P.cst,\"\",P.flags)}catch(P){throw P.traceback&&P.traceback[0]&&(O=P.traceback[0],O.lineno=(O.lineno||1)-1+M.lineno,O.filename=H.c_filename),P;}Sk.asserts.assert(1==\nO.body.length&&O.body[0].constructor===Sk.astnodes.Expr);return O.body[0].value}function oa(B,u,A,H,M,O,P){Sk.asserts.assert(\"{\"==B.charAt(u));u++;var V=u;let ca=null,Y=0,da=0,fa,ha,ma=()=>k(O,P,\"f-string: expecting '}'\");for(Sk.asserts.assert(u<=A);u=A&&ma(),ha=B.charAt(u),u++,\"s\"!=ha&&\"r\"!=ha&&\"a\"!=ha&&k(O,P,\"f-string: invalid conversion character: expected 's', 'r', or 'a'\"));\nu>=A&&ma();\":\"==B.charAt(u)&&(u++,u>=A&&ma(),[fa,u]=pa(B,u,A,H,M+1,O,P));(u>=A||\"}\"!=B.charAt(u))&&ma();u++;return[new Sk.astnodes.FormattedValue(V,ha,fa,P.lineno,P.col_offset),u]}function pa(B,u,A,H,M,O,P){let V=[],ca=Y=>{if(-1!==Y.indexOf(\"}\")){if(/(^|[^}])}(}})*($|[^}])/.test(Y))throw new Sk.builtin.SyntaxError(\"f-string: single '}' is not allowed\",O.c_filename,P.lineno,P.col_offset);Y=Y.replace(/}}/g,\"}\")}V.push(new Sk.astnodes.Str(new Sk.builtin.str(Y),P.lineno,P.col_offset,O.end_lineno,P.end_col_offset))};\nfor(;uda&&(Y=-1,A=da))}if(-1===Y){ca(B.substring(u,A));u=A;break}else if(Y+1=H.length){if(\"None\"===H)return new Sk.astnodes.NameConstant(Sk.builtin.none.none$,\nu.lineno,u.col_offset);if(\"True\"===H)return new Sk.astnodes.NameConstant(Sk.builtin.bool.true$,u.lineno,u.col_offset);if(\"False\"===H)return new Sk.astnodes.NameConstant(Sk.builtin.bool.false$,u.lineno,u.col_offset)}B=n(H,B);return new Sk.astnodes.Name(B,Sk.astnodes.Load,u.lineno,u.col_offset,u.end_lineno,u.end_col_offset);case W.T_STRING:A=[];for(var M=0;M=ha&&k(P,V,\"Truncated \\\\xNN escape\"),ma+=String.fromCharCode(parseInt(da.substr(ca+1,2),16)),ca+=2):fa||\"u\"!==Y?fa||\"U\"!==Y?ma+=\"\\\\\"+Y:(ca+8>=ha&&k(P,V,\"Truncated \\\\UXXXXXXXX escape\"),ma+=String.fromCodePoint(parseInt(da.substr(ca+\n1,8),16)),ca+=8):(ca+4>=ha&&k(P,V,\"Truncated \\\\uXXXX escape\"),ma+=String.fromCharCode(parseInt(da.substr(ca+1,4),16)),ca+=4))):fa&&127H.charCodeAt(1)&&(H=\"0o\"+H.substring(1));A=!0;if(\"l\"===M||\"L\"===M)H=H.slice(0,-1),A=!1;M=Number(H);H=M>Number.MAX_SAFE_INTEGER?A?new Sk.builtin.int_(JSBI.BigInt(H)):new Sk.builtin.lng(JSBI.BigInt(H)):A?new Sk.builtin.int_(M):new Sk.builtin.lng(M)}return new B(H,u.lineno,u.col_offset);case W.T_ELLIPSIS:return new Sk.astnodes.Ellipsis(u.lineno,u.col_offset,u.end_lineno,u.end_col_offset);case W.T_LPAR:return A=c(u,\n1),A.type==W.T_RPAR?new Sk.astnodes.Tuple([],Sk.astnodes.Load,u.lineno,u.col_offset,u.end_lineno,u.end_col_offset):A.type==N.yield_expr?aa(B,A):1==d(A)?X(B,A):c(A,1).type==N.comp_for?t(v(B,A),u):t(X(B,A),u);case W.T_LSQB:A=c(u,1);if(A.type==W.T_RSQB)return new Sk.astnodes.List([],Sk.astnodes.Load,u.lineno,u.col_offset,u.end_lineno,u.end_col_offset);e(A,N.testlist_comp);if(1==d(A)||c(A,1).type==W.T_COMMA)return(B=l(B,A))?new Sk.astnodes.List(B,Sk.astnodes.Load,u.lineno,u.col_offset,u.end_lineno,u.end_col_offset):\nnull;H=A;Sk.asserts.assert(H.type==N.testlist_comp);B=J(B,H,1);return t(B,u);case W.T_LBRACE:A=c(u,1);if(A.type==W.T_RBRACE)return new Sk.astnodes.Dict(null,null,u.lineno,u.col_offset,u.end_lineno,u.end_col_offset);H=c(A,0).type==W.T_DOUBLESTAR;if(1==d(A)||13-H&&c(A,3-H).type==N.comp_for){if(H)return k(B,u,\"dict unpacking cannot be used in dict comprehension\"),null;H=A;Sk.asserts.assert(3>11&7;this.__namespaces=\nb||[]}function d(h,f,b,m,n){this.symFlags={};this.name=f;this.varnames=[];this.children=[];this.blockType=b;this.returnsValue=this.varkeywords=this.varargs=this.generator=this.childHasFree=this.hasFree=this.isNested=!1;this.lineno=n;this.table=h;h.cur&&(h.cur.nested||\"function\"===h.cur.blockType)&&(this.isNested=!0);m.scopeId=p++;h.stss[m.scopeId]=this;this.symbols={}}function c(h){this.filename=h;this.top=this.cur=null;this.stack=[];this.curClass=this.global=null;this.tmpname=0;this.stss={}}function e(h,\nf){var b;for(b=0;b>11&7;return 3==h||2==h}));return this._funcGlobals};d.prototype.get_frees=function(){Sk.asserts.assert(\"function\"==this.get_type(),\"get_frees only valid for function scopes\");this._funcFrees||(this._funcFrees=this._identsMatching(function(h){return 4==(h>>11&7)}));return this._funcFrees};\nd.prototype.get_methods=function(){var h;Sk.asserts.assert(\"class\"==this.get_type(),\"get_methods only valid for class scopes\");if(!this._classMethods){var f=[];for(h=0;h>11&7};c.prototype.getStsForAst=function(h){Sk.asserts.assert(void 0!==h.scopeId,\"ast wasn't added to st?\");h=this.stss[h.scopeId];Sk.asserts.assert(void 0!==\nh,\"unknown sym tab entry\");return h};c.prototype.SEQStmt=function(h){var f,b;if(null!==h){Sk.asserts.assert(Sk.isArrayLike(h),\"SEQ: nodes isn't array? got \"+h.toString());var m=h.length;for(b=0;b\",\"\").replace(\" \",\"_\"))};var p=Sk.builtin.str.reservedWords_;const h=/_\\$rw\\$$/;a.prototype.makeConstant=function(b){var m,n=\"\";for(m=0;m Sk.execLimit) {throw new Sk.builtin.TimeoutError(Sk.timeoutMsg())}\"),null!==Sk.yieldLimit&&this.u.canSuspend&&(b=b+\"if (!$waking && ($dateNow - Sk.lastYield > Sk.yieldLimit)) {var $susp = $saveSuspension({data: {type: 'Sk.yield'}, resume: function() {}}, '\"+\n(this.filename+\"',$currLineNo,$currColNo);\"),b+=\"$susp.$blk = $blk;$susp.optional = true;return $susp;}$waking = false;\",this.u.doesSuspend=!0);return b};a.prototype._jumpfalse=function(b,m){b=this._gr(\"jfalse\",\"(\",b,\"===false||!Sk.misceval.isTrue(\",b,\"))\");k(\"if(\",b,\"){/*test failed */$blk=\",m,\";continue;}\")};a.prototype._jumpundef=function(b,m){k(\"if(\",b,\"===undefined){$blk=\",m,\";continue;}\")};a.prototype._jumpnotundef=function(b,m){k(\"if(\",b,\"!==undefined){$blk=\",m,\";continue;}\")};a.prototype._jumptrue=\nfunction(b,m){b=this._gr(\"jtrue\",\"(\",b,\"===true||Sk.misceval.isTrue(\",b,\"))\");k(\"if(\",b,\"){/*test passed */$blk=\",m,\";continue;}\")};a.prototype._jump=function(b){null===this.u.blocks[this.u.curblock]._next&&(k(\"$blk=\",b,\";\"),this.u.blocks[this.u.curblock]._next=b)};a.prototype._checkSuspension=function(b){if(this.u.canSuspend){var m=this.newBlock(\"function return or resume suspension\");this._jump(m);this.setBlock(m);b=b||{lineno:\"$currLineNo\",col_offset:\"$currColNo\"};k(\"if ($ret && $ret.$isSuspension) { return $saveSuspension($ret,'\"+\nthis.filename+\"',\"+b.lineno+\",\"+b.col_offset+\"); }\");this.u.doesSuspend=!0;this.u.tempsToSave=this.u.tempsToSave.concat(this.u.localtemps)}else k(\"if ($ret && $ret.$isSuspension) { $ret = Sk.misceval.retryOptionalSuspensionOrThrow($ret); }\")};a.prototype.cunpackstarstoarray=function(b,m){if(!b||0==b.length)return\"[]\";let n=!1;for(let g of b){if(m&&n)throw new Sk.builtin.SyntaxError(\"Extended argument unpacking is not permitted in Python 2\");g.constructor===Sk.astnodes.Starred&&(n=!0)}if(n){m=this._gr(\"unpack\",\n\"[]\");for(let g of b)g.constructor!==Sk.astnodes.Starred?k(m,\".push(\",this.vexpr(g),\");\"):(k(\"$ret = Sk.misceval.iterFor(Sk.abstr.iter(\",this.vexpr(g.value),\"), function(e) { \",m,\".push(e); });\"),this._checkSuspension());return m}return\"[\"+b.map(g=>this.vexpr(g)).join(\",\")+\"]\"};a.prototype.cunpackkwstoarray=function(b,m){var n=\"undefined\";if(b&&0=n.length&&(n=this.vexpr(t),\"dict\"===b?(b=this.vexpr(l),k(m,\n\".mp$ass_subscript(\",b,\",\",n,\");\")):\"list\"===b?k(m,\".v.push(\",n,\");\"):\"set\"===b&&k(m,\".v.mp$ass_subscript(\",n,\", true);\"),this._jump(x),this.setBlock(x));this._jump(w);this.setBlock(v);return m};a.prototype.cyield=function(b){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError(\"'yield' outside function\",this.filename,b.lineno);var m=\"Sk.builtin.none.none$\";b.value&&(m=this.vexpr(b.value));b=this.newBlock(\"after yield\");k(\"return [/*resume*/\",b,\",/*ret*/\",m,\"];\");\nthis.setBlock(b);return\"$gen.gi$sentvalue\"};a.prototype.cyieldfrom=function(b){if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError(\"'yield' outside function\",this.filename,b.lineno);var m=this.vexpr(b.value);m=this._gr(\"iter\",\"Sk.abstr.iter(\",m,\")\");k(\"$gen.\"+m+\"=\",m,\";\");var n=this.newBlock(\"after iter\"),g=this.newBlock(\"after yield from\");this._jump(n);this.setBlock(n);var t=this.gensym(\"retval\");k(m,\"=$gen.\",m,\";\");k(\"var \",t,\";\");k(\"if ($gen.gi$sentvalue === Sk.builtin.none.none$ || \"+\nm+\".constructor === Sk.builtin.generator) {\");k(\"$ret=\",m,\".tp$iternext(true, $gen.gi$sentvalue);\");k(\"} else {\");var l=this.makeConstant(\"new Sk.builtin.str('send');\");k(\"$ret=Sk.misceval.tryCatch(\");k(\"function(){\");k(\"return Sk.misceval.callsimOrSuspendArray(Sk.abstr.gattr(\",m,\",\",l,\"), [$gen.gi$sentvalue]);},\");k(\"function (e) { \");k(\"if (e instanceof Sk.builtin.StopIteration) { \");k(m,\".gi$ret = e.$value;\");k(\"return undefined;\");k(\"} else { throw e; }\");k(\"}\");k(\");\");k(\"}\");this._checkSuspension(b);\nk(t,\"=$ret;\");k(\"if(\",t,\"===undefined) {\");k(\"$gen.gi$sentvalue=$gen.\"+m+\".gi$ret;\");k(\"$blk=\",g,\";continue;\");k(\"}\");k(\"return [/*resume*/\",n,\",/*ret*/\",t,\"];\");this.setBlock(g);return\"$gen.gi$sentvalue\"};a.prototype.ccompare=function(b){var m;Sk.asserts.assert(b.ops.length===b.comparators.length);var n=this.vexpr(b.left);var g=b.ops.length;var t=this.newBlock(\"done\");var l=this._gr(\"compareres\",\"null\");for(m=0;mthis.u.lineno&&(this.u.lineno=b.lineno,\nthis.u.linenoSet=!1);switch(b.constructor){case Sk.astnodes.BoolOp:return this.cboolop(b);case Sk.astnodes.BinOp:return this._gr(\"binop\",\"Sk.abstr.numberBinOp(\",this.vexpr(b.left),\",\",this.vexpr(b.right),\",'\",b.op.prototype._astname,\"')\");case Sk.astnodes.UnaryOp:return this._gr(\"unaryop\",\"Sk.abstr.numberUnaryOp(\",this.vexpr(b.operand),\",'\",b.op.prototype._astname,\"')\");case Sk.astnodes.Lambda:return this.clambda(b);case Sk.astnodes.IfExp:return this.cifexp(b);case Sk.astnodes.Dict:return this.cdict(b);\ncase Sk.astnodes.ListComp:return this.clistcomp(b);case Sk.astnodes.DictComp:return this.cdictcomp(b);case Sk.astnodes.SetComp:return this.csetcomp(b);case Sk.astnodes.GeneratorExp:return this.cgenexp(b);case Sk.astnodes.Yield:return this.cyield(b);case Sk.astnodes.YieldFrom:return this.cyieldfrom(b);case Sk.astnodes.Compare:return this.ccompare(b);case Sk.astnodes.Call:return m=this.ccall(b),this.annotateSource(b),m;case Sk.astnodes.Num:if(\"number\"===typeof b.n)return b.n;if(b.n instanceof Sk.builtin.lng)return this.makeConstant(\"new Sk.builtin.lng('\"+\nb.n.v.toString()+\"')\");if(b.n instanceof Sk.builtin.int_)return\"number\"===typeof b.n.v?this.makeConstant(\"new Sk.builtin.int_(\"+b.n.v+\")\"):this.makeConstant(\"new Sk.builtin.int_('\"+b.n.v.toString()+\"')\");if(b.n instanceof Sk.builtin.float_)return b=0===b.n.v&&-Infinity===1/b.n.v?\"-0\":b.n.v,this.makeConstant(\"new Sk.builtin.float_(\"+b+\")\");if(b.n instanceof Sk.builtin.complex)return this.makeConstant(\"new Sk.builtin.complex(\"+(0===b.n.real&&-Infinity===1/b.n.real?\"-0\":b.n.real)+\", \"+(0===b.n.imag&&\n-Infinity===1/b.n.imag?\"-0\":b.n.imag)+\")\");Sk.asserts.fail(\"unhandled Num type\");case Sk.astnodes.Bytes:if(Sk.__future__.python3){m=[];b=b.s.$jsstr();for(n=0;ng||127<=g&&256>g?n+(\"\\\\x\"+(\"0\"+g.toString(16)).substr(-2)):256<=g?n+(\"\\\\u\"+(\"000\"+g.toString(16)).substr(-4)):\nn+b.charAt(t);b=n+'\"';return m.call(this,\"new Sk.builtin.str(\",b,\",true)\");case Sk.astnodes.Attribute:b.ctx!==Sk.astnodes.AugLoad&&b.ctx!==Sk.astnodes.AugStore&&(t=this.vexpr(b.value));g=b.attr.$r().v;g=g.substring(1,g.length-1);g=e(this.u.private_,new Sk.builtin.str(g)).v;g=this.makeConstant(\"new Sk.builtin.str('\"+g+\"')\");switch(b.ctx){case Sk.astnodes.AugLoad:return k(\"$ret = \",n,\".tp$getattr(\",g,\", true);\"),this._checkSuspension(b),k(\"\\nif ($ret === undefined) {\"),k(\"\\nthrow new Sk.builtin.AttributeError(\",\nn,'.sk$attrError() + \" has no attribute \\'\" + ',g,'.$jsstr() + \"\\'\");'),k(\"\\n};\"),this._gr(\"lattr\",\"$ret\");case Sk.astnodes.Load:return k(\"$ret = \",t,\".tp$getattr(\",g,\", true);\"),this._checkSuspension(b),k(\"\\nif ($ret === undefined) {\"),k(\"\\nthrow new Sk.builtin.AttributeError(\",t,'.sk$attrError() + \" has no attribute \\'\" + ',g,'.$jsstr() + \"\\'\");'),k(\"\\n};\"),this._gr(\"lattr\",\"$ret\");case Sk.astnodes.AugStore:k(\"$ret = undefined;\");k(\"if(\",m,\"!==undefined){\");k(\"$ret = \",n,\".tp$setattr(\",g,\",\",m,\n\", true);\");k(\"}\");this._checkSuspension(b);break;case Sk.astnodes.Store:k(\"$ret = \",t,\".tp$setattr(\",g,\",\",m,\", true);\");this._checkSuspension(b);break;case Sk.astnodes.Del:k(\"$ret = \",t,\".tp$setattr(\",g,\", undefined, true);\");this._checkSuspension(b);break;default:Sk.asserts.fail(\"invalid attribute expression\")}break;case Sk.astnodes.Subscript:switch(b.ctx){case Sk.astnodes.AugLoad:return k(\"$ret = Sk.abstr.objectGetItem(\",n,\",\",g,\", true);\"),this._checkSuspension(b),this._gr(\"gitem\",\"$ret\");case Sk.astnodes.Load:case Sk.astnodes.Store:case Sk.astnodes.Del:return this.vslice(b.slice,\nb.ctx,this.vexpr(b.value),m);case Sk.astnodes.AugStore:k(\"$ret=undefined;\");k(\"if(\",m,\"!==undefined){\");k(\"$ret=Sk.abstr.objectSetItem(\",n,\",\",g,\",\",m,\", true)\");k(\"}\");this._checkSuspension(b);break;default:Sk.asserts.fail(\"invalid subscript expression\")}break;case Sk.astnodes.Name:return this.nameop(b.id,b.ctx,m);case Sk.astnodes.NameConstant:if(b.ctx===Sk.astnodes.Store||b.ctx===Sk.astnodes.AugStore||b.ctx===Sk.astnodes.Del)throw new Sk.builtin.SyntaxError(\"can not assign to a constant name\");\nswitch(b.value){case Sk.builtin.none.none$:return\"Sk.builtin.none.none$\";case Sk.builtin.bool.true$:return\"Sk.builtin.bool.true$\";case Sk.builtin.bool.false$:return\"Sk.builtin.bool.false$\";default:Sk.asserts.fail(\"invalid named constant\")}break;case Sk.astnodes.List:return this.ctuplelistorset(b,m,\"list\");case Sk.astnodes.Tuple:return this.ctuplelistorset(b,m,\"tuple\");case Sk.astnodes.Set:return this.ctuplelistorset(b,m,\"set\");case Sk.astnodes.Starred:switch(b.ctx){case Sk.astnodes.Store:throw new Sk.builtin.SyntaxError(\"starred assignment target must be in a list or tuple\",\nthis.filename,b.lineno);default:throw new Sk.builtin.SyntaxError(\"can't use starred expression here\",this.filename,b.lineno);}case Sk.astnodes.JoinedStr:return this.cjoinedstr(b);case Sk.astnodes.FormattedValue:return this.cformattedvalue(b);case Sk.astnodes.Ellipsis:return this.makeConstant(\"Sk.builtin.Ellipsis\");default:Sk.asserts.fail(\"unhandled case \"+b.constructor.name+\" vexpr\")}};a.prototype.vseqexpr=function(b,m){var n;Sk.asserts.assert(void 0===m||b.length===m.length);var g=[];for(n=0;n\";this.u.blocks[m]._next=null;return m};a.prototype.setBlock=function(b){Sk.asserts.assert(0<=b&&\nb0) { $err=err; $blk=$exc.pop(); } else { throw err; } }};\";q+=\"var $saveSuspension = function($child, $filename, $lineno, $colno) {var susp = new Sk.misceval.Suspension(); susp.child=$child;susp.resume=function(){\"+\nb.scopename+\".$wakingSuspension=susp; return \"+b.scopename+\"(\"+(b.ste.generator?\"$gen\":\"\")+\"); };susp.data=susp.child.data;susp.$blk=$blk;susp.$loc=$loc;susp.$gbl=$gbl;susp.$exc=$exc;susp.$err=$err;susp.$postfinally=$postfinally;susp.$filename=$filename;susp.$lineno=$lineno;susp.$colno=$colno;susp.optional=susp.child.optional;\"+(l?\"susp.$cell=$cell;\":\"\");t={};for(m=0;mJ?this.vexpr(J):\"undefined\"));g&&g.vararg&&(E=g.vararg);g&&g.kwarg&&(L=g.kwarg);var z=this.enterScope(m,b,b.lineno,this.canSuspend);var G=this.u.ste.generator;var K=this.u.ste.hasFree;var S=this.u.ste.childHasFree;var U=this.newBlock(\"codeobj entry\");this.u.prefixCode=\"var \"+z+\"=(function \"+this.niceName(m.v)+\n\"$(\";var r=[];if(G){if(L)throw new Sk.builtin.SyntaxError(m.v+\"(): keyword arguments in generators not supported\",this.filename,b.lineno);if(E)throw new Sk.builtin.SyntaxError(m.v+\"(): variable number of arguments in generators not supported\",this.filename,b.lineno);r.push(\"$gen\")}else{L&&(r.push(\"$kwa\"),this.u.tempsToSave.push(\"$kwa\"));for(w=0;g&&w0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} }});\";t.call(this,z);if(g){for(let J of g.args)q.push(J.arg.v);for(let J of g.kwonlyargs||[])q.push(J.arg.v);this.u.argnames=q}this.exitScope();\n0\"),null,b.args,function(m){m=this.vexpr(b.body);k(\"return \",m,\";\")})};a.prototype.cifexp=function(b){var m=this.newBlock(\"next of ifexp\"),\nn=this.newBlock(\"end of ifexp\"),g=this._gr(\"res\",\"null\"),t=this.vexpr(b.test);this._jumpfalse(t,m);k(g,\"=\",this.vexpr(b.body),\";\");this._jump(n);this.setBlock(m);k(g,\"=\",this.vexpr(b.orelse),\";\");this._jump(n);this.setBlock(n);return g};a.prototype.cgenexpgen=function(b,m,n){var g=this.newBlock(\"start for \"+m),t=this.newBlock(\"skip for \"+m);this.newBlock(\"if cleanup for \"+m);var l=this.newBlock(\"end for \"+m),q=b[m];if(0===m)var w=\"$loc.$iter0\";else{var x=this.vexpr(q.iter);w=\"$loc.\"+this.gensym(\"iter\");\nk(w,\"=\",\"Sk.abstr.iter(\",x,\");\")}this._jump(g);this.setBlock(g);this.annotateSource(n);k(\"$ret = Sk.abstr.iternext(\",w,this.u.canSuspend?\", true\":\", false\",\");\");this._checkSuspension(n);x=this._gr(\"next\",\"$ret\");this._jumpundef(x,l);this.vexpr(q.target,x);var v=q.ifs?q.ifs.length:0;for(w=0;w=b.length&&(this.annotateSource(n),b=this.vexpr(n),k(\"return [\",t,\"/*resume*/,\",b,\"/*ret*/];\"),\nthis.setBlock(t));this._jump(g);this.setBlock(l);1===m&&k(\"return Sk.builtin.none.none$;\")};a.prototype.cgenexp=function(b){var m=this.buildcodeobj(b,new Sk.builtin.str(\"\"),null,null,function(n){this.cgenexpgen(b.generators,0,b.elt)});m=this._gr(\"gener\",\"Sk.misceval.callsimArray(\",m,\");\");k(m,\".gi$locals.$iter0=Sk.abstr.iter(\",this.vexpr(b.generators[0].iter),\");\");return m};a.prototype.cclass=function(b){Sk.asserts.assert(b instanceof Sk.astnodes.ClassDef);var m=this.vseqexpr(b.decorator_list);\nvar n=this.vseqexpr(b.bases);let g=this.cunpackkwstoarray(b.keywords);var t=this.enterScope(b.name,b,b.lineno);var l=this.newBlock(\"class entry\");this.u.prefixCode=\"var \"+t+\"=(function $\"+b.name.v+\"$class_outer($globals,$locals,$cell){var $gbl=$globals,$loc=$locals,$free=$globals;\";this.u.switchCode+=\"(function $\"+b.name.v+\"$_closure($cell){\";this.u.switchCode+=\"var $blk=\"+l+\",$exc=[],$ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;\";null!==Sk.execLimit&&(this.u.switchCode+=\n\"if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}\");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.switchCode+=\"if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}\");this.u.switchCode+=\"while(true){try{\";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+=\"switch($blk){\";this.u.suffixCode=\"}}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '\"+\nthis.filename+\"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }}}\";this.u.suffixCode+=\"}).call(null, $cell);});\";this.u.private_=b.name;this.cbody(b.body,b.name);k(\"return;\");this.exitScope();k(\"$ret = Sk.misceval.buildClass($gbl,\",t,\",\",b.name.$r().v,\",[\",n,\"], $cell, \",g,\");\");this._checkSuspension();for(let q of m.reverse())k(\"$ret = Sk.misceval.callsimOrSuspendArray(\",q,\", [$ret]);\"),this._checkSuspension();this.nameop(b.name,Sk.astnodes.Store,\"$ret\")};a.prototype.ccontinue=\nfunction(b){var m=this.peekFinallyBlock();if(0==this.u.continueBlocks.length)throw new Sk.builtin.SyntaxError(\"'continue' outside loop\",this.filename,b.lineno);b=this.u.continueBlocks[this.u.continueBlocks.length-1];Sk.asserts.assert(this.u.breakBlocks.length===this.u.continueBlocks.length);m&&m.breakDepth==this.u.continueBlocks.length?k(\"$postfinally={isBreak:true,gotoBlock:\",b,\"};\"):this._jump(b)};a.prototype.cbreak=function(b){var m=this.peekFinallyBlock();if(0===this.u.breakBlocks.length)throw new Sk.builtin.SyntaxError(\"'break' outside loop\",\nthis.filename,b.lineno);b=this.u.breakBlocks[this.u.breakBlocks.length-1];m&&m.breakDepth==this.u.breakBlocks.length?k(\"$postfinally={isBreak:true,gotoBlock:\",b,\"};\"):this._jump(b)};a.prototype.vstmt=function(b,m){this.u.lineno=b.lineno;this.u.linenoSet=!1;this.u.localtemps=[];if(Sk.debugging&&this.u.canSuspend){var n=this.newBlock(\"debug breakpoint for line \"+b.lineno);k(\"if (Sk.breakpoints('\"+this.filename+\"',\"+b.lineno+\",\"+b.col_offset+\")) {\",\"var $susp = $saveSuspension({data: {type: 'Sk.debug'}, resume: function() {}}, '\"+\nthis.filename+\"',\"+b.lineno+\",\"+b.col_offset+\");\",\"$susp.$blk = \"+n+\";\",\"$susp.optional = true;\",\"return $susp;\",\"}\");this._jump(n);this.setBlock(n);this.u.doesSuspend=!0}this.annotateSource(b);switch(b.constructor){case Sk.astnodes.FunctionDef:this.cfunction(b,m);break;case Sk.astnodes.ClassDef:this.cclass(b);break;case Sk.astnodes.Return:if(this.u.ste.blockType!==Sk.SYMTAB_CONSTS.FunctionBlock)throw new Sk.builtin.SyntaxError(\"'return' outside function\",this.filename,b.lineno);n=b.value?this.vexpr(b.value):\n\"Sk.builtin.none.none$\";0==this.u.finallyBlocks.length?k(\"return \",n,\";\"):(k(\"$postfinally={returning:\",n,\"};\"),this._jump(this.peekFinallyBlock().blk));break;case Sk.astnodes.Delete:this.vseqexpr(b.targets);break;case Sk.astnodes.Assign:var g=b.targets.length;n=this.vexpr(b.value);for(m=0;m\"!==b.name.v){var m=b.name.$r().v;m=m.substring(1,m.length-1);k(b.scopename,\".co_name=new Sk.builtins['str']('\",m,\"');\");this.stack.length&&\"class\"==\nthis.u.ste.blockType&&k(b.scopename,\".co_qualname=new Sk.builtins['str']('\"+this.u.name.v+\".\"+m+\"');\")}for(var n in b.consts)b.consts.hasOwnProperty(n)&&(b.suffixCode+=n+\" = \"+b.consts[n]+\";\")};a.prototype.cbody=function(b,m){var n=0;const g=this.maybeCDocstringOfBody(b);null!==g&&(k(\"$loc.__doc__ = \",g,\";\"),n=1);for(;n\"),b,0,this.canSuspend),n=this.newBlock(\"module entry\");this.u.prefixCode=\"var \"+m+\"=(function($forcegbl, $forceloc){\";\nthis.u.varDeclsCode=\"var $gbl = $forcegbl || {}, $blk=\"+n+\",$exc=[],$loc=$forceloc || $gbl,$cell={},$err=undefined;var $ret=undefined,$postfinally=undefined,$currLineNo=undefined,$currColNo=undefined;\";null!==Sk.execLimit&&(this.u.varDeclsCode+=\"if (typeof Sk.execStart === 'undefined') {Sk.execStart = Date.now()}\");null!==Sk.yieldLimit&&this.u.canSuspend&&(this.u.varDeclsCode+=\"if (typeof Sk.lastYield === 'undefined') {Sk.lastYield = Date.now()}\");this.u.varDeclsCode+=\"var $waking=false; if (\"+m+\n\".$wakingSuspension!==undefined) { $wakeFromSuspension(); $waking=true; }if (Sk.retainGlobals) { if (Sk.globals) { $gbl = Sk.globals; Sk.globals = $gbl; $loc = $gbl; } else { Sk.globals = $gbl; }} else { Sk.globals = $gbl; }\";this.u.switchCode=\"while(true){try{\";this.u.switchCode+=this.outputInterruptTest();this.u.switchCode+=\"switch($blk){\";this.u.suffixCode=\"}\";this.u.suffixCode+=\"}catch(err){ if (!(err instanceof Sk.builtin.BaseException)) { err = new Sk.builtin.ExternalError(err); } err.traceback.push({lineno: $currLineNo, colno: $currColNo, filename: '\"+\nthis.filename+\"'}); if ($exc.length>0) { $err = err; $blk=$exc.pop(); continue; } else { throw err; }} } });\";switch(b.constructor){case Sk.astnodes.Module:this.cbody(b.body);k(\"return $loc;\");break;default:Sk.asserts.fail(\"todo; unhandled case in compilerMod\")}this.exitScope();this.result.push(this.outputAllUnits());return m};Sk.compile=function(b,m,n,g){n=Sk.__future__;Sk.__future__=Object.create(Sk.__future__);var t=Sk.parse(m,b),l=Sk.astFromParse(t.cst,m,t.flags);t=t.flags;var q=Sk.symboltable(l,\nm);b=new a(m,q,t,g,b);g=b.cmod(l);Sk.__future__=n;return{funcname:\"$compiledmod\",code:`var $compiledmod = function() {${b.result.join(\"\")}\\nreturn ${g};}();\\n$compiledmod;`,filename:m}};Sk.exportSymbol(\"Sk.compile\",Sk.compile);Sk.resetCompiler=function(){Sk.gensymcount=0};Sk.exportSymbol(\"Sk.resetCompiler\",Sk.resetCompiler);Sk.fixReserved=c;Sk.exportSymbol(\"Sk.fixReserved\",Sk.fixReserved);Sk.unfixReserved=function(b){return b.replace(h,\"\")};Sk.exportSymbol(\"Sk.unfixReserved\",Sk.unfixReserved);Sk.mangleName=\ne;Sk.exportSymbol(\"Sk.mangleName\",Sk.mangleName);Sk.reservedWords_=p;Sk.exportSymbol(\"Sk.reservedWords_\",Sk.reservedWords_)},function(D,R){Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.importSearchPathForName=function(a,d,c){var e=a.replace(/\\./g,\"/\"),k=function(p,h){return Sk.misceval.chain(Sk.misceval.tryCatch(function(){return Sk.read(p)},function(f){}),function(f){if(void 0!==f)return new Sk.misceval.Break({filename:p,code:f,packagePath:h})})};void 0===c&&(c=Sk.realsyspath);return Sk.misceval.iterFor(c.tp$iter(),\nfunction(p){return Sk.misceval.chain(k(p.v+\"/\"+e+d,!1),function(h){return h?h:k(p.v+\"/\"+e+\"/__init__\"+d,p.v+\"/\"+e)})})};Sk.importSetUpPath=function(a){if(!Sk.realsyspath){var d=[new Sk.builtin.str(\"src/builtin\"),new Sk.builtin.str(\"src/lib\"),new Sk.builtin.str(\".\")];for(a=0;aJ;++J)r+=\" \";F[y-1]=\"/* \"+r+y+\" */ \"+F[y-1]}return F.join(\"\\n\")};L=z(L);Sk.debugout(L)}\"$compiledmod\"!==E.funcname&&(L+=\"\\n\"+E.funcname+\";\");var G=new Sk.builtin.str(c),K=new Sk.builtin.str(a);Sk.sysmodules.mp$ass_subscript(G,n);k&&k.tp$setattr(K,n);var S=Sk.global.eval(L);n.init$dict(G,Sk.builtin.none.none$);n.$d.__package__=E.packagePath?G:x?new Sk.builtin.str(l+x):t?t:Sk.builtin.none.none$;\nE.packagePath&&(n.$d.__path__=new Sk.builtin.tuple([new Sk.builtin.str(E.packagePath)]));E.filename&&\"$builtinmodule\"!==E.funcname&&(n.$d.__file__=new Sk.builtin.str(E.filename));var U=k&&k.$initializing;n.$initializing=!0;k&&!U&&(k.$initializing=!0);return Sk.misceval.tryCatch(()=>Sk.misceval.chain(S(n.$d),r=>{n.$initializing=!1;k&&!U&&(k.$initializing=!1);return r}),r=>{try{Sk.abstr.objectDelItem(Sk.sysmodules,G)}catch(y){}if(k)try{k.tp$setattr(K,void 0)}catch(y){}n.$initializing=!1;k&&!U&&(k.$initializing=\n!1);throw r;})}},function(E){var L;if(void 0===E){if(p&&!g)return;throw new Sk.builtin.ModuleNotFoundError(\"No module named \"+Sk.misceval.objectRepr(new Sk.builtin.str(a)));}if(E!==n.$d){for(L in n.$d)E[L]||(E[L]=n.$d[L]);n.$d=E}if(Sk.onAfterImport&&\"function\"===typeof Sk.onAfterImport)try{Sk.onAfterImport(a)}catch(z){}return g?(m.tp$setattr(new Sk.builtin.str(w[w.length-1]),n),g):n})});return h?v:Sk.misceval.retryOptionalSuspensionOrThrow(v)};Sk.importModule=function(a,d,c){return Sk.importModuleInternal_(a,\nd,void 0,void 0,void 0,!1,c)};Sk.importMain=function(a,d,c){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,d,\"__main__\",void 0,void 0,!1,c)};Sk.importMainWithBody=function(a,d,c,e){Sk.dateSet=!1;Sk.filesLoaded=!1;Sk.sysmodules=new Sk.builtin.dict([]);Sk.realsyspath=void 0;Sk.resetCompiler();return Sk.importModuleInternal_(a,d,\"__main__\",c,void 0,!1,e)};Sk.importBuiltinWithBody=function(a,d,c,e){return Sk.importModuleInternal_(a,\nd,\"__builtin__.\"+a,c,void 0,!1,e)};Sk.builtin.__import__=function(a,d,c,e,k){a=a.toString();var p=Sk.globals,h;null==k&&(k=Sk.__future__.absolute_import?0:-1);if(0!==k&&d.__package__&&d.__package__!==Sk.builtin.none.none$){if((h=d.__package__.v)&&0=d.length)throw new Sk.builtin.ImportError(\"Attempted relative import beyond toplevel package\");d.length-=k-1;h=d.join(\".\")}var f=Sk.sysmodules.quick$lookup(new Sk.builtin.str(h))}if(0Sk.importModuleInternal_(g,\nvoid 0,void 0,void 0,m,!0,!0))}return Sk.misceval.chain(...b,function(){Sk.asserts.assert(m);return m})}return b},function(b){p!==Sk.globals&&(Sk.globals=p);return b})};Sk.importStar=function(a,d,c){if(c=a.tp$getattr(new Sk.builtin.str(\"__all__\")))for(let e=Sk.abstr.iter(c),k=e.tp$iternext();void 0!==k;k=e.tp$iternext())d[k.v]=Sk.abstr.gattr(a,k);else{c=Object.getOwnPropertyNames(a.$d);for(let e in c)\"_\"!=c[e].charAt(0)&&(d[c[e]]=a.$d[c[e]])}};Sk.exportSymbol(\"Sk.importMain\",Sk.importMain);Sk.exportSymbol(\"Sk.importMainWithBody\",\nSk.importMainWithBody);Sk.exportSymbol(\"Sk.importBuiltinWithBody\",Sk.importBuiltinWithBody);Sk.exportSymbol(\"Sk.builtin.__import__\",Sk.builtin.__import__);Sk.exportSymbol(\"Sk.importStar\",Sk.importStar)},function(D,R){Sk.builtin.timSort=function(a,d){this.list=new Sk.builtin.list(a.v);this.MIN_GALLOP=7;this.listlength=d?d:a.sq$length()};Sk.builtin.timSort.prototype.lt=function(a,d){return Sk.misceval.richCompareBool(a,d,\"Lt\")};Sk.builtin.timSort.prototype.le=function(a,d){return!this.lt(d,a)};Sk.builtin.timSort.prototype.setitem=\nfunction(a,d){this.list.v[a]=d};Sk.builtin.timSort.prototype.binary_sort=function(a,d){var c;for(c=a.base+d;c>1);this.lt(d,a.getitem(p))?k=p:e=p+1}Sk.asserts.assert(e===k);for(p=c;p>e;p--)a.setitem(p,a.getitem(p-1));a.setitem(e,d)}};Sk.builtin.timSort.prototype.count_run=function(a){var d;if(1>=a.len){var c=a.len;var e=!1}else if(c=2,this.lt(a.getitem(a.base+1),a.getitem(a.base)))for(e=!0,d=a.base+2;dd.len)){this.merge_init();for(a=this.merge_compute_minrun(d.len);0k&&(b=k);f+=c;b+=c}else{for(k=c+1;bk&&(b=k);h=c-f;f=c-b;b=h}Sk.asserts.assert(-1<=f>1),e(d.getitem(d.base+c),a)?f=c+1:b=c;Sk.asserts.assert(f==b);return b};Sk.builtin.timSort.prototype.merge_init=function(){this.min_gallop=this.MIN_GALLOP;this.pending=[]};Sk.builtin.timSort.prototype.merge_lo=function(a,d){var c,\ne,k;Sk.asserts.assert(0=p)break}else{this.setitem(h,a.popleft());h++;if(1==a.len)return;c++;e=0;if(c>=p)break}for(p+=1;;){this.min_gallop=p-=1=a.len)return;this.setitem(h,d.popleft());h++;if(0===d.len)return;e=this.gallop(a.getitem(a.base),d,0,!1);for(k=d.base;k=p)break}else{h--;this.setitem(h,b);d.len--;if(1==d.len)return;e++;c=0;if(e>=p)break}}for(p+=\n1;;){this.min_gallop=p-=1a.base+m-1;k--)h--,this.setitem(h,a.getitem(k));a.len-=c;if(0===a.len)return;h--;this.setitem(h,d.popright());if(1==d.len)return;f=a.getitem(a.base+a.len-1);m=this.gallop(f,d,d.len-1,!1);e=d.len-m;for(k=d.base+d.len-1;k>d.base+m-1;k--)h--,this.setitem(h,d.getitem(k));d.len-=e;if(1>=d.len)return;h--;this.setitem(h,a.popright());if(0===a.len)return;if(ca.base-1;k--)h--,this.setitem(h,a.getitem(k));for(k=d.base+d.len-1;k>d.base-1;k--)h--,this.setitem(h,d.getitem(k))}};Sk.builtin.timSort.prototype.merge_at=function(a){0>a&&(a=this.pending.length+a);var d=this.pending[a];var c=this.pending[a+1];Sk.asserts.assert(0>=1;return a+d};Sk.builtin.listSlice=function(a,d,c){this.list=a;this.base=d;this.len=c};Sk.builtin.listSlice.prototype.copyitems=function(){var a=this.base,d=this.base+this.len;Sk.asserts.assert(0<=a<=d);return new Sk.builtin.listSlice(new Sk.builtin.list(this.list.v.slice(a,\nd)),0,this.len)};Sk.builtin.listSlice.prototype.advance=function(a){this.base+=a;this.len-=a;Sk.asserts.assert(this.base<=this.list.sq$length())};Sk.builtin.listSlice.prototype.getitem=function(a){return this.list.v[a]};Sk.builtin.listSlice.prototype.setitem=function(a,d){this.list.v[a]=d};Sk.builtin.listSlice.prototype.popleft=function(){var a=this.list.v[this.base];this.base++;this.len--;return a};Sk.builtin.listSlice.prototype.popright=function(){this.len--;return this.list.v[this.base+this.len]};\nSk.builtin.listSlice.prototype.reverse=function(){for(var a,d,c=this.list,e=this.base,k=e+this.len-1;e same as super(__class__, )\\nsuper(type) -> unbound super object\\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\\nTypical use to call a cooperative superclass method:\\nclass C(B):\\n def meth(self, arg):\\n super().meth(arg)\\nThis works for class methods too:\\nclass C(B):\\n @classmethod\\n def cmeth(cls, arg):\\n super().cmeth(arg)\\n\",\ntp$new:Sk.generic.new,tp$init(a,d){Sk.abstr.checkNoKwargs(\"super\",d);Sk.abstr.checkArgsLen(\"super\",a,1,2);d=a[0];a=a[1];if(!Sk.builtin.checkClass(d))throw new Sk.builtin.TypeError(\"must be type, not \"+Sk.abstr.typeName(d));this.obj=a;this.type=d;null!=this.obj&&(this.obj_type=this.$supercheck(d,this.obj))},$r(){return this.obj?new Sk.builtin.str(\", <\"+Sk.abstr.typeName(this.obj)+\" object>>\"):new Sk.builtin.str(\", NULL>\")},tp$getattr(a,d){let c=this.obj_type;if(null==c)return Sk.generic.getAttr.call(this,a,d);var e=c.prototype.tp$mro;const k=e.length;if(\"__class__\"===a.v)return Sk.generic.getAttr.call(this,a,d);let p;for(p=0;p+1=k)return Sk.generic.getAttr.call(this,a,d);a=a.$mangled;let h;for(;p{d+=0{this.is$typevar(d)&&0>this.tuple$index(a,d)&&a.push(d)});this.$params=new Sk.builtin.tuple(a)},tuple$index(a,d){return a.indexOf(d)},is$typevar(a){if(\"TypeVar\"!==a.tp$name)return!1;a=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$module);if(void 0===a)throw Sk.builtin.RuntimeError(\"found object withought a __module__\");return\"typing\"===\na.toString()},ga$repr(a){if(a===Sk.builtin.Ellipsis)return\"...\";if(Sk.abstr.lookupSpecial(a,this.str$orig)&&Sk.abstr.lookupSpecial(a,this.str$args))return Sk.misceval.objectRepr(a);const d=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$qualname);if(void 0===d)return Sk.misceval.objectRepr(a);const c=Sk.abstr.lookupSpecial(a,Sk.builtin.str.$module);return void 0===c||Sk.builtin.checkNone(c)?Sk.misceval.objectRepr(a):\"builtins\"===c.toString()?d.toString():c.toString()+\".\"+d.toString()},str$orig:new Sk.builtin.str(\"__origin__\"),\nstr$args:new Sk.builtin.str(\"__args__\"),attr$exc:\"__origin__ __args__ __parameters__ __mro_entries__ __reduce_ex__ __reduce__\".split(\" \")}})},function(D,R){function a(e,k){let p=void 0;if(void 0===e||Sk.builtin.checkNone(e))e=void 0;else if(e instanceof Sk.builtin.dict)p={},e.$items().forEach(h=>{var [f,b]=h;Sk.builtin.checkString(f)&&(p[f.$mangled]=b)});else throw new Sk.builtin.TypeError(k+\" must be a dict or None, not \"+Sk.abstr.typeName(e));return p}function d(e,k){if(void 0!==e&&!Sk.builtin.checkNone(e))for(let p in k)e.mp$ass_subscript(new Sk.builtin.str(Sk.unfixReserved(p)),\nk[p])}Sk.builtins={round:null,len:null,min:null,max:null,sum:null,abs:null,fabs:null,ord:null,chr:null,hex:null,oct:null,bin:null,dir:null,repr:null,open:null,isinstance:null,hash:null,getattr:null,hasattr:null,id:null,sorted:null,any:null,all:null,enumerate:Sk.builtin.enumerate,filter:Sk.builtin.filter_,map:Sk.builtin.map_,range:Sk.builtin.range_,reversed:Sk.builtin.reversed,zip:Sk.builtin.zip_,BaseException:Sk.builtin.BaseException,AttributeError:Sk.builtin.AttributeError,ArithmeticError:Sk.builtin.ArithmeticError,\nValueError:Sk.builtin.ValueError,Exception:Sk.builtin.Exception,ZeroDivisionError:Sk.builtin.ZeroDivisionError,AssertionError:Sk.builtin.AssertionError,ImportError:Sk.builtin.ImportError,ModuleNotFoundError:Sk.builtin.ModuleNotFoundError,IndentationError:Sk.builtin.IndentationError,IndexError:Sk.builtin.IndexError,LookupError:Sk.builtin.LookupError,KeyError:Sk.builtin.KeyError,TypeError:Sk.builtin.TypeError,UnicodeDecodeError:Sk.builtin.UnicodeDecodeError,UnicodeEncodeError:Sk.builtin.UnicodeEncodeError,\nNameError:Sk.builtin.NameError,UnboundLocalError:Sk.builtin.UnboundLocalError,IOError:Sk.builtin.IOError,NotImplementedError:Sk.builtin.NotImplementedError,SystemExit:Sk.builtin.SystemExit,OverflowError:Sk.builtin.OverflowError,OperationError:Sk.builtin.OperationError,NegativePowerError:Sk.builtin.NegativePowerError,RuntimeError:Sk.builtin.RuntimeError,RecursionError:Sk.builtin.RecursionError,StopIteration:Sk.builtin.StopIteration,SyntaxError:Sk.builtin.SyntaxError,SystemError:Sk.builtin.SystemError,\nKeyboardInterrupt:Sk.builtin.KeyboardInterrupt,float_$rw$:Sk.builtin.float_,int_$rw$:Sk.builtin.int_,bool:Sk.builtin.bool,complex:Sk.builtin.complex,dict:Sk.builtin.dict,file:Sk.builtin.file,frozenset:Sk.builtin.frozenset,\"function\":Sk.builtin.func,generator:Sk.builtin.generator,list:Sk.builtin.list,long_$rw$:Sk.builtin.lng,method:Sk.builtin.method,object:Sk.builtin.object,slice:Sk.builtin.slice,str:Sk.builtin.str,set:Sk.builtin.set,tuple:Sk.builtin.tuple,type:Sk.builtin.type,input:null,raw_input:new Sk.builtin.func(Sk.builtin.raw_input),\nsetattr:null,jseval:Sk.builtin.jseval,jsmillis:Sk.builtin.jsmillis,quit:new Sk.builtin.func(Sk.builtin.quit),exit:new Sk.builtin.func(Sk.builtin.quit),print:null,divmod:null,format:null,globals:null,issubclass:null,iter:null,execfile:Sk.builtin.execfile,help:Sk.builtin.help,memoryview:Sk.builtin.memoryview,reload:Sk.builtin.reload,super_$rw$:Sk.builtin.super_,unichr:new Sk.builtin.func(Sk.builtin.unichr),vars:Sk.builtin.vars,apply_$rw$:Sk.builtin.apply_,buffer:Sk.builtin.buffer,coerce:Sk.builtin.coerce,\nintern:Sk.builtin.intern,property:Sk.builtin.property,classmethod:Sk.builtin.classmethod,staticmethod:Sk.builtin.staticmethod,Ellipsis:Sk.builtin.Ellipsis};D=Sk.builtin.none.none$;R=new Sk.builtin.tuple;const c=new Sk.builtin.int_(0);Sk.abstr.setUpModuleMethods(\"builtins\",Sk.builtins,{__import__:{$meth(e,k,p,h,f){if(!Sk.builtin.checkString(e))throw new Sk.builtin.TypeError(\"__import__() argument 1 must be str, not \"+e.tp$name);if(\"\"===e.v&&0===f.v)throw new Sk.builtin.ValueError(\"Empty module name\");\nk=a(k,\"globals\")||{};h=Sk.ffi.remapToJs(h);f=Sk.ffi.remapToJs(f);return Sk.builtin.__import__(e,k,void 0,h,f)},$flags:{NamedArgs:[\"name\",\"globals\",\"locals\",\"fromlist\",\"level\"],Defaults:[D,D,R,c]},$textsig:null,$doc:\"__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module\\n\\nImport a module. Because this function is meant for use by the Python\\ninterpreter and not for general use, it is better to use\\nimportlib.import_module() to programmatically import a module.\\n\\nThe globals argument is only used to determine the context;\\nthey are not modified. The locals argument is unused. The fromlist\\nshould be a list of names to emulate ``from name import ...'', or an\\nempty list to emulate ``import name''.\\nWhen importing a module from a package, note that __import__('A.B', ...)\\nreturns package A when fromlist is empty, but its submodule B when\\nfromlist is not empty. The level argument is used to determine whether to\\nperform absolute or relative imports: 0 is absolute, while a positive number\\nis the number of parent directories to search relative to the current module.\"},\nabs:{$meth:Sk.builtin.abs,$flags:{OneArg:!0},$textsig:\"($module, x, /)\",$doc:\"Return the absolute value of the argument.\"},all:{$meth:Sk.builtin.all,$flags:{OneArg:!0},$textsig:\"($module, iterable, /)\",$doc:\"Return True if bool(x) is True for all values x in the iterable.\\n\\nIf the iterable is empty, return True.\"},any:{$meth:Sk.builtin.any,$flags:{OneArg:!0},$textsig:\"($module, iterable, /)\",$doc:\"Return True if bool(x) is True for any x in the iterable.\\n\\nIf the iterable is empty, return False.\"},\nascii:{$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return an ASCII-only representation of an object.\\n\\nAs repr(), return a string containing a printable representation of an\\nobject, but escape the non-ASCII characters in the string returned by\\nrepr() using \\\\\\\\x, \\\\\\\\u or \\\\\\\\U escapes. This generates a string similar\\nto that returned by repr() in Python 2.\"},bin:{$meth:Sk.builtin.bin,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the binary representation of an integer.\\n\\n >>> bin(2796202)\\n '0b1010101010101010101010'\"},\ncallable:{$meth:Sk.builtin.callable,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return whether the object is callable (i.e., some kind of function).\\n\\nNote that classes are callable, as are instances of classes with a\\n__call__() method.\"},chr:{$meth:Sk.builtin.chr,$flags:{OneArg:!0},$textsig:\"($module, i, /)\",$doc:\"Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.\"},compile:{$meth:Sk.builtin.compile,$flags:{MinArgs:3,MaxArgs:6},$textsig:\"($module, /, source, filename, mode, flags=0,\\n dont_inherit=False, optimize=-1)\",\n$doc:\"Compile source into a code object that can be executed by exec() or eval().\\n\\nThe source code may represent a Python module, statement or expression.\\nThe filename will be used for run-time error messages.\\nThe mode must be 'exec' to compile a module, 'single' to compile a\\nsingle (interactive) statement, or 'eval' to compile an expression.\\nThe flags argument, if present, controls which future statements influence\\nthe compilation of the code.\\nThe dont_inherit argument, if true, stops the compilation inheriting\\nthe effects of any future statements in effect in the code calling\\ncompile; if absent or false these statements do influence the compilation,\\nin addition to any features explicitly specified.\"},\ndelattr:{$meth:Sk.builtin.delattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, name, /)\",$doc:\"Deletes the named attribute from the given object.\\n\\ndelattr(x, 'y') is equivalent to ``del x.y''\"},dir:{$meth:Sk.builtin.dir,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"dir([object]) -> list of strings\\n\\nIf called without an argument, return the names in the current scope.\\nElse, return an alphabetized list of names comprising (some of) the attributes\\nof the given object, and of attributes reachable from it.\\nIf the object supplies a method named __dir__, it will be used; otherwise\\nthe default dir() logic is used and returns:\\n for a module object: the module's attributes.\\n for a class object: its attributes, and recursively the attributes\\n of its bases.\\n for any other object: its attributes, its class's attributes, and\\n recursively the attributes of its class's base classes.\"},\ndivmod:{$meth:Sk.builtin.divmod,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, x, y, /)\",$doc:\"Return the tuple (x//y, x%y). Invariant: div*y + mod == x.\"},eval_$rw$:{$name:\"eval\",$meth:function(e,k,p){const h=a(k,\"globals\"),f=a(p,\"locals\");return Sk.misceval.chain(Sk.builtin.eval(e,h,f),b=>{d(k,h);d(p,f);return b})},$flags:{MinArgs:1,MaxArgs:3},$textsig:\"($module, source, globals=None, locals=None, /)\",$doc:\"Evaluate the given source in the context of globals and locals.\\n\\nThe source may be a string representing a Python expression\\nor a code object as returned by compile().\\nThe globals must be a dictionary and locals can be any mapping,\\ndefaulting to the current globals and locals.\\nIf only globals is given, locals defaults to it.\"},\nexec:{$meth:function(e,k,p){const h=a(k,\"globals\"),f=a(p,\"locals\");return Sk.misceval.chain(Sk.builtin.exec(e,h,f),b=>{d(k,h);d(p,f);return Sk.builtin.none.none$})},$flags:{MinArgs:1,MaxArgs:3},$textsig:\"($module, source, globals=None, locals=None, /)\",$doc:\"Execute the given source in the context of globals and locals.\\n\\nThe source may be a string representing one or more Python statements\\nor a code object as returned by compile().\\nThe globals must be a dictionary and locals can be any mapping,\\ndefaulting to the current globals and locals.\\nIf only globals is given, locals defaults to it.\"},\nformat:{$meth:Sk.builtin.format,$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($module, value, format_spec='', /)\",$doc:\"Return value.__format__(format_spec)\\n\\nformat_spec defaults to the empty string.\\nSee the Format Specification Mini-Language section of help('FORMATTING') for\\ndetails.\"},getattr:{$meth:Sk.builtin.getattr,$flags:{MinArgs:2,MaxArgs:3},$textsig:null,$doc:\"getattr(object, name[, default]) -> value\\n\\nGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\\nWhen a default argument is given, it is returned when the attribute doesn't\\nexist; without it, an exception is raised in that case.\"},\nglobals:{$meth:Sk.builtin.globals,$flags:{NoArgs:!0},$textsig:\"($module, /)\",$doc:\"Return the dictionary containing the current scope's global variables.\\n\\nNOTE: Updates to this dictionary *will* affect name lookups in the current\\nglobal scope and vice-versa.\"},hasattr:{$meth:Sk.builtin.hasattr,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, name, /)\",$doc:\"Return whether the object has an attribute with the given name.\\n\\nThis is done by calling getattr(obj, name) and catching AttributeError.\"},\nhash:{$meth:Sk.builtin.hash,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the hash value for the given object.\\n\\nTwo objects that compare equal must also have the same hash value, but the\\nreverse is not necessarily true.\"},hex:{$meth:Sk.builtin.hex,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the hexadecimal representation of an integer.\\n\\n >>> hex(12648430)\\n '0xc0ffee'\"},id:{$meth:Sk.builtin.id,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the identity of an object.\\n\\nThis is guaranteed to be unique among simultaneously existing objects.\\n(CPython uses the object's memory address.)\"},\ninput:{$meth:Sk.builtin.input,$flags:{MinArgs:0,MaxArgs:1},$textsig:\"($module, prompt=None, /)\",$doc:\"Read a string from standard input. The trailing newline is stripped.\\n\\nThe prompt string, if given, is printed to standard output without a\\ntrailing newline before reading input.\\n\\nIf the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.\\nOn *nix systems, readline is used if available.\"},isinstance:{$meth:Sk.builtin.isinstance,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, obj, class_or_tuple, /)\",\n$doc:\"Return whether an object is an instance of a class or of a subclass thereof.\\n\\nA tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to\\ncheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)\\nor ...`` etc.\"},issubclass:{$meth:Sk.builtin.issubclass,$flags:{MinArgs:2,MaxArgs:2},$textsig:\"($module, cls, class_or_tuple, /)\",$doc:\"Return whether 'cls' is a derived from another class or is the same class.\\n\\nA tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to\\ncheck against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)\\nor ...`` etc.\"},\niter:{$meth:Sk.builtin.iter,$flags:{MinArgs:1,MaxArgs:2},$textsig:\"($module, iterable /)\",$doc:\"iter(iterable) -> iterator\\niter(callable, sentinel) -> iterator\\n\\nGet an iterator from an object. In the first form, the argument must\\nsupply its own iterator, or be a sequence.\\nIn the second form, the callable is called until it returns the sentinel.\"},len:{$meth:Sk.builtin.len,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the number of items in a container.\"},locals:{$meth:Sk.builtin.locals,\n$flags:{NoArgs:!0},$textsig:\"($module, /)\",$doc:\"Return a dictionary containing the current scope's local variables.\\n\\nNOTE: Whether or not updates to this dictionary will affect name lookups in\\nthe local scope and vice-versa is *implementation dependent* and not\\ncovered by any backwards compatibility guarantees.\"},max:{$meth:Sk.builtin.max,$flags:{FastCall:!0},$textsig:null,$doc:\"max(iterable, *[, default=obj, key=func]) -> value\\nmax(arg1, arg2, *args, *[, key=func]) -> value\\n\\nWith a single iterable argument, return its biggest item. The\\ndefault keyword-only argument specifies an object to return if\\nthe provided iterable is empty.\\nWith two or more arguments, return the largest argument.\"},\nmin:{$meth:Sk.builtin.min,$flags:{FastCall:!0},$textsig:null,$doc:\"min(iterable, *[, default=obj, key=func]) -> value\\nmin(arg1, arg2, *args, *[, key=func]) -> value\\n\\nWith a single iterable argument, return its smallest item. The\\ndefault keyword-only argument specifies an object to return if\\nthe provided iterable is empty.\\nWith two or more arguments, return the smallest argument.\"},next:{$name:\"next\",$meth:Sk.builtin.next_,$flags:{MinArgs:1,MaxArgs:2},$textsig:null,$doc:\"next(iterator[, default])\\n\\nReturn the next item from the iterator. If default is given and the iterator\\nis exhausted, it is returned instead of raising StopIteration.\"},\noct:{$meth:Sk.builtin.oct,$flags:{OneArg:!0},$textsig:\"($module, number, /)\",$doc:\"Return the octal representation of an integer.\\n\\n >>> oct(342391)\\n '0o1234567'\"},open:{$meth:Sk.builtin.open,$flags:{MinArgs:1,MaxArgs:3},$textsig:null,$doc:\"open(name[, mode[, buffering]]) -> file object\\n\\nOpen a file using the file() type, returns a file object. This is the\\npreferred way to open a file. See file.__doc__ for further information.\"},ord:{$meth:Sk.builtin.ord,$flags:{OneArg:!0},$textsig:\"($module, c, /)\",\n$doc:\"Return the Unicode code point for a one-character string.\"},pow:{$meth:Sk.builtin.pow,$flags:{MinArgs:2,MaxArgs:3},$textsig:\"($module, x, y, z=None, /)\",$doc:\"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\\n\\nSome types, such as ints, are able to use a more efficient algorithm when\\ninvoked using the three argument form.\"},print:{$meth:Sk.builtin.print,$flags:{FastCall:!0},$textsig:null,$doc:\"print(value, ..., sep=' ', end='\\\\n', file=sys.stdout, flush=False)\\n\\nPrints the values to a stream, or to sys.stdout by default.\\nOptional keyword arguments:\\nfile: a file-like object (stream); defaults to the current sys.stdout.\\nsep: string inserted between values, default a space.\\nend: string appended after the last value, default a newline.\\nflush: whether to forcibly flush the stream.\"},\nrepr:{$meth:Sk.builtin.repr,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return the canonical string representation of the object.\\n\\nFor many object types, including most builtins, eval(repr(obj)) == obj.\"},round:{$meth:Sk.builtin.round,$flags:{NamedArgs:[\"number\",\"ndigits\"]},$textsig:\"($module, /, number, ndigits=None)\",$doc:\"Round a number to a given precision in decimal digits.\\n\\nThe return value is an integer if ndigits is omitted or None. Otherwise\\nthe return value has the same type as the number. ndigits may be negative.\"},\nsetattr:{$meth:Sk.builtin.setattr,$flags:{MinArgs:3,MaxArgs:3},$textsig:\"($module, obj, name, value, /)\",$doc:\"Sets the named attribute on the given object to the specified value.\\n\\nsetattr(x, 'y', v) is equivalent to ``x.y = v''\"},sorted:{$meth:Sk.builtin.sorted,$flags:{NamedArgs:[null,\"cmp\",\"key\",\"reverse\"],Defaults:[Sk.builtin.none.none$,Sk.builtin.none.none$,Sk.builtin.bool.false$]},$textsig:\"($module, iterable, /, *, key=None, reverse=False)\",$doc:\"Return a new list containing all items from the iterable in ascending order.\\n\\nA custom key function can be supplied to customize the sort order, and the\\nreverse flag can be set to request the result in descending order.\"},\nsum:{$meth:Sk.builtin.sum,$flags:{NamedArgs:[null,\"start\"],Defaults:[new Sk.builtin.int_(0)]},$textsig:\"($module, iterable, /, start=0)\",$doc:\"Return the sum of a 'start' value (default: 0) plus an iterable of numbers\\n\\nWhen the iterable is empty, return the start value.\\nThis function is intended specifically for use with numeric values and may\\nreject non-numeric types.\"},vars:{$meth:Sk.builtin.vars,$flags:{MinArgs:0,MaxArgs:1},$textsig:null,$doc:\"vars([object]) -> dictionary\\n\\nWithout arguments, equivalent to locals().\\nWith an argument, equivalent to object.__dict__.\"}});\nSk.setupObjects=function(e){e?(Sk.builtins.filter=Sk.builtin.filter_,Sk.builtins.map=Sk.builtin.map_,Sk.builtins.zip=Sk.builtin.zip_,Sk.builtins.range=Sk.builtin.range_,delete Sk.builtins.reduce,delete Sk.builtins.xrange,delete Sk.builtins.StandardError,delete Sk.builtins.unicode,delete Sk.builtins.basestring,delete Sk.builtins.long_$rw$,Sk.builtin.int_.prototype.$r=function(){return new Sk.builtin.str(this.v.toString())},delete Sk.builtin.int_.prototype.tp$str,delete Sk.builtin.bool.prototype.tp$str,\ndelete Sk.builtins.raw_input,delete Sk.builtins.unichr,delete Sk.builtin.str.prototype.decode,Sk.builtins.bytes=Sk.builtin.bytes,Sk.builtins.ascii=new Sk.builtin.sk_method({$meth:Sk.builtin.ascii,$flags:{OneArg:!0},$textsig:\"($module, obj, /)\",$doc:\"Return an ASCII-only representation of an object.\\n\\nAs repr(), return a string containing a printable representation of an\\nobject, but escape the non-ASCII characters in the string returned by\\nrepr() using \\\\\\\\x, \\\\\\\\u or \\\\\\\\U escapes. This generates a string similar\\nto that returned by repr() in Python 2.\"},\nnull,\"builtins\")):(Sk.builtins.range=new Sk.builtin.sk_method({$meth:Sk.builtin.range,$name:\"range\",$flags:{MinArgs:1,MaxArgs:3}},void 0,\"builtins\"),Sk.builtins.xrange=new Sk.builtin.sk_method({$meth:Sk.builtin.xrange,$name:\"xrange\",$flags:{MinArgs:1,MaxArgs:3}},null,\"builtins\"),Sk.builtins.reduce=new Sk.builtin.sk_method({$meth:Sk.builtin.reduce,$name:\"reduce\",$flags:{MinArgs:2,MaxArgs:3}},null,\"builtins\"),Sk.builtins.filter=new Sk.builtin.func(Sk.builtin.filter),Sk.builtins.map=new Sk.builtin.func(Sk.builtin.map),\nSk.builtins.zip=new Sk.builtin.func(Sk.builtin.zip),Sk.builtins.StandardError=Sk.builtin.Exception,Sk.builtins.unicode=Sk.builtin.str,Sk.builtins.basestring=Sk.builtin.str,Sk.builtins.long_$rw$=Sk.builtin.lng,Sk.builtin.int_.prototype.$r=function(){const k=this.v;return\"number\"===typeof k?new Sk.builtin.str(k.toString()):new Sk.builtin.str(k.toString()+\"L\")},Sk.builtin.int_.prototype.tp$str=function(){return new Sk.builtin.str(this.v.toString())},Sk.builtin.bool.prototype.tp$str=function(){return this.$r()},\nSk.builtins.raw_input=new Sk.builtin.func(Sk.builtin.raw_input),Sk.builtins.unichr=new Sk.builtin.func(Sk.builtin.unichr),Sk.builtin.str.prototype.decode=Sk.builtin.str.$py2decode,delete Sk.builtins.bytes,delete Sk.builtins.ascii)};Sk.exportSymbol(\"Sk.setupObjects\",Sk.setupObjects);Sk.exportSymbol(\"Sk.builtins\",Sk.builtins)},function(D,R){Sk.builtin.str.$empty=new Sk.builtin.str(\"\");Sk.builtin.str.$emptystr=Sk.builtin.str.$empty;Sk.builtin.str.$utf8=new Sk.builtin.str(\"utf-8\");Sk.builtin.str.$ascii=\nnew Sk.builtin.str(\"ascii\");Sk.builtin.str.$default_factory=new Sk.builtin.str(\"default_factory\");Sk.builtin.str.$imag=new Sk.builtin.str(\"imag\");Sk.builtin.str.$real=new Sk.builtin.str(\"real\");Sk.builtin.str.$abs=new Sk.builtin.str(\"__abs__\");Sk.builtin.str.$ann=new Sk.builtin.str(\"__annotations__\");Sk.builtin.str.$bases=new Sk.builtin.str(\"__bases__\");Sk.builtin.str.$bytes=new Sk.builtin.str(\"__bytes__\");Sk.builtin.str.$call=new Sk.builtin.str(\"__call__\");Sk.builtin.str.$class=new Sk.builtin.str(\"__class__\");\nSk.builtin.str.$class_getitem=new Sk.builtin.str(\"__class_getitem__\");Sk.builtin.str.$cmp=new Sk.builtin.str(\"__cmp__\");Sk.builtin.str.$complex=new Sk.builtin.str(\"__complex__\");Sk.builtin.str.$contains=new Sk.builtin.str(\"__contains__\");Sk.builtin.str.$copy=new Sk.builtin.str(\"__copy__\");Sk.builtin.str.$dict=new Sk.builtin.str(\"__dict__\");Sk.builtin.str.$dir=new Sk.builtin.str(\"__dir__\");Sk.builtin.str.$doc=new Sk.builtin.str(\"__doc__\");Sk.builtin.str.$enter=new Sk.builtin.str(\"__enter__\");Sk.builtin.str.$eq=\nnew Sk.builtin.str(\"__eq__\");Sk.builtin.str.$exit=new Sk.builtin.str(\"__exit__\");Sk.builtin.str.$index=new Sk.builtin.str(\"__index__\");Sk.builtin.str.$init=new Sk.builtin.str(\"__init__\");Sk.builtin.str.$initsubclass=new Sk.builtin.str(\"__init_subclass__\");Sk.builtin.str.$int_=new Sk.builtin.str(\"__int__\");Sk.builtin.str.$iter=new Sk.builtin.str(\"__iter__\");Sk.builtin.str.$file=new Sk.builtin.str(\"__file__\");Sk.builtin.str.$float_=new Sk.builtin.str(\"__float__\");Sk.builtin.str.$format=new Sk.builtin.str(\"__format__\");\nSk.builtin.str.$ge=new Sk.builtin.str(\"__ge__\");Sk.builtin.str.$getattr=new Sk.builtin.str(\"__getattr__\");Sk.builtin.str.$getattribute=new Sk.builtin.str(\"__getattribute__\");Sk.builtin.str.$getitem=new Sk.builtin.str(\"__getitem__\");Sk.builtin.str.$gt=new Sk.builtin.str(\"__gt__\");Sk.builtin.str.$keys=new Sk.builtin.str(\"keys\");Sk.builtin.str.$le=new Sk.builtin.str(\"__le__\");Sk.builtin.str.$len=new Sk.builtin.str(\"__len__\");Sk.builtin.str.$length_hint=new Sk.builtin.str(\"__length_hint__\");Sk.builtin.str.$loader=\nnew Sk.builtin.str(\"__loader__\");Sk.builtin.str.$lt=new Sk.builtin.str(\"__lt__\");Sk.builtin.str.$module=new Sk.builtin.str(\"__module__\");Sk.builtin.str.$missing=new Sk.builtin.str(\"__missing__\");Sk.builtin.str.$name=new Sk.builtin.str(\"__name__\");Sk.builtin.str.$ne=new Sk.builtin.str(\"__ne__\");Sk.builtin.str.$new=new Sk.builtin.str(\"__new__\");Sk.builtin.str.$next=new Sk.builtin.str(\"__next__\");Sk.builtin.str.$path=new Sk.builtin.str(\"__path__\");Sk.builtin.str.$prepare=new Sk.builtin.str(\"__prepare__\");\nSk.builtin.str.$qualname=new Sk.builtin.str(\"__qualname__\");Sk.builtin.str.$repr=new Sk.builtin.str(\"__repr__\");Sk.builtin.str.$reversed=new Sk.builtin.str(\"__reversed__\");Sk.builtin.str.$round=new Sk.builtin.str(\"__round__\");Sk.builtin.str.$setattr=new Sk.builtin.str(\"__setattr__\");Sk.builtin.str.$setitem=new Sk.builtin.str(\"__setitem__\");Sk.builtin.str.$slots=new Sk.builtin.str(\"__slots__\");Sk.builtin.str.$str=new Sk.builtin.str(\"__str__\");Sk.builtin.str.$setname=new Sk.builtin.str(\"__set_name__\");\nSk.builtin.str.$trunc=new Sk.builtin.str(\"__trunc__\");Sk.builtin.str.$write=new Sk.builtin.str(\"write\");Sk.misceval.op2method_={Eq:Sk.builtin.str.$eq,NotEq:Sk.builtin.str.$ne,Gt:Sk.builtin.str.$gt,GtE:Sk.builtin.str.$ge,Lt:Sk.builtin.str.$lt,LtE:Sk.builtin.str.$le}}]);}).call(this || window)\n\n//# sourceMappingURL=skulpt.min.js.map","import RunestoneBase from \"../../common/js/runestonebase.js\";\n\n// function to display the audio tours\nexport default class AudioTour extends RunestoneBase {\n constructor(divid, code, bnum, audio_text) {\n // Bug Fix: If a class extends another class, this is undefined UNTIL super is called\n super();\n this.audio_tour = null;\n this.audio_code = null;\n this.windowcode = null;\n this.first_audio = null;\n this.prev_audio = null;\n this.pause_audio = null;\n this.next_audio = null;\n this.last_audio = null;\n this.status = null;\n this.stop_button = null;\n this.tourButtons = [];\n this.elem = null; // current audio element playing\n this.currIndex = null; // current index\n this.len = null; // current length of audio files for tour\n this.buttonCount = null; // number of audio tour buttons\n this.aname = null; // the audio file name\n this.ahash = null; // hash of the audio file name to the lines to highlight\n this.theDivid = null; // div id\n this.afile = null; // file name for audio\n this.playing = false; // flag to say if playing or not\n this.tourName = \"\";\n // Replacing has been done here to make sure special characters in the code are displayed correctly\n code = code.replaceAll(\"*doubleq*\", '\"');\n code = code.replaceAll(\"*singleq*\", \"'\");\n code = code.replaceAll(\"*open*\", \"(\");\n code = code.replaceAll(\"*close*\", \")\");\n code = code.replaceAll(\"*nline*\", \"
    \");\n var codeArray = code.split(\"\\n\");\n var audio_hash = [];\n var bval = [];\n var atype = audio_text.replaceAll(\"*doubleq*\", '\"');\n var audio_type = atype.split(\"*atype*\");\n for (let i = 0; i < audio_type.length - 1; i++) {\n audio_hash[i] = audio_type[i];\n var aword = audio_type[i].split(\";\");\n bval.push(aword[0]);\n }\n var first =\n \"
    \" +\n \"1. \" +\n codeArray[0] +\n \"
    \";\n var num_lines = codeArray.length;\n for (let i = 1; i < num_lines; i++) {\n if (i < 9) {\n first =\n first +\n \"
    \" +\n (i + 1) +\n \". \" +\n codeArray[i] +\n \"
    \";\n } else if (i < 99) {\n first =\n first +\n \"
    \" +\n (i + 1) +\n \". \" +\n codeArray[i] +\n \"
    \";\n } else {\n first =\n first +\n \"
    \" +\n (i + 1) +\n \". \" +\n codeArray[i] +\n \"
    \";\n }\n }\n first = first + \"
    \";\n //laying out the HTML content\n var bcount = 0;\n for (var i = 0; i < audio_type.length - 1; i++) {\n var newButton = document.createElement(\"button\");\n newButton.className = \"btn btn-success\";\n newButton.innerHTML = bval[i].replace(/\\\"/g, \"\");\n this.tourButtons.push(newButton);\n bcount++;\n }\n this.audio_tour = document.createElement(\"div\");\n this.audio_tour.align = \"center\";\n this.audio_code = document.createElement(\"p\");\n this.windowcode = document.createElement(\"div\");\n this.windowcode.align = \"left\";\n $(this.windowcode).html(first);\n this.first_audio = document.createElement(\"button\");\n this.prev_audio = document.createElement(\"button\");\n this.pause_audio = document.createElement(\"button\");\n this.next_audio = document.createElement(\"button\");\n this.last_audio = document.createElement(\"button\");\n this.first_audio.className =\n \"btn-default glyphicon glyphicon-fast-backward\";\n this.prev_audio.className =\n \"btn-default glyphicon glyphicon-step-backward\";\n this.pause_audio.className = \"btn-default glyphicon glyphicon-pause\";\n this.next_audio.className =\n \"btn-default glyphicon glyphicon-step-forward\";\n this.last_audio.className =\n \"btn-default glyphicon glyphicon-fast-forward\";\n this.first_audio.setAttribute(\n \"style\",\n \"height: 22px; width: 25px; border-radius: 4px; margin-right:2px;\"\n );\n this.prev_audio.setAttribute(\n \"style\",\n \"height: 22px; width: 25px; border-radius: 4px; margin-right:2px;\"\n );\n this.pause_audio.setAttribute(\n \"style\",\n \"height: 22px; width: 25px; border-radius: 4px; margin-right:2px;\"\n );\n this.next_audio.setAttribute(\n \"style\",\n \"height: 22px; width: 25px; border-radius: 4px; margin-right:2px;\"\n );\n this.last_audio.setAttribute(\n \"style\",\n \"height: 22px; width: 25px; border-radius: 4px; margin-right:2px;\"\n );\n this.first_audio.name = \"first_audio\";\n this.prev_audio.name = \"prev_audio\";\n this.pause_audio.name = \"pause_audio\";\n this.next_audio.name = \"next_audio\";\n this.last_audio.name = \"last_audio\";\n this.first_audio.title = \"Play first audio in tour\";\n this.prev_audio.title = \"Play previous audio in tour\";\n this.pause_audio.title = \"Pause current audio\";\n this.next_audio.title = \"Play next audio in tour\";\n this.last_audio.title = \"Play last audio in tour\";\n this.first_audio.setAttribute(\"aria-label\", \"Play first audio in tour\");\n this.prev_audio.setAttribute(\n \"aria-label\",\n \"Play previous audio in tour\"\n );\n this.pause_audio.setAttribute(\"aria-label\", \"Pause audio\");\n this.next_audio.setAttribute(\"aria-label\", \"Play next audio in tour\");\n this.last_audio.setAttribute(\"aria-label\", \"Play last audio in tour\");\n this.first_audio.disabled = true;\n this.prev_audio.disabled = true;\n this.pause_audio.disabled = true;\n this.next_audio.disabled = true;\n this.last_audio.disabled = true;\n this.status = document.createElement(\"div\");\n this.status.className = \"alert alert-info\";\n this.status.setAttribute(\"style\", \"display: none;\");\n this.stop_button = document.createElement(\"button\");\n this.stop_button.className = \"btn btn-default\";\n this.stop_button.innerHTML = \"Stop tour\";\n $(this.audio_tour).append(\n this.audio_code,\n this.windowcode,\n document.createElement(\"br\"),\n this.first_audio,\n this.prev_audio,\n this.pause_audio,\n this.next_audio,\n this.last_audio,\n document.createElement(\"br\"),\n this.status,\n document.createElement(\"br\"),\n this.tourButtons,\n this.stop_button\n );\n $(\"#\" + divid + \" .ac_code_div\").append(this.audio_tour);\n $(\"#\" + divid + \" .ac_code_div\").css(\"width\", \"100%\");\n $(\"#\" + divid + \" .CodeMirror.cm-s-default.ui-resizable\").hide();\n $(\"#\" + divid + \" .ac_opt.btn.btn-default:last-child\").hide();\n $(this.stop_button).click(\n function () {\n if (this.playing) {\n this.elem.pause();\n }\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"closeWindow\",\n div_id: divid,\n });\n $(this.audio_tour).remove();\n $(\n \"#\" + divid + \" .CodeMirror.cm-s-default.ui-resizable\"\n ).show();\n $(\"#\" + divid + \" .ac_opt.btn.btn-default:last-child\").show();\n $(\"#\" + divid + \" .ac_code_div\").css(\"width\", \"\");\n }.bind(this)\n );\n $(this.tourButtons[0]).click(\n function () {\n this.tour(divid, audio_hash[0], bcount);\n }.bind(this)\n );\n $(this.tourButtons[1]).click(\n function () {\n this.tour(divid, audio_hash[1], bcount);\n }.bind(this)\n );\n $(this.tourButtons[2]).click(\n function () {\n this.tour(divid, audio_hash[2], bcount);\n }.bind(this)\n );\n $(this.tourButtons[3]).click(\n function () {\n this.tour(divid, audio_hash[3], bcount);\n }.bind(this)\n );\n $(this.tourButtons[4]).click(\n function () {\n this.tour(divid, audio_hash[4], bcount);\n }.bind(this)\n );\n // handle the click to go to the next audio\n $(this.first_audio).click(\n function () {\n this.firstAudio();\n }.bind(this)\n );\n // handle the click to go to the next audio\n $(this.prev_audio).click(\n function () {\n this.prevAudio();\n }.bind(this)\n );\n // handle the click to pause or play the audio\n $(this.pause_audio).click(\n function () {\n this.pauseAndPlayAudio(divid);\n }.bind(this)\n );\n // handle the click to go to the next audio\n $(this.next_audio).click(\n function () {\n this.nextAudio();\n }.bind(this)\n );\n // handle the click to go to the next audio\n $(this.last_audio).click(\n function () {\n this.lastAudio();\n }.bind(this)\n );\n // make the image buttons look disabled\n $(this.first_audio).css(\"opacity\", 0.25);\n $(this.prev_audio).css(\"opacity\", 0.25);\n $(this.pause_audio).css(\"opacity\", 0.25);\n $(this.next_audio).css(\"opacity\", 0.25);\n $(this.last_audio).css(\"opacity\", 0.25);\n }\n tour(divid, audio_type, bcount) {\n // set globals\n this.buttonCount = bcount;\n this.theDivid = divid;\n this.status.setAttribute(\n \"style\",\n \"display: inline-block; margin-top: 7px; margin-bottom: 3px;\"\n );\n // enable prev, pause/play and next buttons and make visible\n $(this.first_audio).removeAttr(\"disabled\");\n $(this.prev_audio).removeAttr(\"disabled\");\n $(this.pause_audio).removeAttr(\"disabled\");\n $(this.next_audio).removeAttr(\"disabled\");\n $(this.last_audio).removeAttr(\"disabled\");\n $(this.first_audio).css(\"opacity\", 1.0);\n $(this.prev_audio).css(\"opacity\", 1.0);\n $(this.pause_audio).css(\"opacity\", 1.0);\n $(this.next_audio).css(\"opacity\", 1.0);\n $(this.last_audio).css(\"opacity\", 1.0);\n // disable tour buttons\n for (var i = 0; i < bcount; i++)\n $(this.tourButtons[i]).attr(\"disabled\", \"disabled\");\n var atype = audio_type.split(\";\");\n var name = atype[0].replaceAll('\"', \" \");\n this.tourName = name;\n $(this.status).html($.i18n(\"msg_activecode_starting\", name));\n //log tour type to db\n this.logBookEvent({ event: \"Audio\", act: name, div_id: divid });\n var max = atype.length;\n var str = \"\";\n this.ahash = [];\n this.aname = [];\n for (i = 1; i < max - 1; i++) {\n var temp = atype[i].split(\":\");\n var temp_line = temp[0];\n var temp_aname = temp[1];\n var akey = temp_aname.substring(1, temp_aname.length);\n var lnums = temp_line.substring(1, temp_line.length);\n //alert(\"akey:\"+akey+\"lnum:\"+lnums);\n // str+=\"\";\n //var dir =\n // \"http://media.interactivepython.org/\" +\n // eBookConfig.basecourse.toLowerCase() +\n // \"/audio/\";\n var dir = \"../_static/audio/\"\n str += \"\";\n this.ahash[akey] = lnums;\n this.aname.push(akey);\n }\n $(this.audio_code).html(str);\n this.len = this.aname.length; // set the number of audio file in the tour\n this.currIndex = 0;\n this.playCurrIndexAudio();\n }\n handlePlaying() {\n this.elem.pause();\n // unbind current ended\n $(\"#\" + this.afile).unbind(\"ended\");\n // unhighlight the prev lines\n this.unhighlightLines(\n this.theDivid,\n this.ahash[this.aname[this.currIndex]]\n );\n }\n firstAudio() {\n // if audio is this.playing handle it\n this.handlePlaying();\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"first\",\n div_id: this.theDivid,\n });\n // move to the first audio\n this.currIndex = 0;\n // start at the first audio\n this.playCurrIndexAudio();\n }\n prevAudio() {\n // if there is a previous audio\n if (this.currIndex > 0) {\n // if audio is this.playing handle it\n this.handlePlaying();\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"prev\",\n div_id: this.theDivid,\n });\n // move to previous to the current (but the current index has moved to the next)\n this.currIndex = this.currIndex - 1;\n // start at the prev audio\n this.playCurrIndexAudio();\n }\n }\n nextAudio() {\n // if audio is this.playing handle it\n this.handlePlaying();\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"next\",\n div_id: this.theDivid,\n });\n // if not at the end\n if (this.currIndex < this.len - 1) {\n // start at the next audio\n this.currIndex = this.currIndex + 1;\n this.playCurrIndexAudio();\n } else if (this.currIndex == this.len - 1) {\n this.handleTourEnd();\n }\n }\n lastAudio() {\n // if audio is this.playing handle it\n this.handlePlaying();\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"last\",\n div_id: this.theDivid,\n });\n // move to the last audio\n this.currIndex = this.len - 1;\n // start at last\n this.playCurrIndexAudio();\n }\n // play the audio at the current index\n playCurrIndexAudio() {\n // set this.playing to false\n this.playing = false;\n // play the current audio and highlight the lines\n this.playaudio(this.currIndex, this.aname, this.theDivid, this.ahash);\n }\n // handle the end of the tour\n handleTourEnd() {\n $(this.status).html(\"The \" + this.tourName + \" has ended.\");\n this.pause_audio.className = \"btn-default glyphicon glyphicon-pause\";\n this.pause_audio.title = \"Pause audio\";\n this.pause_audio.setAttribute(\"aria-label\", \"Pause audio\");\n $(this.first_audio).attr(\"disabled\", \"disabled\");\n $(this.prev_audio).attr(\"disabled\", \"disabled\");\n $(this.pause_audio).attr(\"disabled\", \"disabled\");\n $(this.next_audio).attr(\"disabled\", \"disabled\");\n $(this.last_audio).attr(\"disabled\", \"disabled\");\n $(this.first_audio).css(\"opacity\", 0.25);\n $(this.prev_audio).css(\"opacity\", 0.25);\n $(this.pause_audio).css(\"opacity\", 0.25);\n $(this.next_audio).css(\"opacity\", 0.25);\n $(this.last_audio).css(\"opacity\", 0.25);\n // enable the tour buttons\n for (var j = 0; j < this.buttonCount; j++)\n $(this.tourButtons[j]).removeAttr(\"disabled\");\n }\n // only call this one after the first time\n outerAudio() {\n // unbind ended\n $(\"#\" + this.afile).unbind(\"ended\");\n // set this.playing to false\n this.playing = false;\n // unhighlight previous lines from the last audio\n this.unhighlightLines(\n this.theDivid,\n this.ahash[this.aname[this.currIndex]]\n );\n // increment the this.currIndex to point to the next one\n this.currIndex++;\n // if the end of the tour reset the buttons\n if (this.currIndex == this.len) {\n this.handleTourEnd();\n }\n // else not done yet so play the next audio\n else {\n // play the audio at the current index\n this.playCurrIndexAudio();\n }\n }\n // play the audio now that it is ready\n playWhenReady(afile, divid, ahash) {\n // unbind current\n $(\"#\" + afile).unbind(\"canplaythrough\");\n this.elem.currentTime = 0;\n this.playing = true;\n //console.log(\"in playWhenReady \" + elem.duration);\n this.highlightLines(divid, ahash[afile]);\n if (\n this.pause_audio.className ===\n \"btn-default glyphicon glyphicon-pause\"\n ) {\n $(this.status).html(\n $.i18n(\"msg_activecode_playing\", this.tourName)\n );\n $(\"#\" + afile).bind(\n \"ended\",\n function () {\n this.outerAudio();\n }.bind(this)\n );\n this.elem.play();\n } else {\n $(\"#\" + afile).bind(\n \"ended\",\n function () {\n this.outerAudio();\n }.bind(this)\n );\n }\n }\n // play the audio at the specified index i and set the duration and highlight the lines\n playaudio(i, aname, divid, ahash) {\n this.afile = aname[i];\n this.elem = document.getElementById(this.afile);\n // if this isn't ready to play yet - no duration yet then wait\n //console.log(\"in playaudio \" + elem.duration);\n if (isNaN(this.elem.duration) || this.elem.duration == 0) {\n // set the status\n $(this.status).html($.i18n(\"msg_activecode_loading_audio\"));\n $(\"#\" + this.afile).bind(\n \"canplaythrough\",\n function () {\n this.playWhenReady(this.afile, divid, ahash);\n }.bind(this)\n );\n }\n // otherwise it is ready so play it\n else {\n this.playWhenReady(this.afile, divid, ahash);\n }\n }\n // pause if this.playing and play if paused\n pauseAndPlayAudio(divid) {\n var btn = this.pause_audio;\n // if paused and clicked then continue from current\n if (this.elem.paused) {\n // calcualte the time left to play in milliseconds\n let counter = (this.elem.duration - this.elem.currentTime) * 1000;\n this.elem.play(); // start the audio from current spot\n this.pause_audio.className =\n \"btn-default glyphicon glyphicon-pause\";\n this.pause_audio.title = $.i18n(\n \"msg_activecode_pause_current_audio\"\n );\n this.pause_audio.setAttribute(\n \"aria-label\",\n $.i18n(\"msg_activecode_pause_audio\")\n );\n $(this.status).html(\n $.i18n(\"msg_activecode_playing\", this.tourName)\n );\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"play\",\n div_id: this.theDivid,\n });\n }\n // if audio was this.playing pause it\n else if (this.playing) {\n this.elem.pause(); // pause the audio\n this.pause_audio.className = \"btn-default glyphicon glyphicon-play\";\n this.pause_audio.title = $.i18n(\"msg_activecode_play_paused_audio\");\n this.pause_audio.setAttribute(\n \"aria-label\",\n $.i18n(\"msg_activecode_play_paused_audio\")\n );\n $(this.status).html(\n $.i18n(\"msg_activecode_audio_paused\", this.tourName)\n );\n //log change to db\n this.logBookEvent({\n event: \"Audio\",\n act: \"pause\",\n div_id: this.theDivid,\n });\n }\n }\n // process the lines\n processLines(divid, lnum, color) {\n var comma = lnum.split(\",\");\n if (comma.length > 1) {\n for (let i = 0; i < comma.length; i++) {\n this.setBackgroundForLines(divid, comma[i], color);\n }\n } else {\n this.setBackgroundForLines(divid, lnum, color);\n }\n }\n // unhighlight the lines - set the background back to transparent\n unhighlightLines(divid, lnum) {\n this.processLines(divid, lnum, \"transparent\");\n }\n // highlight the lines - set the background to a yellow color\n highlightLines(divid, lnum) {\n this.processLines(divid, lnum, \"#ffff99\");\n }\n // set the background to the passed color\n setBackgroundForLines(divid, lnum, color) {\n var hyphen = lnum.split(\"-\");\n var str;\n // if a range of lines\n if (hyphen.length > 1) {\n var start = parseInt(hyphen[0]);\n var end = parseInt(hyphen[1]) + 1;\n for (var k = start; k < end; k++) {\n //alert(k);\n str = \"#\" + divid + \"_l\" + k;\n if ($(str).text() != \"\") {\n $(str).css(\"background-color\", color);\n }\n //$(str).effect(\"highlight\",{},(dur*1000)+4500);\n }\n } else {\n //alert(lnum);\n str = \"#\" + divid + \"_l\" + lnum;\n $(str).css(\"background-color\", color);\n //$(str).effect(\"highlight\",{},(dur*1000)+4500);\n }\n }\n}\n","$.i18n().load({\n en: {\n msd_pyflakes_coach_line: \"Line\",\n },\n});\n\nexport default class PyflakesCoach {\n async check(code) {\n let promise = new Promise(function (resolve, reject) {\n fetch('/ns/coach/python_check', {\n method: 'POST',\n body: code\n })\n .then((response) => {\n return response.json();\n })\n .then((data) => {\n if(data.trim() !== '') {\n let message = \"\";\n //clean up returned text\n let errorLines = data.split(\"\\n\");\n let codeLines = code.split(\"\\n\");\n for(let line of errorLines) {\n if(line.indexOf(\".py:\") != -1) {\n //old pyflakes returns \"file:line:col error\"\n //new pyflakes returns \"file:line:col: error\"\n //handle either\n const cleaner = /[^.]*.py:(\\d+):(\\d+):? (.*)/i;\n let lineParts = line.match(cleaner); //[1]: line, [2]: col, [3]: error\n \n //for now, filter messages about star imports\n if(!lineParts[3].includes(\"defined from star imports\") \n && !lineParts[3].includes(\"*' used; unable to detect undefined names\"))\n {\n message += $.i18n(\"msd_pyflakes_coach_line\") + lineParts[1] + \": \" + lineParts[3] + \"\\n\";\n message += codeLines[lineParts[1] - 1] + \"\\n\";\n message += \" \".repeat(lineParts[2] - 1) + \"^\\n\";\n }\n } else {\n message += line + \"\\n\";\n }\n }\n message = message.slice(0,-1); //remove trailing newline\n resolve(message);\n }\n resolve(null);\n })\n .catch(err => {\n reject(\"Error in Pyflakes Coach: \" + err);\n })\n });\n return promise;\n }\n}\n\n","/**\n *\n * Created by bmiller on 3/19/15.\n */\n/* Define global variables for ESLint */\n/* global Sk */\n\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport AudioTour from \"./audiotour.js\";\nimport \"./activecode-i18n.en.js\";\nimport \"./activecode-i18n.pt-br.js\";\nimport \"./activecode-i18n.sr-Cyrl.js\";\nimport CodeMirror from \"codemirror\";\nimport \"codemirror/mode/python/python.js\";\nimport \"codemirror/mode/css/css.js\";\nimport \"codemirror/mode/htmlmixed/htmlmixed.js\";\nimport \"codemirror/mode/xml/xml.js\";\nimport \"codemirror/mode/javascript/javascript.js\";\nimport \"codemirror/mode/sql/sql.js\";\nimport \"codemirror/mode/clike/clike.js\";\nimport \"codemirror/mode/octave/octave.js\";\nimport \"./../css/activecode.less\";\nimport \"codemirror/lib/codemirror.css\";\nimport \"./../css/codemirror-dark.less\";\nimport \"codemirror/addon/comment/comment.js\";\nimport \"codemirror/addon/hint/show-hint.js\";\nimport \"codemirror/addon/hint/show-hint.css\";\nimport \"codemirror/addon/hint/sql-hint.js\";\nimport \"codemirror/addon/hint/anyword-hint.js\";\nimport \"codemirror/addon/edit/matchbrackets.js\";\n// for CodeTailor\nimport {\n renderRunestoneComponent\n} from \"../../common/js/renderComponent.js\";\n\nimport \"./skulpt.min.js\";\nimport \"./skulpt-stdlib.js\";\nimport PyflakesCoach from \"./coach-python-pyflakes.js\";\n// Used by Skulpt.\nimport embed from \"vega-embed\";\n// Adapt for use outside webpack -- see https://github.com/vega/vega-embed.\nwindow.vegaEmbed = embed;\n\nvar isMouseDown = false;\nvar stopExecution = false;\n\ndocument.onmousedown = function () {\n isMouseDown = true;\n};\n\ndocument.onmouseup = function () {\n isMouseDown = false;\n};\nwindow.componentMap = {};\n\nvar socket, connection, doc;\nvar chatcodesServer = \"chat.codes\";\n\nCodeMirror.commands.autocomplete = function (cm) {\n cm.showHint({ hint: CodeMirror.hint.anyword });\n};\n\nconst codeIndent = () => Number(window.getComputedStyle(document.body).getPropertyValue('--code-editor-indentation') || 4);\n\n// separate into constructor and init\nexport class ActiveCode extends RunestoneBase {\n constructor(opts) {\n super(opts);\n var orig = $(opts.orig).find(\"textarea\")[0];\n this.containerDiv = opts.orig;\n this.useRunestoneServices = opts.useRunestoneServices;\n this.python3 = true;\n this.origElem = orig;\n this.origText = this.origElem.textContent;\n this.codeCoachList = []; //list of CodeCoaches that will be used to provide feedback\n this.divid = opts.orig.id;\n this.problem_description = $(opts.orig).find(\".ac_question\").text() || \"\";\n this.code = $(orig).text() || \"\\n\\n\\n\\n\\n\";\n this.parsonspersonalize = $(orig).data(\"parsonspersonalize\"); // CodeTailor: Allows the instructor to choose personalization level: solution-level or block-and-solution level\n this.parsonsexample = $(orig).data(\"parsonsexample\"); // CodeTailor: Allows the instructor to choose an example Parsons problem or LLM-example (default auto-fill, means the example is generated by LLM)\n this.puzzleScaffoldingDivid = `help_puzzle_${this.parsonspersonalize}_${this.divid}`; // CodeTailor: the div id for the puzzle scaffolding help window\n this.language = $(orig).data(\"lang\");\n this.timelimit = $(orig).data(\"timelimit\");\n this.highlightLines = $(orig).data(\"highlight-lines\");\n this.includes = $(orig).data(\"include\");\n this.hidecode = $(orig).data(\"hidecode\");\n this.chatcodes = $(orig).data(\"chatcodes\");\n this.hidehistory = $(orig).data(\"hidehistory\");\n this.question = $(opts.orig).find(`#${this.divid}_question`)[0];\n this.tie = $(orig).data(\"tie\");\n this.dburl = $(orig).data(\"dburl\");\n this.runButton = null;\n this.enabledownload = this.parseBooleanAttribute(orig, \"data-enabledownload\");\n this.downloadButton = null;\n this.saveButton = null;\n this.loadButton = null;\n this.outerDiv = null;\n this.partner = \"\";\n this.runCount = 0;\n this.firstAfterRun = true;\n this.logResults = true;\n if (!eBookConfig.allow_pairs || this.parseBooleanAttribute(orig, \"data-nopair\")) {\n this.enablePartner = false;\n } else {\n this.enablePartner = true;\n }\n this.output = null; // create pre for output\n this.graphics = null; // create div for turtle graphics\n this.codecoach = null; // div for Code Coaches\n this.codelens = null;\n this.controlDiv = null;\n this.historyScrubber = null;\n this.timestamps = [\"Original\"];\n this.autorun = this.parseBooleanAttribute(orig, \"data-autorun\");\n this.outputLineCount = 0;\n this.outputLines = [];\n if (this.chatcodes && eBookConfig.enable_chatcodes) {\n if (!socket) {\n socket = new WebSocket(\"wss://\" + chatcodesServer);\n }\n if (!connection) {\n connection = new window.sharedb.Connection(socket);\n }\n if (!doc) {\n doc = connection.get(\"chatcodes\", \"channels\");\n }\n }\n if (this.graderactive || this.isTimed) {\n this.hidecode = false;\n }\n if (this.includes) {\n this.includes = this.includes.split(/\\s+/);\n }\n // first check for some iotests at VERY end of code\n // They will be a single line JSON object that comes after a line that says ===iotests===\n let iotestsStart = this.code.indexOf(\"===iotests===\");\n if (iotestsStart > -1) {\n let iotestText = this.code.substring(iotestsStart + 13);\n this.iotests = JSON.parse(iotestText);\n this.code = this.code.substring(0, iotestsStart);\n }\n\n // Handle prefix/suffixes\n // ^^^^ = invisible prefix\n // ^^^! = visible prefix\n // ==== = invisible suffix\n // ===! = visible suffix\n // Tags may or may not have a trailing /n assume that if they do, it is to be removed.\n // newline is standard in rst markup, but sometimes intentionally not emitted by pretext\n let prefixMarker = this.code.match(/\\^\\^\\^\\^\\^*/); // regex to handle 5+ symbols which old code allowed\n if (prefixMarker) {\n let prefixEnd = prefixMarker.index; //invisible suffix\n let prefixLength = prefixMarker[0].length;\n this.prefix = this.code.substring(0, prefixEnd);\n let markerLength =\n this.code[prefixEnd + prefixLength] == \"\\n\"\n ? prefixLength + 1\n : prefixLength;\n this.code = this.code.substring(prefixEnd + markerLength);\n }\n // If there are both invisible and visible prefixes, the invisible one must come first\n let visiblePrefixEnd = this.code.indexOf(\"^^^!\");\n if (visiblePrefixEnd > -1) {\n this.visiblePrefixEnd = visiblePrefixEnd;\n let markerLength = this.code[visiblePrefixEnd + 4] == \"\\n\" ? 5 : 4;\n this.visiblePrefix = this.code.substring(0, visiblePrefixEnd);\n this.code =\n this.visiblePrefix +\n this.code.substring(visiblePrefixEnd + markerLength);\n }\n // There may be both a visible and invisible (tests) suffix\n // Currently assumed the visible one is first in the source so we can peel off the\n // invisible one and leave visible one in place.\n let suffixMarker = this.code.match(/=====*/); // regex to handle 5+ symbols which old code allowed\n if (suffixMarker) {\n let suffStart = suffixMarker.index; //invisible suffix\n let suffLength = suffixMarker[0].length;\n let markerLength =\n this.code[suffStart + suffLength] == \"\\n\"\n ? suffLength + 1\n : suffLength;\n this.suffix = this.code.substring(suffStart + markerLength);\n if (this.suffix.trim() === \"\") {\n this.suffix = null; // no suffix\n }\n this.code = this.code.substring(0, suffStart);\n }\n let visibleSuffixStart = this.code.indexOf(\"===!\");\n if (visibleSuffixStart > -1) {\n let markerLength =\n this.code[visibleSuffixStart + 4] == \"\\n\" ? 5 : 4;\n this.visibleSuffixLength =\n this.code.length - visibleSuffixStart - markerLength;\n this.visibleSuffix = this.code.substring(visibleSuffixStart + markerLength);\n this.code =\n this.code.substring(0, visibleSuffixStart) +\n this.visibleSuffix;\n }\n let baseCode = this.trimLockedCode(this.code);\n this.history = [baseCode];\n this.highlightedLines = [];\n this.lockedLines = [];\n this.lockTextMarkers = [];\n this.lockGutterLines = [];\n\n this.createEditor();\n this.createOutput();\n this.createControls();\n if ($(orig).data(\"caption\")) {\n this.caption = $(orig).data(\"caption\");\n } else {\n this.caption = \"ActiveCode\";\n }\n this.addCaption(\"runestone\");\n\n //Setup CodeCoaches - add based on language\n if (this.language == \"python\" || this.language == \"python3\") {\n this.codeCoachList.push(new PyflakesCoach());\n }\n\n // Why is this necessary???\n setTimeout(\n function () {\n this.editor.refresh();\n }.bind(this),\n 1000\n );\n this.decorateStatus();\n if (this.autorun) {\n // Simulate pressing the run button, since this will also prevent the user from clicking it until the initial run is complete, and also help the user understand why they're waiting.\n $(this.runButtonHandler.bind(this));\n }\n this.indicate_component_ready();\n if (typeof Prism !== \"undefined\") {\n Prism.highlightAllUnder(this.containerDiv);\n }\n\n // variables for CodeTailor\n this.helpLoaded = false;\n this.prevHelpedCode = null;\n }\n\n createEditor(index) {\n this.outerDiv = document.createElement(\"div\");\n var linkdiv = document.createElement(\"div\");\n linkdiv.id = this.divid.replace(/_/g, \"-\").toLowerCase(); // :ref: changes _ to - so add this as a target\n var codeDiv = document.createElement(\"div\");\n codeDiv.classList.add(\"ac_code_div\");\n codeDiv.setAttribute(\"aria-label\", \"CodeMirror Editor\");\n this.codeDiv = codeDiv;\n this.origElem.replaceWith(this.outerDiv);\n if (linkdiv.id !== this.divid) {\n // Don't want the 'extra' target if they match.\n this.outerDiv.appendChild(linkdiv);\n }\n this.outerDiv.appendChild(codeDiv);\n var edmode = this.language;\n if (edmode === \"sql\") {\n edmode = \"text/x-sql\";\n } else if (edmode === \"java\") {\n edmode = \"text/x-java\";\n } else if (edmode === \"kotlin\") {\n edmode = \"text/x-java\";\n } else if (edmode === \"cpp\") {\n edmode = \"text/x-c++src\";\n } else if (edmode === \"c\") {\n edmode = \"text/x-csrc\";\n } else if (edmode === \"python3\") {\n edmode = \"python\";\n } else if (edmode === \"octave\" || edmode === \"MATLAB\") {\n edmode = \"text/x-octave\";\n } else if (edmode === \"html\" || edmode === \"htmlmixed\") {\n edmode = \"htmlmixed\";\n }\n // Conditionally add a gutter to the editor to show the locked prefix and suffix\n let gutterList = [];\n if (this.visiblePrefixEnd || this.visibleSuffixLength) {\n gutterList = [\n { className: \"CodeMirror-lock-markers\", style: \"width: 16px\" },\n ];\n }\n var editor = CodeMirror(codeDiv, {\n value: this.code,\n lineNumbers: true,\n mode: edmode,\n indentUnit: codeIndent(),\n matchBrackets: true,\n autoMatchParens: true,\n gutters: gutterList,\n screenReaderLabel: \"ActiveCode Editor\",\n extraKeys: {\n Tab: \"indentMore\",\n \"Shift-Tab\": \"indentLess\",\n \"Ctrl-Space\": \"autocomplete\",\n },\n });\n\n // Handle hidden codemirror (in tab) coming into view\n CodeMirror.on(editor, \"refresh\", (cm) => {\n window.requestAnimationFrame(() => {\n // make sure vscrollbar does not overlap the resize handle\n editor.display.scrollbars.vert.style.bottom = \"16px\";\n });\n });\n\n // Make the editor resizable\n let ac = this;\n $(editor.getWrapperElement()).resizable({\n resize: function () {\n editor.setSize($(this).width(), $(this).height());\n editor.refresh();\n },\n });\n editor.on(\"keydown\", (cm, event) => {\n // give the user a visual cue that they have changed but not saved\n editor.getWrapperElement().style.borderTopColor = \"#b43232\";\n editor.getWrapperElement().style.borderBottomColor = \"#b43232\";\n });\n editor.on(\n \"change\",\n function (ev) {\n if (\n editor.acEditEvent == false ||\n editor.acEditEvent === undefined\n ) {\n // change events can come before any real changes for various reasons, some unknown\n // this avoids unneccsary log events and updates to the activity counter\n // offsetParent === null means that the element is not on the screen and so can't change\n // this.controlDiv.offsetParent\n if (\n this.origText === editor.getValue() ||\n this.addingScrubber\n ) {\n console.log(\"Fake change event, skipping the log\");\n return;\n }\n this.isAnswered = true;\n // the first time the student types in the write-code box\n this.logBookEvent({\n event: \"activecode\",\n act: \"edit\",\n div_id: this.divid,\n });\n editor.acEditEvent = true; // this is set to false when we programmatically change the editor value, so we can ignore those changes in the log and not mark the activity as answered.\n }\n if (this.firstAfterRun) {\n this.firstAfterRun = false;\n this.startEditTimeStamp = new Date();\n }\n // try to make sure vscrollbar does not overlap the resize handle\n // need to delay request to happen after codemirror has adjusted the same style\n window.requestAnimationFrame(() => {\n this.editor.display.scrollbars.vert.style.bottom = \"16px\";\n });\n }.bind(this)\n ); // use bind to preserve *this* inside the on handler.\n\n // disable copy/paste for timed exams\n if (this.isTimed) {\n editor.on(\"paste\", function (cm, e) {\n e.preventDefault();\n });\n\n document.addEventListener(\"copy\", function (e) {\n e.preventDefault();\n });\n\n document.addEventListener(\"cut\", function (e) {\n e.preventDefault();\n });\n\n document.addEventListener(\"paste\", function (e) {\n e.preventDefault();\n });\n }\n // capture current this for use in event handler\n let acElement = this;\n\n // document level event handler for tab key to handle context switching\n // detect if tab key was used to get into the editor\n document.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Tab\") {\n editor.tabDown = true;\n }\n });\n document.addEventListener(\"keyup\", function (e) {\n if (e.key === \"Tab\") {\n editor.tabDown = false;\n }\n });\n editor.getInputField().addEventListener(\"focus\", function (e) {\n // Solving Keyboard Trap of ActiveCode: If user uses Tab to navigate to the\n // activecode, let Tab get them out\n if (editor.tabDown) {\n editor.setOption(\"extraKeys\", {\n Tab: false,\n \"Shift-Tab\": false,\n });\n } else {\n editor.setOption(\"extraKeys\", {\n Tab: \"indentMore\",\n \"Shift-Tab\": \"indentLess\",\n });\n }\n });\n // keyboard shortcuts for run (ctrl/cmd + s) and comment (ctrl/cmd + /)\n this.containerDiv.addEventListener(\"keydown\", function (e) {\n if (e.code === \"KeyS\" && (e.ctrlKey || e.metaKey)) {\n if (acElement.runButton.disabled)\n return;\n acElement.runButton.click();\n e.preventDefault();\n }\n if (e.code === \"Slash\" && (e.ctrlKey || e.metaKey)) {\n if (typeof editor.toggleComment === \"function\") {\n editor.toggleComment();\n }\n e.preventDefault();\n }\n });\n this.editor = editor;\n\n // try to make sure vscrollbar does not overlap the resize handle\n // need to delay request to happen after codemirror has adjusted the same style\n window.requestAnimationFrame(() => {\n this.editor.display.scrollbars.vert.style.bottom = \"16px\";\n });\n\n // lock down code prefix/suffix\n this.setLockedRegions();\n this.setHighlightLines();\n\n if (this.hidecode) {\n $(this.codeDiv).css(\"display\", \"none\");\n }\n }\n\n async setHighlightLines() {\n this.editor.operation(() => {\n this.highlightedLines.forEach((lineNumber) => {\n this.editor.removeLineClass(\n lineNumber,\n \"wrap\",\n \"CodeMirror__highlight-line\"\n );\n });\n this.highlightedLines = [];\n\n if (this.highlightLines) {\n if (typeof this.highlightLines === \"number\")\n this.highlightLines = this.highlightLines.toString();\n\n let highlightList = this.highlightLines.split(\",\");\n highlightList.forEach((line) => {\n line = line.trim();\n let lineNum = line.split(\"-\");\n if (lineNum.length > 1) {\n let startLine = parseInt(lineNum[0]) - 1;\n let endLine = parseInt(lineNum[1]) - 1;\n for (let i = startLine; i <= endLine; i++) {\n if (i >= 0 && i <= this.editor.doc.lastLine()) {\n this.editor.addLineClass(\n i,\n \"wrap\",\n \"CodeMirror__highlight-line\"\n );\n this.highlightedLines.push(i);\n }\n }\n } else {\n let highlightLine = parseInt(lineNum[0]) - 1;\n if (highlightLine >= 0 && highlightLine <= this.editor.doc.lastLine()) {\n this.editor.addLineClass(\n highlightLine,\n \"wrap\",\n \"CodeMirror__highlight-line\"\n );\n this.highlightedLines.push(highlightLine);\n }\n }\n });\n }\n });\n }\n\n\n async setLockedRegions() {\n this.editor.operation(() => {\n this.lockedLines.forEach((lineNumber) => {\n this.editor.removeLineClass(\n lineNumber,\n \"wrap\",\n \"CodeMirror__locked-line\"\n );\n });\n this.lockedLines = [];\n\n this.lockGutterLines.forEach((lineNumber) => {\n this.editor.setGutterMarker(lineNumber, \"CodeMirror-lock-markers\", null);\n });\n this.lockGutterLines = [];\n\n this.lockTextMarkers.forEach((marker) => marker.clear());\n this.lockTextMarkers = [];\n\n function placeLock(lineNumber) {\n var marker = document.createElement(\"div\");\n marker.className = \"CodeMirror__gutter-locked-marker\";\n this.editor.setGutterMarker(lineNumber, \"CodeMirror-lock-markers\", marker);\n this.lockGutterLines.push(lineNumber);\n }\n\n if (this.visiblePrefixEnd) {\n let lastLine = this.editor.posFromIndex(\n this.visiblePrefixEnd - 1\n ).line;\n placeLock.call(this, Math.floor((0 + lastLine) / 2));\n for (let lineNumber = 0; lineNumber <= lastLine; lineNumber++) {\n this.editor.addLineClass(\n lineNumber,\n \"wrap\",\n \"CodeMirror__locked-line\"\n );\n this.lockedLines.push(lineNumber);\n }\n let endPos = this.editor.posFromIndex(this.visiblePrefixEnd);\n this.lockTextMarkers.push(\n this.editor.markText(\n { line: 0, ch: 0 },\n { line: endPos.line, ch: endPos.ch },\n {\n readOnly: true,\n atomic: false,\n inclusiveLeft: true,\n inclusiveRight: false,\n }\n )\n );\n }\n if (this.visibleSuffixLength) {\n let endIndex =\n this.editor.doc.getValue().length - this.visibleSuffixLength;\n let endPos = this.editor.posFromIndex(endIndex);\n let lastLine = this.editor.doc.lastLine();\n placeLock.call(this, Math.floor((endPos.line + lastLine) / 2));\n for (let lineNumber = endPos.line; lineNumber <= lastLine; lineNumber++) {\n this.editor.addLineClass(\n lineNumber,\n \"wrap\",\n \"CodeMirror__locked-line\"\n );\n this.lockedLines.push(lineNumber);\n }\n // include preceeding newline\n let endPos2 = this.editor.posFromIndex(endIndex - 1);\n this.lockTextMarkers.push(\n this.editor.markText(\n { line: endPos2.line, ch: endPos2.ch },\n { line: this.editor.doc.lastLine() + 1 },\n {\n readOnly: true,\n atomic: false,\n inclusiveLeft: false,\n inclusiveRight: true,\n }\n )\n );\n }\n });\n };\n\n async runButtonHandler() {\n // Disable the run button until the run is finished.\n this.runButton.disabled = true;\n\n //reset the css that indicates editor needs saving\n this.editor.getWrapperElement().style.borderTopColor = null;\n this.editor.getWrapperElement().style.borderBottomColor = null;\n\n try {\n await this.runProg();\n } catch (e) {\n console.log(`there was an error ${e} running the code`);\n }\n if (this.logResults) {\n this.logCurrentAnswer();\n }\n this.runCoaches();\n this.renderFeedback();\n // The run is finished; re-enable the button.\n this.runButton.disabled = false;\n this.runCount += 1;\n this.toggleAlert();\n }\n\n // CodeTailor function part starts here //\n async getParsonsCodeTailor() {\n // Prepare the request body\n let language = this.language;\n let code = this.editor.getValue();\n let problem_id = this.divid;\n let personalization_level =\n this.parsonspersonalize === \"movable\"\n ? \"Solution\"\n : this.parsonspersonalize === \"partial\"\n ? \"Multiple\"\n : \"unknown\";\n let parsonsexample = this.parsonsexample;\n let problem_description = this.problem_description.split(\"\\n\").map(line => line.trim()).filter(line => line !== \"\").join(\"\\n\");\n\n // This function is used to convert JUnit test code to a format suitable for backend processing.\n function junitToBackend(junitCode) {\n // Extract only the TestHelper class - match from the first line to the first empty line after it \n const helperMatch = junitCode.match(/class\\s+TestHelper\\s*\\{[\\s\\S]*?\\}\\s*/);\n const helperCode = helperMatch ? helperMatch[0] : \"\";\n\n // Add backend runner - it always calls TestHelper\n const backendRunner = `public class BackendTest {\n public static void main(String[] args) {\n try {\n TestHelper.runAllTests();\n System.exit(0);\n } catch (Exception e) {\n System.exit(1);\n }\n }\n }`;\n\n return helperCode + \"\\n\\n\" + backendRunner;\n }\n\n function cleanTestcase(raw_test_case) {\n if (raw_test_case !== null && raw_test_case !== \"\") {\n if (language.toLowerCase() === \"python\" || language.toLowerCase() === \"python3\") {\n return raw_test_case.replace(/from unittest\\.gui import TestCaseGui\\s*\\n/, \"import unittest\\n\")\n // change class inheritance\n .replace(/class myTests\\(TestCaseGui\\):/, \"class myTests(unittest.TestCase):\")\n // completely remove any .main() call\n .replace(/^\\s*myTests\\(\\)\\.main\\(\\)\\s*$/m, \"\");\n } else if (language.toLowerCase() === \"java\") {\n // remove all the print-out messages, just keep the test code\n return junitToBackend(raw_test_case);\n }\n }\n }\n\n let internal_test_case = cleanTestcase(this.suffix);\n let body = { \n language: language,\n student_code: code,\n problem_id: problem_id,\n personalization_level: personalization_level,\n parsonsexample: parsonsexample,\n problem_description: problem_description,\n internal_test_case: internal_test_case\n };\n console.log('body:', body)\n // CodeTailor: create a promise that rejects if the fetch takes too long\n let promise = new Promise((resolve, reject) => {\n // a controller object that allows to abort one or more Web request\n const scaffoldingController = new AbortController();\n const timeoutMessage = \"Sorry, we are not able to generate Parsons blocks for you at this time.\";\n const timeoutId = setTimeout(() => {\n scaffoldingController.abort();\n reject(timeoutMessage);\n }, 180000); // 180 seconds timeout for CodeTailor\n // Send the request to the server\n fetch(`/ns/coach/parsons_scaffolding?course=${eBookConfig.course}`, {\n method: 'POST',\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body),\n signal: scaffoldingController.signal\n })\n .then((response) => {\n clearTimeout(timeoutId); // Clear the timeout if the request completes in time\n if (!response.ok) {\n return response.text().then(text => {\n throw new Error(`HTTP ${response.status} - ${text}`);\n });\n }\n return response.json();\n })\n .then((data) => resolve(data))\n .catch(err => {\n clearTimeout(timeoutId);\n console.log(\"Error or timeout waiting for Parsons scaffolding response\", err, this.divid);\n const loadingBarDiv = document.getElementById(\"scaffolding-loading-prompt-\" + this.divid);\n $(loadingBarDiv).find(\"#loading-spinner\").remove();\n $(loadingBarDiv).find(\"#encouragement-text\").text(\"⚠️ \" + timeoutMessage);\n $(loadingBarDiv).find(\"#countdown-text\").text(\"🫶 Please contact the teaching staff for help!\");\n reject(\"Error in Parsons Scaffolding: \" + err)\n });\n });\n return promise;\n }\n\n // isNewHelp: when true, this handler was not called by pressing the button.\n // it was used to open a new generated help.\n async reopenHelpBtnHandler(isNewHelp) {\n function splitIntoChunks(str, chunkSize) {\n const chunks = [];\n let startIndex = 0;\n\n // Adjust the chunk size to allow space for metadata (100 characters for chunkIndex and totalChunks)\n const adjustedChunkSize = chunkSize - 100; // This leaves 100 characters for metadata\n\n // Loop through the string in increments of `adjustedChunkSize`\n while (startIndex < str.length) {\n let endIndex = startIndex + adjustedChunkSize;\n\n // Find the last line break within the chunk range to ensure we don't split a line\n if (endIndex < str.length) {\n const lastLineBreakIndex = str.lastIndexOf('\\n', endIndex);\n\n // If a line break exists and it's within the chunk range, adjust the end index\n if (lastLineBreakIndex > startIndex) {\n endIndex = lastLineBreakIndex + 1; // Include the line break in the chunk\n }\n }\n // Slice the string from `startIndex` to `endIndex` and add it to the chunks array\n chunks.push(str.substring(startIndex, endIndex));\n // Update the start index for the next chunk\n startIndex = endIndex;\n }\n return chunks;\n }\n\n function cleanParsonsHTML(html) {\n if (!html || typeof html !== \"string\") {\n return \"No valid Parsons content available\";\n }\n // remove
     tags and their attributes\n            let cleaned = html.replace(/]*>/g, \"\").replace(/<\\/pre>/g, \"\");\n            // replace 
    tags with newlines\n cleaned = cleaned.replace(//g, \"\\n\");\n // decode HTML entities\n let tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = cleaned;\n cleaned = tempDiv.innerText || tempDiv.textContent;\n // trim leading/trailing whitespace and return\n return cleaned.trim();\n }\n\n if (isNewHelp !== true) {\n isNewHelp = false;\n }\n\n if (window.latestParsonsHelpID == this.divid) {\n $(`#scaffolding-container-${this.divid}`).removeClass('hidden');\n let reopen_act = {\n type: 'receive_help',\n reopen: true,\n }\n this.logBookEvent({\n event: \"gptparsons_base_reopen\",\n act: JSON.stringify(reopen_act),\n div_id: this.divid\n });\n return;\n }\n window.latestParsonsHelpID = this.divid;\n\n // Split the helpText using the delimiter\n const parts = this.helpText.split(\"||split||\");\n\n // solution, html, solution_generation_type, generation_result_type, test_case\n const codeSolution = parts[0];\n const puzzleHtml = parts[1];\n const solutionGenerationType = parts[2];\n const generationResultType = parts[3];\n\n // Set personalizedAnswer and extract specific results\n this.codeAnswer = codeSolution;\n // this.commonAnswer = commonCodeSolution;\n const puzzle_rst = puzzleHtml;\n\n let act = {\n type: 'receive_help',\n reopen: !isNewHelp,\n code_answer: this.codeAnswer,\n generation_type: solutionGenerationType,\n solution_type: generationResultType\n };\n\n if (this.parsonspersonalize === \"movable\" || this.parsonspersonalize === \"partial\") {\n act['puzzle'] = cleanParsonsHTML(puzzle_rst);\n } else {\n console.warn(\"No personalization level is set. Puzzle will not be assigned.\");\n act['puzzle'] = \"No puzzle type selected\";\n }\n \n // Function to handle sending the rest of the data and splitting large strings into chunks\n const logActInParts = (act) => {\n // First, send the smaller fields (non-chunked) with event name \"gptparsons-0\"\n const basicData = {\n type: act.type,\n reopen: act.reopen,\n generation_type: act.generation_type,\n solution_type: act.solution_type,\n };\n\n // First, send the smaller fields (non-chunked) with event name \"gptparsons-0\"\n // // console.log(\"Sending basic data:\", basicData);\n this.logBookEvent({\n event: \"gptparsons_base\", // Special event name for the first log\n act: JSON.stringify(basicData),\n div_id: this.divid\n });\n\n // Split and send the code chunks\n if (act.code_answer) {\n let chunkIndex = 1; // Initialize a single counter for all chunks\n const codeChunks = splitIntoChunks(act.code_answer, 512);\n codeChunks.forEach((chunk) => {\n this.logBookEvent({\n event: `gptparsons_code_${chunkIndex}`,\n act: JSON.stringify({ \n reopen: !isNewHelp, \n type: 'code',\n content: chunk, \n chunkIndex: chunkIndex, \n totalChunks: codeChunks.length + (act.puzzle ? splitIntoChunks(act.puzzle, 512).length : 0)\n }),\n div_id: this.divid\n });\n chunkIndex++;\n });\n }\n\n // Split and send the puzzle chunks if they exist\n if (act.puzzle) {\n const puzzleChunks = splitIntoChunks(act.puzzle, 512);\n let puzzleIndex = 1;\n puzzleChunks.forEach((chunk) => {\n this.logBookEvent({\n event: `gptparsons_puzzle_${puzzleIndex}`,\n act: JSON.stringify({ \n reopen: !isNewHelp, \n type: 'puzzle',\n content: chunk, \n chunkIndex: puzzleIndex,\n totalChunks: puzzleChunks.length\n }),\n div_id: this.divid\n });\n puzzleIndex++;\n });\n }\n }\n\n // Log the data in parts\n logActInParts(act);\n\n let probDescHTML = $(this.outerDiv).find(\".ac_question\").last().html();\n if (puzzle_rst !== \"correctCode\" && puzzle_rst !== \"emptyHelpParsons\") {\n var puzzleCode = `\n
    \n
    \n
    ` + probDescHTML +\n `
    ` + puzzle_rst + `
    `;\n } else{\n var puzzleCode = ``;\n };\n\n if (!document.getElementById(`parsons-scaffolding-${this.divid}`)) {\n console.log(\"Creating new scaffolding container for\", this.divid);\n let scaffoldingContainer = document.createElement('div');\n scaffoldingContainer.id = `scaffolding-container-${this.divid}`;\n scaffoldingContainer.classList.add('scaffolding-container');\n this.outerDiv.insertBefore(scaffoldingContainer, this.outerDiv.firstChild);\n let closeScaffoldingButton = document.createElement('button');\n closeScaffoldingButton.classList.add('btn','btn-success');\n closeScaffoldingButton.innerText = \"Close Help\";\n closeScaffoldingButton.onclick = (event) => {\n let clickedButton = event.currentTarget;\n\n let close_divId = \"unknown\"; // a default value if we can't find the scaffolding container or inner div\n \n // Find the scaffolding container that the button is inside\n let scaffoldingContainer = clickedButton.closest(`#scaffolding-container-${this.divid}`);\n\n if (!scaffoldingContainer) {\n console.error('Scaffolding container not found');\n } else {\n // Find the parsons-scaffolding div\n let parsonsScaffolding = scaffoldingContainer.querySelector(`#parsons-scaffolding-${this.divid}`);\n \n if (!parsonsScaffolding) {\n console.error('parsons-scaffolding not found');\n } else {\n // Find the runestone.parsons-container inside the parsons-scaffolding\n let parsonsContainer = parsonsScaffolding.querySelector('.runestone.parsons-container');\n \n if (!parsonsContainer) {\n console.error('parsons-container not found');\n } else {\n // Find any div inside the parsonsContainer whose id starts with \"help_parsons_\"\n let innerDiv = parsonsContainer.querySelector('[id^=\"help_\"]');\n \n if (!innerDiv) {\n console.error('Inner div with id starting with \"help_parsons_\" not found');\n } else {\n // Get the id from the inner div\n close_divId = innerDiv.id;\n }\n }\n }\n }\n let act = {\n type: 'close_help'\n }\n this.logBookEvent({\n event: \"gptparsons_close\",\n act: JSON.stringify({ ...act }), // Clone to avoid future changes affecting the log\n div_id: close_divId\n });\n $(`#scaffolding-container-${this.divid}`).addClass('hidden');\n }\n scaffoldingContainer.appendChild(closeScaffoldingButton);\n\n // A copy answer button used to copy the finished Parsons solution to the clipboard\n // CodeTailor requires to put each question on a separate page, so the copy button is unique\n // TODO: need to update the code if one page has multiple questions\n let copyAnswerButton = document.createElement('button');\n copyAnswerButton.id = `copy-answer-button-${this.puzzleScaffoldingDivid}`;\n copyAnswerButton.classList.add('btn','btn-success', 'copy-button-hide');\n copyAnswerButton.innerText = \"Copy Answer to Clipboard\";\n copyAnswerButton.onclick = () => {\n this.copyScaffoldingSolutionToClipboard();\n }\n scaffoldingContainer.appendChild(copyAnswerButton);\n let parsonsDiv = document.createElement('div');\n parsonsDiv.id = `parsons-scaffolding-${this.divid}`;\n parsonsDiv.classList.add('parsons-scaffolding');\n scaffoldingContainer.appendChild(parsonsDiv);\n } else {\n // if already exists: remove hidden\n $(`#scaffolding-container-${this.divid}`).removeClass('hidden');\n }\n\n if (this.parsonspersonalize === \"movable\" || this.parsonspersonalize === \"partial\"){\n if (puzzle_rst !== \"correctCode\" && puzzle_rst !== \"emptyHelpParsons\") {\n await renderRunestoneComponent(puzzleCode, `parsons-scaffolding-${this.divid}`);\n } else if (puzzle_rst === \"emptyHelpParsons\") {\n document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML = \"
    Oops! Your code stumped our puzzle machine. Call in your instructor for a power-up!
    \";\n } else if (puzzle_rst === \"correctCode\") {\n document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML = \"
    Your code is already correct! No Parsons puzzle needed.
    \";\n }\n } else {\n document.getElementById(`parsons-scaffolding-${this.divid}`).innerHTML = \"
    No Parsons puzzle available.
    \";\n }\n }\n\n copyScaffoldingSolutionToClipboard() {\n var temptextarea = document.createElement('textarea');\n temptextarea.id = 'temp-textarea';\n var scaffoldingContainer = document.querySelector(`#scaffolding-container-${this.divid}`);\n scaffoldingContainer.appendChild(temptextarea);\n if (this.parsonspersonalize === \"movable\" || this.parsonspersonalize === \"partial\") {\n temptextarea.value = this.codeAnswer;\n } else {\n temptextarea.value = \"No solution available\";\n }\n console.log(this.codeAnswer);\n\n temptextarea.select();\n temptextarea.setSelectionRange(0, 99999);\n try {\n document.execCommand(\"copy\");\n temptextarea.remove();\n let act = {\n type: 'copy_help'\n }\n this.logBookEvent({\n event: \"gptparsons_copy\",\n act: JSON.stringify({ ...act }), // Clone to avoid future changes affecting the log\n div_id: this.divid\n });\n $(`#copy-answer-button-${this.puzzleScaffoldingDivid}`).text('Copied!').prop('disabled', true);\n\n // Set it back to \"Copy Answers to Clipboard\" after 2 seconds\n setTimeout(() => {\n $(`#copy-answer-button-${this.puzzleScaffoldingDivid}`).text('Copy Answer to Clipboard').prop('disabled', false);\n }, 2000);\n } catch (err) {\n alert('Oops! There was an issue copying to the clipboard. Please type the solution manually.');\n }\n } \n\n async parsonsBtnHandler() {\n // Check if the button exists and hasn't been disabled already\n if (this.parsonsBtn && !this.parsonsBtn.disabled) {\n this.parsonsBtn.disabled = true;\n }\n \n function splitIntoChunks(str, chunkSize) {\n const chunks = [];\n let startIndex = 0;\n\n // Adjust the chunk size to allow space for metadata (100 characters for chunkIndex and totalChunks)\n const adjustedChunkSize = chunkSize - 100; // leaves 100 characters for metadata\n\n // Loop through the string in increments of `adjustedChunkSize`\n while (startIndex < str.length) {\n let endIndex = startIndex + adjustedChunkSize;\n\n // Find the last line break within the chunk range to ensure we don't split a line\n if (endIndex < str.length) {\n const lastLineBreakIndex = str.lastIndexOf('\\n', endIndex);\n\n // If a line break exists and it's within the chunk range, adjust the end index\n if (lastLineBreakIndex > startIndex) {\n endIndex = lastLineBreakIndex + 1; // Include the line break in the chunk\n }\n }\n\n // Slice the string from `startIndex` to `endIndex` and add it to the chunks array\n chunks.push(str.substring(startIndex, endIndex));\n\n // Update the start index for the next chunk\n startIndex = endIndex;\n }\n\n return chunks;\n }\n\n if (this.prevHelpedCode != null && this.prevHelpedCode.trim() == this.editor.getValue().trim()) {\n // avoid regenerating for the same code\n alert('Your code has not changed, please click \"See Help Again\"');\n return;\n }\n let temptextarea = document.querySelector('#temp-textarea');\n if (temptextarea) {\n temptextarea.remove();\n }\n this.prevHelpedCode = this.editor.getValue();\n \n // Remove any existing loading prompt to reset the countdown\n let existingLoadingPrompt = $(this.outerDiv).find(\"#scaffolding-loading-prompt-\" + this.divid);\n if (existingLoadingPrompt.length) {\n existingLoadingPrompt.remove();\n }\n\n // Create a new loading prompt\n let loadingPrompt = document.createElement('div');\n loadingPrompt.id = 'scaffolding-loading-prompt-' + this.divid;\n loadingPrompt.classList.add('scaffolding-loading-prompt');\n\n // Create the loading spinner element\n let spinner = document.createElement('div');\n spinner.id = 'loading-spinner';\n\n // Add loading prompt and spinner to the outerDiv immediately\n this.outerDiv.insertBefore(loadingPrompt, this.outerDiv.firstChild);\n\n // Create and append the two lines (encouragement and countdown)\n let encouragementText = document.createElement('div');\n encouragementText.id = 'encouragement-text';\n loadingPrompt.appendChild(encouragementText);\n\n loadingPrompt.appendChild(spinner);\n\n let countdownText = document.createElement('div');\n countdownText.id = 'countdown-text';\n loadingPrompt.appendChild(countdownText);\n\n $(loadingPrompt).addClass('loading');\n loadingPrompt.scrollIntoView();\n\n // Display encouragement message\n encouragementText.innerText = \"Appreciate your effort! Please wait while we generate the help for you.\";\n countdownText.innerText = \"Working hard on displaying all blocks at once for you...\";\n\n let request_act = {\n type: 'request_help',\n code: this.editor.getValue(),\n }\n\n this.logBookEvent({\n event: \"gptparsons_request_base\",\n act: this.parsonspersonalize,\n div_id: this.divid\n });\n\n // Split and send the code chunks\n if (request_act.code) {\n let requestChunkIndex = 1; // Initialize a single counter for all chunks\n const codeChunks = splitIntoChunks(request_act.code, 512);\n codeChunks.forEach((chunk) => {\n this.logBookEvent({\n event: `gptparsons_request_code_${requestChunkIndex}`,\n act: JSON.stringify({ \n type: 'code',\n content: chunk, \n requestChunkIndex: requestChunkIndex, \n totalChunks: requestChunkIndex.length + splitIntoChunks(request_act.code, 512).length\n }),\n div_id: this.divid\n });\n requestChunkIndex++;\n });\n }\n\n this.helpText = await this.getParsonsCodeTailor();\n $(this.outerDiv).find(\"#scaffolding-loading-prompt-\" + this.divid).removeClass('loading');\n window.latestParsonsHelpID = \"\";\n this.reopenHelpBtnHandler(true);\n // check whether hold the regenerating button\n if (!this.helpLoaded) {\n this.helpLoaded = true;\n $(this.outerDiv).find(\".reopen-help-btn\").removeClass('hide');\n if (this.parsonspersonalize === \"movable\" || this.parsonspersonalize === \"partial\") {\n $(this.outerDiv).find(\".parsons-scaffolding-btn\").text(\"Regenerate Help\");\n }\n }\n }\n // CodeTailor function part ends here //\n\n createControls() {\n var ctrlDiv = document.createElement(\"div\");\n var butt;\n $(ctrlDiv).addClass(\"ac_actions\");\n // Run\n butt = document.createElement(\"button\");\n butt.title = $.i18n(\"msg_activecode_run_button_title\");\n $(butt).text($.i18n(\"msg_activecode_run_code\"));\n $(butt).addClass(\"btn btn-success run-button\");\n ctrlDiv.appendChild(butt);\n this.runButton = butt;\n // console.log(\"adding click function for run\");\n this.runButton.onclick = this.runButtonHandler.bind(this);\n $(butt).attr(\"type\", \"button\");\n\n if (this.enabledownload || eBookConfig.downloadsEnabled) {\n this.addDownloadButton(ctrlDiv);\n }\n if (!this.hidecode && !this.hidehistory) {\n this.addHistoryScrubber(true);\n }\n if (this.parseBooleanAttribute(this.origElem, \"data-gradebutton\") && !this.graderactive) {\n this.addFeedbackButton(ctrlDiv);\n }\n // Show/Hide Code\n if (this.hidecode) {\n this.enableHideShow(ctrlDiv);\n }\n // CodeLens\n if (this.parseBooleanAttribute(this.origElem, \"data-codelens\") && !this.graderactive) {\n this.enableCodeLens(ctrlDiv);\n }\n\n // CodeTailor\n if (this.parsonspersonalize === \"movable\" || this.parsonspersonalize === \"partial\") {\n let parsonsScaffoldingBtn = document.createElement(\"button\");\n parsonsScaffoldingBtn.innerText = \"Get Help\";\n parsonsScaffoldingBtn.classList.add(\"btn\", \"parsons-scaffolding-btn\");\n parsonsScaffoldingBtn.onclick = this.parsonsBtnHandler.bind(this);\n ctrlDiv.appendChild(parsonsScaffoldingBtn);\n\n let reopenScaffoldingBtn = document.createElement(\"button\");\n reopenScaffoldingBtn.innerText = \"See Help Again\";\n reopenScaffoldingBtn.classList.add(\"btn\", \"reopen-help-btn\", \"hide\");\n reopenScaffoldingBtn.onclick = this.reopenHelpBtnHandler.bind(this);\n ctrlDiv.appendChild(reopenScaffoldingBtn);\n }\n\n\n // Code reformatting\n if (reformatable.has(this.language)) {\n this.enableReformat(ctrlDiv);\n }\n\n // Audio Tour\n if ($(this.origElem).data(\"audio\")) {\n this.enableAudioTours(ctrlDiv);\n }\n if (eBookConfig.isInstructor) {\n this.enableInstructorSharing(ctrlDiv);\n }\n if (this.enablePartner) {\n this.setupPartner(ctrlDiv);\n }\n if (this.chatcodes && eBookConfig.enable_chatcodes) {\n this.enableChatCodes(ctrlDiv);\n }\n\n $(this.outerDiv).prepend(ctrlDiv);\n if (this.question) {\n if ($(this.question).html().match(/^\\s+$/)) {\n $(this.question).remove();\n } else {\n $(this.outerDiv).prepend(this.question);\n }\n }\n this.controlDiv = ctrlDiv;\n }\n\n addFeedbackButton(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text($.i18n(\"msg_activecode_show_feedback\"));\n $(butt).css(\"margin-left\", \"10px\");\n $(butt).attr(\"type\", \"button\");\n this.gradeButton = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(this.createGradeSummary.bind(this));\n }\n\n addDownloadButton(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).text(\"Download\");\n $(butt).addClass(\"btn save-button\");\n ctrlDiv.appendChild(butt);\n this.downloadButton = butt;\n $(butt).click(this.downloadFile.bind(this, this.language));\n $(butt).attr(\"type\", \"button\");\n }\n\n enableHideShow(ctrlDiv) {\n $(this.runButton).attr(\"disabled\", \"disabled\");\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text($.i18n(\"msg_activecode_show_code\"));\n $(butt).css(\"margin-left\", \"10px\");\n $(butt).attr(\"type\", \"button\");\n this.showHideButt = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(\n function () {\n $(this.codeDiv).toggle();\n if (this.historyScrubber == null) {\n this.addHistoryScrubber(true);\n } else {\n $(this.historyScrubber.parentElement).toggle();\n }\n if (\n $(this.showHideButt).text() ==\n $.i18n(\"msg_activecode_show_code\")\n ) {\n $(this.showHideButt).text(\n $.i18n(\"msg_activecode_hide_code\")\n );\n } else {\n $(this.showHideButt).text(\n $.i18n(\"msg_activecode_show_code\")\n );\n }\n if ($(this.runButton).attr(\"disabled\")) {\n $(this.runButton).removeAttr(\"disabled\");\n } else {\n $(this.runButton).attr(\"disabled\", \"disabled\");\n }\n }.bind(this)\n );\n }\n\n enableCodeLens(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text($.i18n(\"msg_activecode_show_codelens\"));\n $(butt).css(\"margin-left\", \"10px\");\n this.clButton = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(this.showCodelens.bind(this));\n }\n\n enableReformat(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text($.i18n(\"msg_activecode_reformat\"));\n $(butt).css(\"margin-left\", \"10px\");\n this.reformatButton = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(this.reformat.bind(this));\n }\n\n enableAudioTours(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text($.i18n(\"msg_activecode_audio_tour\"));\n $(butt).css(\"margin-left\", \"10px\");\n this.atButton = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(\n function () {\n new AudioTour(\n this.divid,\n this.code,\n 1,\n $(this.origElem).data(\"audio\")\n );\n }.bind(this)\n );\n }\n\n enableInstructorSharing(ctrlDiv) {\n let butt = document.createElement(\"button\");\n $(butt).addClass(\"btn btn-info\");\n $(butt).text(\"Share Code\");\n $(butt).css(\"margin-left\", \"10px\");\n this.shareButt = butt;\n ctrlDiv.appendChild(butt);\n $(butt).click(\n async function () {\n if (\n !confirm(\n \"You are about to share this code with ALL of your students. Are you sure you want to continue?\"\n )\n ) {\n return;\n }\n let data = {\n divid: this.divid,\n code: this.editor.getValue(),\n lang: this.language,\n };\n let request = new Request(\n eBookConfig.ajaxURL + \"broadcast_code.json\",\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(data),\n }\n );\n let post_promise = await fetch(request);\n if (!post_promise.ok) {\n if (\n post_promise.status === 303 ||\n post_promise.status === 404\n ) {\n alert(\"You must be logged in to share code\");\n } else {\n alert(\n \"Sharing Failed return status: ${post_promise.status}\"\n );\n }\n return;\n }\n let status = await post_promise.json();\n if (status.mess === \"success\") {\n alert(`Shared Code with ${status.share_count} students`);\n } else {\n alert(\"Sharing Failed\");\n }\n }.bind(this)\n );\n }\n\n setupPartner(ctrlDiv) {\n var checkPartner = document.createElement(\"input\");\n checkPartner.type = \"checkbox\";\n checkPartner.id = `${this.divid}_part`;\n ctrlDiv.appendChild(checkPartner);\n var plabel = document.createElement(\"label\");\n plabel.for = `${this.divid}_part`;\n $(plabel).text(\"Pair?\");\n ctrlDiv.appendChild(plabel);\n $(checkPartner).click(\n function () {\n if (this.partner) {\n this.partner = false;\n $(partnerTextBox).hide();\n this.partner = \"\";\n partnerTextBox.value = \"\";\n $(plabel).text(\"Pair?\");\n } else {\n let didAgree = localStorage.getItem(\"partnerAgree\");\n if (!didAgree) {\n didAgree = confirm(\n \"Pair Programming should only be used with the consent of your instructor.\" +\n \"Your partner must be a registered member of the class and have agreed to pair with you.\" +\n \"By clicking OK you certify that both of these conditions have been met.\"\n );\n if (didAgree) {\n localStorage.setItem(\"partnerAgree\", \"true\");\n } else {\n return;\n }\n }\n this.partner = true;\n $(plabel).text(\"with: \");\n $(partnerTextBox).show();\n }\n }.bind(this)\n );\n var partnerTextBox = document.createElement(\"input\");\n partnerTextBox.type = \"text\";\n ctrlDiv.appendChild(partnerTextBox);\n $(partnerTextBox).hide();\n $(partnerTextBox).change(\n function () {\n this.partner = partnerTextBox.value;\n }.bind(this)\n );\n }\n\n // This is probably obsolete. Not sure if anyone at Michigan will come back\n // to working on this again.\n enableChatCodes(ctrlDiv) {\n var chatBar = document.createElement(\"div\");\n var channels = document.createElement(\"span\");\n var topic = window.location.host + \"-\" + this.divid;\n ctrlDiv.appendChild(chatBar);\n $(chatBar).text(\"Chat: \");\n $(chatBar).append(channels);\n let butt = document.createElement(\"a\");\n $(butt).addClass(\"ac_opt btn btn-default\");\n $(butt).text(\"Create Channel\");\n $(butt).css(\"margin-left\", \"10px\");\n $(butt).attr(\"type\", \"button\");\n $(butt).attr(\"target\", \"_blank\");\n $(butt).attr(\n \"href\",\n \"http://\" +\n chatcodesServer +\n \"/new?\" +\n $.param({\n topic: window.location.host + \"-\" + this.divid,\n code: this.editor.getValue(),\n lang: \"Python\",\n })\n );\n this.chatButton = butt;\n chatBar.appendChild(butt);\n var updateChatCodesChannels = function () {\n var data = doc.data;\n var i = 1;\n $(channels).html(\"\");\n data[\"channels\"].forEach(function (channel) {\n if (!channel.archived && topic === channel.topic) {\n var link = $(\"\");\n var href =\n \"http://\" + chatcodesServer + \"/\" + channel.channelName;\n link.attr({\n href: href,\n target: \"_blank\",\n });\n link.text(\" \" + channel.channelName + \"(\" + i + \") \");\n $(channels).append(link);\n i++;\n }\n });\n if (i === 1) {\n $(channels).text(\"(no active converstations on this problem)\");\n }\n };\n doc.subscribe(updateChatCodesChannels);\n doc.on(\"op\", updateChatCodesChannels);\n }\n\n enableSaveLoad() {\n $(this.runButton).text($.i18n(\"msg_activecode_save_run\"));\n }\n\n // _`addHistoryScrubber`\n // ---------------------\n // Activecode -- If the code has not changed wrt the scrubber position value then don't save the code or reposition the scrubber\n // -- still call runlog, but add a parameter to not save the code\n // add an initial load history button\n // if there is no edit then there is no append to_save (True/False)\n async addHistoryScrubber(pos_last) {\n this.addingScrubber = true;\n let response;\n var reqData = {\n acid: this.divid,\n };\n if (this.sid !== undefined) {\n reqData[\"sid\"] = this.sid;\n }\n console.log(\"before get hist\");\n if (\n eBookConfig.practice_mode ||\n !eBookConfig.isLoggedIn ||\n (this.isTimed && !this.assessmentTaken)\n ) {\n // If this is timed and already taken we should restore history info\n this.renderScrubber();\n } else {\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/gethist`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(reqData),\n }\n );\n try {\n response = await fetch(request);\n let data = await response.json();\n if (!response.ok) {\n throw new Error(\n `Failed to get the history data: ${data.detail}`\n );\n }\n data = data.detail;\n if (data.history !== undefined) {\n this.history = this.history.concat(data.history);\n for (let t in data.timestamps) {\n this.timestamps.push(\n new Date(data.timestamps[t]).toLocaleString()\n );\n }\n }\n } catch (e) {\n console.log(`unable to fetch history: ${e}`);\n }\n this.renderScrubber(pos_last);\n }\n this.addingScrubber = false;\n return \"success\";\n }\n\n renderScrubber(pos_last) {\n console.log(\"making a new scrubber\");\n var scrubberDiv = document.createElement(\"div\");\n $(scrubberDiv).css(\"display\", \"inline-block\");\n $(scrubberDiv).css(\"margin-left\", \"10px\");\n $(scrubberDiv).css(\"margin-right\", \"10px\");\n $(scrubberDiv).css({\n \"min-width\": \"200px\",\n \"max-width\": \"300px\",\n });\n var scrubber = document.createElement(\"div\");\n this.timestampP = document.createElement(\"span\");\n this.slideit = function (ev, el) {\n let submittedCode = this.history[$(scrubber).slider(\"value\")];\n let code = this.readdLockedCode(submittedCode);\n this.editor.setValue(code);\n this.setLockedRegions();\n var curVal = this.timestamps[$(scrubber).slider(\"value\")];\n let pos = $(scrubber).slider(\"value\");\n let outOf = this.history.length;\n $(this.timestampP).text(`${curVal} - ${pos + 1} of ${outOf}`);\n // a slide will also result in a slidechange event we don't want to double\n // log these events. So do not log the slide until it stops and creates the changed\n if (ev !== null && ev.type != \"slide\") {\n this.logBookEvent({\n event: \"activecode\",\n act: \"slide:\" + curVal,\n div_id: this.divid,\n });\n }\n this.setHighlightLines();\n };\n $(scrubber).slider({\n max: this.history.length - 1,\n value: this.history.length - 1,\n });\n $(scrubber).css(\"margin\", \"10px\");\n $(scrubber).on(\"slide\", this.slideit.bind(this));\n $(scrubber).on(\"slidechange\", this.slideit.bind(this));\n scrubberDiv.appendChild(scrubber);\n // Add aria-label to the otherwise empty child for scrubber:\n scrubber.childNodes[0].setAttribute(\"aria-label\", \"History slider\")\n scrubberDiv.appendChild(this.timestampP);\n // If there is a deadline set then position the scrubber at the last submission\n // prior to the deadline\n if (this.deadline) {\n let i = 0;\n let done = false;\n while (i < this.history.length && !done) {\n if (new Date(this.timestamps[i]) > this.deadline) {\n done = true;\n } else {\n i += 1;\n }\n }\n i = i - 1;\n scrubber.value = Math.max(i, 0);\n let submittedCode = this.history[scrubber.value];\n let code = this.readdLockedCode(submittedCode);\n this.editor.setValue(code);\n this.setLockedRegions();\n $(scrubber).slider(\"value\", scrubber.value);\n } else if (pos_last) {\n scrubber.value = this.history.length - 1;\n let submittedCode = this.history[scrubber.value];\n let code = this.readdLockedCode(submittedCode);\n this.editor.setValue(code);\n this.setLockedRegions();\n } else {\n scrubber.value = 0;\n }\n this.setHighlightLines();\n let pos = $(scrubber).slider(\"value\");\n let outOf = this.history.length;\n let ts = this.timestamps[$(scrubber).slider(\"value\")];\n $(this.timestampP).text(`${ts} - ${pos + 1} of ${outOf}`);\n this.historyScrubber = scrubber;\n $(scrubberDiv).insertAfter(this.runButton);\n } // end definition of helper\n\n createOutput() {\n // Create a parent div with two elements: pre for standard output and a div\n // to hold turtle graphics output. We use a div in case the turtle changes from\n // using a canvas to using some other element like svg in the future.\n var outDiv = document.createElement(\"div\");\n $(outDiv).addClass(\"ac_output\");\n this.outDiv = outDiv;\n this.output = document.createElement(\"pre\");\n this.output.id = this.divid + \"_stdout\";\n this.output.setAttribute(\"aria-label\", \"Output\");\n this.output.setAttribute(\"aria-live\", \"polite\");\n this.output.setAttribute(\"aria-atomic\", \"true\");\n this.output.setAttribute(\"role\", \"log\");\n this.output.innerHTML = \"\";\n $(this.output).css(\"max-height\", \"400px\");\n $(this.output).css(\"overflow\", \"auto\");\n this.graphics = document.createElement(\"div\");\n this.graphics.id = this.divid + \"_graphics\";\n $(this.graphics).addClass(\"ac-canvas\");\n // This bit of magic adds an event which waits for a canvas child to be created on our\n // newly created div. When a canvas child is added we add a new class so that the visible\n // canvas can be styled in CSS. Which a the moment means just adding a border.\n $(this.graphics).on(\n \"DOMNodeInserted\",\n \"canvas\",\n function () {\n $(this.graphics).addClass(\"visible-ac-canvas\");\n }.bind(this)\n );\n\n var coachDiv = document.createElement(\"div\");\n coachDiv.classList.add(\"alert\", \"alert-warning\", \"codecoach\");\n coachDiv.setAttribute(\"aria-live\", \"polite\");\n coachDiv.setAttribute(\"aria-atomic\", \"true\");\n coachDiv.setAttribute(\"role\", \"log\");\n $(coachDiv).css(\"display\", \"none\");\n let coachHead = coachDiv.appendChild(document.createElement(\"h3\"));\n coachHead.textContent = $.i18n(\"msg_activecode_code_coach\");\n this.outerDiv.appendChild(coachDiv);\n this.codecoach = coachDiv;\n\n outDiv.appendChild(this.output);\n outDiv.appendChild(this.graphics);\n this.outerDiv.appendChild(outDiv);\n var lensDiv = document.createElement(\"div\");\n lensDiv.classList.add(\"codelens\");\n lensDiv.id = `${this.divid}_codelens`;\n $(lensDiv).css(\"display\", \"none\");\n this.codelens = lensDiv;\n this.outerDiv.appendChild(lensDiv);\n // Put the outer container for error messages in the dom\n this.eContainer = document.createElement(\"div\");\n this.eContainer.setAttribute(\"aria-live\", \"polite\");\n this.eContainer.setAttribute(\"aria-atomic\", \"true\");\n this.eContainer.setAttribute(\"role\", \"log\");\n this.eContainer.className = \"error alert alert-danger\";\n this.eContainer.id = this.divid + \"_errinfo\";\n this.eContainer.style.visibility = \"hidden\";\n this.outerDiv.appendChild(this.eContainer);\n }\n\n disableSaveLoad() {\n $(this.saveButton).addClass(\"disabled\");\n $(this.saveButton).attr(\"title\", \"Login to save your code\");\n $(this.loadButton).addClass(\"disabled\");\n $(this.loadButton).attr(\"title\", \"Login to load your code\");\n }\n\n computeChangesPerSecond() {\n const currentCode = this.editor.getValue();\n let lastCode;\n if (this.historyScrubber) {\n lastCode = this.history[this.historyScrubber.value - 1];\n } else {\n return 0;\n }\n\n // Compute the edit distance between the current code and the last code\n const editDistance = this.computeEditDistance();\n\n // Compute the time difference between the current code and the last code\n const currentTime = new Date().getTime();\n //const lastTime = this.timestamps[this.historyScrubber.value];\n const lastTime = this.startEditTimeStamp;\n const timeDifference = (currentTime - lastTime) / 1000;\n if (timeDifference > 60 * 60 * 10) {\n return -1;\n }\n\n // Compute the changes per second\n return editDistance / timeDifference;\n }\n\n computeEditDistance() {\n const currentCode = this.editor.getValue();\n let lastCode;\n if (this.historyScrubber) {\n lastCode = this.history[this.historyScrubber.value];\n } else {\n return 0;\n }\n\n // Initialize a 2D array to store the edit distances\n const dp = [];\n for (let i = 0; i <= currentCode.length; i++) {\n dp[i] = [];\n for (let j = 0; j <= lastCode.length; j++) {\n if (i === 0) {\n dp[i][j] = j;\n } else if (j === 0) {\n dp[i][j] = i;\n } else {\n dp[i][j] = 0;\n }\n }\n }\n\n // Compute the edit distances using dynamic programming\n for (let i = 1; i <= currentCode.length; i++) {\n for (let j = 1; j <= lastCode.length; j++) {\n if (currentCode[i - 1] === lastCode[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1];\n } else {\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1, // deletion\n dp[i][j - 1] + 1, // insertion\n dp[i - 1][j - 1] + 1 // substitution\n );\n }\n }\n }\n\n // Return the edit distance between the current code and the last code\n return dp[currentCode.length][lastCode.length];\n }\n downloadFile(lang) {\n var fnb = this.divid;\n var d = new Date();\n var fileName =\n fnb +\n \"_\" +\n d\n .toJSON()\n .substring(0, 10) // reverse date format\n .split(\"-\")\n .join(\"\") +\n \".\" +\n languageExtensions[lang];\n var code = this.editor.getValue();\n if (\"Blob\" in window) {\n var textToWrite = code.replace(/\\n/g, \"\\r\\n\");\n var textFileAsBlob = new Blob([textToWrite], {\n type: \"text/plain\",\n });\n if (\"msSaveOrOpenBlob\" in navigator) {\n navigator.msSaveOrOpenBlob(textFileAsBlob, fileName);\n } else {\n var downloadLink = document.createElement(\"a\");\n downloadLink.download = fileName;\n downloadLink.innerHTML = \"Download File\";\n downloadLink.href = window.URL.createObjectURL(textFileAsBlob);\n downloadLink.style.display = \"none\";\n document.body.appendChild(downloadLink);\n downloadLink.click();\n }\n } else {\n alert(\"Your browser does not support the HTML5 Blob.\");\n }\n }\n\n async createGradeSummary() {\n // get grade and comments for this assignment\n // get summary of all grades for this student\n // display grades in modal window\n var data = {\n div_id: this.divid,\n };\n let request = new Request(eBookConfig.ajaxURL + \"getassignmentgrade\", {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(data),\n });\n let response = await fetch(request);\n let report = await response.json();\n var body;\n // check for report['message']\n if (report) {\n if (report[\"version\"] == 2) {\n // new version; would be better to embed this in HTML for the activecode\n body =\n \"

    Grade Report

    \" +\n \"

    This question: \" +\n report[\"grade\"];\n if (report[\"released\"]) {\n body += \" out of \" + report[\"max\"];\n }\n body += \"

    \";\n if (report[\"released\"] == false) {\n body += \"Preliminary Comments: \";\n }\n body += report[\"comment\"] + \"

    \";\n } else {\n body =\n \"

    Grade Report

    \" +\n \"

    This assignment: \" +\n report[\"grade\"] +\n \"

    \" +\n \"

    \" +\n report[\"comment\"] +\n \"

    \" +\n \"

    Number of graded assignments: \" +\n report[\"count\"] +\n \"

    \" +\n \"

    Average score: \" +\n report[\"avg\"] +\n \"

    \";\n }\n } else {\n body = \"

    The server did not return any grade information

    \";\n }\n var html = `
    \n
    \n
    \n
    \n \n

    Assignment Feedback

    \n
    \n
    \n ${body}\n
    \n
    \n
    \n
    `;\n var el = $(html);\n el.modal();\n\n return response;\n }\n\n async showCodelens() {\n if (this.codelens.style.display == \"none\") {\n this.codelens.style.display = \"block\";\n this.clButton.innerText = $.i18n(\"msg_activecode_hide_codelens\");\n } else {\n this.codelens.style.display = \"none\";\n this.clButton.innerText = $.i18n(\"msg_activecode_show_in_codelens\");\n return;\n }\n var cl = this.codelens.firstChild;\n if (cl) {\n this.codelens.removeChild(cl);\n }\n var code = await this.buildProg(false);\n var myVars = {};\n myVars.code = code;\n myVars.origin = \"opt-frontend.js\";\n myVars.cumulative = false;\n myVars.heapPrimitives = false;\n myVars.drawParentPointers = false;\n myVars.textReferences = false;\n myVars.showOnlyOutputs = false;\n myVars.rawInputLstJSON = JSON.stringify([]);\n if (this.language == \"python\") {\n if (this.python3) {\n myVars.py = 3;\n } else {\n myVars.py = 2;\n }\n } else if (this.langauge == \"javascript\") {\n myVars.py = \"js\";\n } else {\n myVars.py = this.language;\n }\n myVars.curInstr = 0;\n myVars.codeDivWidth = 350;\n myVars.codeDivHeight = 400;\n var srcURL = \"https://pythontutor.com/iframe-embed.html\";\n var srcVars = $.param(myVars);\n var embedUrlStr = `${srcURL}#${srcVars}`;\n var myIframe = document.createElement(\"iframe\");\n myIframe.setAttribute(\"id\", this.divid + \"_codelens\");\n myIframe.setAttribute(\"width\", \"100%\");\n myIframe.setAttribute(\"height\", \"500\");\n myIframe.setAttribute(\"style\", \"display:block\");\n myIframe.style.background = \"#fff\";\n //myIframe.setAttribute(\"src\",srcURL)\n myIframe.src = embedUrlStr;\n this.codelens.appendChild(myIframe);\n this.logBookEvent({\n event: \"codelens\",\n act: \"view\",\n div_id: this.divid,\n });\n }\n\n reformat() {\n const first = this.editor.firstLine();\n const last = this.editor.lastLine();\n for (let i = first; i <= last; i++) {\n this.editor.indentLine(i);\n }\n this.reformatButton.blur();\n }\n\n toggleEditorVisibility() { }\n\n addErrorMessage(err) {\n // Add the error message\n this.errLastRun = true;\n console.log(err);\n var errHead = $(\"

    \").html(\"Error\");\n this.eContainer.appendChild(errHead[0]);\n var errText = this.eContainer.appendChild(\n document.createElement(\"pre\")\n );\n // But, adjust the line numbers. If the line number is <= pretextLines then it is in included code\n // if it is greater than the number of included lines but less than the pretext + current editor then it is in the student code.\n // adjust the line number we display by eliminating the pre-included code.\n if (err.traceback && err.traceback.length >= 1) {\n var errorLine = err.traceback[0].lineno;\n if (errorLine <= this.pretextLines) {\n errText.innerHTML =\n \"An error occurred in the hidden, included code. Sorry we can't give you a more helpful error message\";\n return;\n } else if (errorLine > this.progLines + this.pretextLines) {\n errText.innerHTML = `An error occurred after the end of your code.\nOne possible reason is that you have an unclosed parenthesis or string.\nAnother possibility is that there is an error in the hidden test code.\nYet another is that there is an internal error. The internal error message is: ${err.message}`;\n return;\n } else {\n if (this.pretextLines > 0) {\n err.traceback[0].lineno =\n err.traceback[0].lineno - this.pretextLines + 1;\n }\n }\n }\n var errString = err.toString();\n var to = errString.indexOf(\":\");\n var errName = errString.substring(0, to);\n errText.innerHTML = errString;\n $(this.eContainer).append(\"

    Description

    \");\n var errDesc = this.eContainer.appendChild(document.createElement(\"p\"));\n errDesc.innerHTML = errorText[errName];\n $(this.eContainer).append(\"

    To Fix

    \");\n var errFix = this.eContainer.appendChild(document.createElement(\"p\"));\n errFix.innerHTML = errorText[errName + \"Fix\"];\n var moreInfo = \"../ErrorHelp/\" + errName.toLowerCase() + \".html\";\n //console.log(\"Runtime Error: \" + err.toString());\n\n // No idea why this is here... already a . at the end of most messages.\n // timeOut = setTimeout(function () {\n // errFix.innerHTML += \".\";\n // }, 100);\n }\n setTimeLimit(timer) {\n var timelimit = this.timelimit;\n if (timer !== undefined) {\n timelimit = timer;\n }\n // set execLimit in milliseconds -- for student projects set this to\n // 25 seconds -- just less than Chrome's own timer.\n if (\n this.code.indexOf(\"ontimer\") > -1 ||\n this.code.indexOf(\"onclick\") > -1 ||\n this.code.indexOf(\"onkey\") > -1 ||\n this.code.indexOf(\"setDelay\") > -1\n ) {\n Sk.execLimit = null;\n } else {\n if (timelimit === \"off\") {\n Sk.execLimit = null;\n } else if (timelimit) {\n Sk.execLimit = timelimit;\n } else {\n Sk.execLimit = 25000;\n }\n }\n }\n builtinRead(x) {\n if (\n Sk.builtinFiles === undefined ||\n Sk.builtinFiles[\"files\"][x] === undefined\n )\n throw $.i18n(\"msg_activecode_file_not_found\", x);\n return Sk.builtinFiles[\"files\"][x];\n }\n fileReader(fileName) {\n // This function is called by Skulpt to read a file. We will sometimes enter\n // with internal skulpt filenames and sometimes with filenames referenced from\n // user source.\n\n // Check if element is in the DOM\n // For RST books fileName == element id\n let elem = document.getElementById(fileName);\n if (elem === null) {\n // For PTX books fileName is in data-filename, may or may not == element id\n elem = document.querySelector(`[data-filename=\"${fileName}\"]`);\n }\n\n // Check if the file is in the Skulpt builtinFiles.\n if(Sk.builtinFiles.files.hasOwnProperty(fileName)) {\n let skulptFile = Sk.builtinFiles[\"files\"][fileName];\n if(elem === null) {\n return skulptFile;\n } else {\n console.log(\"Name conflict for file: \" + fileName + \" in Skulpt and in the DOM. Using DOM file.\");\n }\n }\n\n // If in DOM and not in Skulpt builtinFiles, read from the DOM\n if (elem != null) {\n let data;\n if (elem.nodeName.toLowerCase() == \"textarea\") {\n data = elem.value;\n } else {\n let pre = elem.querySelector(\"pre\");\n if (pre) {\n data = pre.textContent;\n } else {\n data = elem.textContent;\n }\n }\n return data;\n }\n\n // Try the DB unless fileName ends with .js or .py Skulpt internals will\n // have these extensions. We don't want to try to load them from the DB.\n if (!(fileName.endsWith(\".js\") || fileName.endsWith(\".py\"))) {\n let result = null;\n $.ajax({\n async: false,\n url: `/ns/logger/get_source_code?course_id=${eBookConfig.course}&filename=${fileName}`,\n success: function (data) {\n result = data.detail.file_contents;\n }\n });\n if (result) {\n return result;\n } else {\n throw new Sk.builtin.IOError(\n $.i18n(\"msg_activecode_no_file_or_dir\", fileName)\n );\n }\n }\n // Silent exit for files we didn't attempt to find in DB\n }\n outputfun(text) {\n // bnm python 3\n if (this.outputLineCount > 1000) return;\n text = text\n .replace(//g, \">\")\n .replace(/\\n/g, \"
    \");\n // todo: try to make this use the suspension mechanism in skulpt\n return new Sk.misceval.promiseToSuspension(\n new Promise(\n function (resolve) {\n setTimeout(\n function () {\n if (this.outputLineCount < 1000) {\n $(this.output).append(text);\n this.outputLineCount += 1;\n resolve(Sk.builtin.none.none$);\n } else {\n if (this.outputLineCount == 1000) {\n $(this.output).append(\"Too Much output\");\n this.outputLineCount += 1;\n stopExecution = true;\n resolve(Sk.builtin.none.none$);\n }\n }\n }.bind(this),\n 1\n );\n }.bind(this)\n )\n );\n }\n\n filewriter(fobj, bytes) {\n let filecomponent = document.getElementById(fobj.name);\n if (!filecomponent) {\n let container = document.createElement(\"div\");\n $(container).addClass(\"runestone\");\n let tab = document.createElement(\"div\");\n $(tab).addClass(\"datafile_caption\");\n tab.innerHTML = `Data file: ${fobj.name}`;\n filecomponent = document.createElement(\"textarea\");\n filecomponent.rows = 10;\n filecomponent.cols = 50;\n filecomponent.id = fobj.name;\n $(filecomponent).css(\"margin-bottom\", \"5px\");\n $(filecomponent).addClass(\"ac_output\");\n container.appendChild(tab);\n container.appendChild(filecomponent);\n this.outerDiv.appendChild(container);\n } else {\n if (fobj.pos$ == 0) {\n $(filecomponent).val(\"\");\n }\n }\n let current = $(filecomponent).val();\n current = current + bytes.v;\n $(filecomponent).val(current);\n $(filecomponent).css(\"display\", \"block\");\n fobj.pos$ = current.length;\n return current.length;\n }\n\n async getIncludedCode(divid) {\n if (window.componentMap[divid]) {\n return window.componentMap[divid].editor.getValue();\n } else {\n let request = new Request(\n `/ns/logger/get_source_code?course_id=${eBookConfig.course}&acid=${divid}`,\n {\n method: \"GET\",\n headers: this.jsonHeaders,\n }\n );\n let wresult = await fetch(request);\n let obj = await wresult.json();\n return obj.detail.file_contents;\n }\n }\n\n trimLockedCode(code) {\n // remove any visible prefix and suffix code to leave just user editable code\n let visPrefixLength = this.visiblePrefix ? this.visiblePrefix.length : 0;\n let visSuffixLength = this.visibleSuffix ? this.visibleSuffix.length : 0;\n if (visSuffixLength > 0)\n code = code.slice(visPrefixLength, -visSuffixLength);\n else\n code = code.slice(visPrefixLength);\n return code;\n }\n\n readdLockedCode(code) {\n // add back the visible prefix and suffix code\n code = (this.visiblePrefix || \"\") + code + (this.visibleSuffix || \"\");\n return code;\n }\n\n async buildProg(useSuffix) {\n // assemble code from prefix, suffix, and editor for running.\n var pretext;\n var prog = this.editor.getValue() + \"\\n\";\n if (this.prefix) {\n prog = this.prefix + prog;\n }\n this.pretext = \"\";\n this.pretextLines = 0;\n this.progLines = prog.match(/\\n/g).length + 1;\n if (this.includes) {\n // iterate over the includes, in-order prepending to prog\n pretext = \"\";\n for (var x = 0; x < this.includes.length; x++) {\n let iCode = await this.getIncludedCode(this.includes[x]);\n pretext = pretext + iCode + \"\\n\";\n }\n this.pretext = pretext;\n if (this.pretext) {\n this.pretextLines = (this.pretext.match(/\\n/g) || \"\").length;\n }\n prog = pretext + prog;\n }\n //any visible suffix already is included in editor code\n if (useSuffix && this.suffix) {\n prog = prog + this.suffix;\n }\n return Promise.resolve(prog);\n }\n\n async manage_scrubber(saveCode) {\n if (this.historyScrubber === null && !this.autorun) {\n await this.addHistoryScrubber();\n }\n let userCode = this.trimLockedCode(this.editor.getValue());\n if (\n this.historyScrubber &&\n this.history[$(this.historyScrubber).slider(\"value\")] !=\n userCode\n ) {\n saveCode = \"True\";\n this.history.push(userCode);\n this.timestamps.push(new Date().toLocaleString());\n $(this.historyScrubber).slider(\n \"option\",\n \"max\",\n this.history.length - 1\n );\n $(this.historyScrubber).slider(\n \"option\",\n \"value\",\n this.history.length - 1\n );\n // is this needed? changing value in previous statement\n // already triggers slideit function\n //this.slideit(null);\n } else {\n saveCode = \"False\";\n }\n if (this.historyScrubber == null) {\n saveCode = \"False\";\n }\n return saveCode;\n }\n\n async checkCurrentAnswer() {\n try {\n await this.runProg();\n } catch (e) {\n console.log(`error running code ${e}`);\n }\n }\n\n // the sid parameter is optional and is used for group submissions\n async logCurrentAnswer(sid) {\n let submittedCode = this.trimLockedCode(this.editor.getValue());\n let data = {\n div_id: this.divid,\n code: submittedCode,\n language: this.language,\n errinfo: this.errinfo || \"\",\n to_save: this.saveCode || \"F\",\n prefix: this.pretext,\n suffix: this.suffix,\n partner: this.partner,\n }; // Log the run event\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n let editDist = this.computeEditDistance();\n let changesPerSecond = this.computeChangesPerSecond();\n data.editDist = editDist;\n data.changesPerSecond = changesPerSecond;\n await this.logRunEvent(data);\n // If unit tests were run there will be a unit_results\n if (this.unit_results) {\n let unitData = {\n act: this.unit_results,\n div_id: this.divid,\n event: \"unittest\",\n };\n if (typeof sid !== \"undefined\") {\n unitData.sid = sid;\n }\n await this.logBookEvent(unitData);\n }\n }\n\n async runCoaches() {\n //Run all available code coaches and update code coach div\n\n //clear anything after header in codecoach div and hide it\n $(this.codecoach).children().slice(1).remove();\n $(this.codecoach).css(\"display\", \"none\");\n\n //get code, run coaches\n let code = await this.buildProg(false);\n let results = [];\n for (let coach of this.codeCoachList) {\n results.push(coach.check(code));\n }\n\n //once all coaches are done, update div\n Promise.allSettled(results).then((promises) => {\n for (let p of promises) {\n if (\n p.status === \"fulfilled\" &&\n p.value !== null &&\n p.value.trim() !== \"\"\n ) {\n let checkDiv = document.createElement(\"div\");\n checkDiv.classList.add(\"python_check_results\");\n let checkPre = checkDiv.appendChild(\n document.createElement(\"pre\")\n );\n checkPre.textContent = p.value;\n $(this.codecoach).css(\"display\", \"block\");\n // screenreaders seem to miss error message without the delay\n setTimeout(() => {\n this.codecoach.append(checkDiv);\n }, 10);\n }\n }\n });\n }\n\n renderFeedback() {\n // The python unit test code builds the table as it is running the tests\n // In \"normal\" usage this is displayed immediately.\n // However in exam mode we make a div which is offscreen\n if (this.unit_results_divid) {\n if (this.unit_results_divid.indexOf(\"_offscreen_\") > 0) {\n let urDivid = `${this.divid}_offscreen_unit_results`;\n let unitFeedback = document.getElementById(urDivid);\n let tmp = document.body.removeChild(unitFeedback);\n if ($(this.outerDiv).find(`#${urDivid}`).length > 0) {\n tmp = $(this.outerDiv).find(`#${urDivid}`)[0];\n } else {\n this.outerDiv.appendChild(tmp);\n }\n $(tmp).show();\n } else {\n let urDivid = this.divid + \"_unit_results\";\n\n // clean up skulpt hardcoded colors:\n const urResults = document.getElementById(urDivid);\n const rowHeaders = urResults.querySelectorAll(\"tr > td:first-child\");\n for (const rh of rowHeaders) {\n let pass = rh.style.backgroundColor === \"rgb(131, 211, 130)\";\n rh.style.backgroundColor = null;\n rh.classList.add(pass ? \"ac-feedback-pass\" : \"ac-feedback-fail\");\n }\n\n if (\n $(this.outerDiv).find(`#${urDivid}`).length == 0 &&\n $(this.outerDiv).find(`#${urDivid}_offscreen_unit_results`)\n .length == 0\n ) {\n let urResults = document.getElementById(urDivid);\n // why do we do this? This doesn't seem to matter for grading...\n if (urResults) {\n this.outerDiv.appendChild(urResults);\n }\n }\n }\n }\n }\n\n toggleAlert() {\n if (this.is_toggle && this.runCount == 3) {\n if (\n this.errinfo != \"success\" ||\n this?.unit_results.substring(8, 11) != 100.0\n ) {\n setTimeout(function () {\n alert(\n \"Help is Available Using the Toggle Question Selector! You can try the Mixed-up Question first.\"\n );\n }, 500);\n this.logBookEvent({\n event: \"togglealert\",\n act: \"Help is Available Using the Toggle Question Selector\",\n div_id: this.divid,\n });\n }\n }\n }\n\n /* runProg has several async elements to it.\n * 1. Skulpt runs the python program asynchronously\n * 2. The history is restored asynchronously\n * 3. Logging is asynchronous\n *\n * This method returns the skulpt Promise and so the promise will resolve when skulpt is finished.\n * when finished this.unit_results will contain the results of any unit tests that have been run.\n * The table of results is constructed and added to the DOM by the python unittest.gui module in skulpt.\n *\n */\n async runProg(noUI, logResults) {\n console.log(\"starting runProg\");\n this.output.innerHTML = \"\";\n stopExecution = false;\n this.outputLineCount = 0;\n this.outputLines = [];\n if (typeof logResults === \"undefined\") {\n this.logResults = true;\n } else {\n this.logResults = logResults;\n }\n if (typeof noUI !== \"boolean\") {\n noUI = false;\n }\n var prog = await this.buildProg(true);\n this.saveCode = \"True\";\n $(this.output).text(\"\");\n if (this.unit_results_divid) {\n let urdiv = document.getElementById(\n this.unit_results_divid + \"_unit_results\"\n );\n if (urdiv) {\n urdiv.innerHTML = \"\";\n }\n }\n this.eContainer.innerHTML = \"\";\n this.eContainer.style.visibility = \"hidden\";\n\n if (this.codelens) {\n this.codelens.style.display = \"none\";\n }\n if (this.clButton) {\n this.clButton.innerText = $.i18n(\"msg_activecode_show_in_codelens\");\n }\n Sk.configure({\n output: this.outputfun.bind(this),\n read: this.fileReader,\n filewrite: this.filewriter.bind(this),\n __future__: Sk.python3,\n killableWhile: true,\n killableFor: true,\n nonreadopen: true,\n // python3: this.python3,\n imageProxy: \"/ns/rsproxy/imageproxy\",\n inputfunTakesPrompt: true,\n jsonpSites: [\"https://itunes.apple.com\"],\n });\n // Sk.JoBase = document.createElement(\"canvas\");\n // JoBase - currently broken - needs this canvas element\n Sk.divid = this.divid;\n Sk.logResults = logResults;\n if (this.graderactive && this.outerDiv.closest(\".loading\")) {\n Sk.gradeContainer = this.outerDiv.closest(\".loading\").id;\n } else {\n Sk.gradeContainer = this.divid;\n }\n this.setTimeLimit();\n (Sk.TurtleGraphics || (Sk.TurtleGraphics = {})).target = this.graphics;\n Sk.canvas = this.graphics.id; //todo: get rid of this here and in image\n if (!noUI) {\n this.saveCode = await this.manage_scrubber(this.saveCode);\n $(this.runButton).attr(\"disabled\", \"disabled\");\n $(this.historyScrubber).off(\"slidechange\");\n $(this.historyScrubber).slider(\"disable\");\n this.outDiv.style.visibility = \"visible\";\n }\n try {\n await Sk.misceval.asyncToPromise(\n function () {\n return Sk.importMainWithBody(\"\", false, prog, true);\n },\n {\n // suspension handlers\n \"*\": () => {\n if (stopExecution) {\n console.log(\"stopExecution is true\");\n throw new Error(`The program was interrupted`);\n }\n },\n }\n );\n if (!noUI) {\n if (this.slideit) {\n $(this.historyScrubber).on(\n \"slidechange\",\n this.slideit.bind(this)\n );\n }\n $(this.historyScrubber).slider(\"enable\");\n }\n this.errLastRun = false;\n this.errinfo = \"success\";\n } catch (err) {\n if (!noUI) {\n $(this.historyScrubber).on(\n \"slidechange\",\n this.slideit.bind(this)\n );\n $(this.historyScrubber).slider(\"enable\");\n }\n this.errinfo = err.toString();\n this.eContainer.style.visibility = \"visible\";\n setTimeout(() => {\n this.addErrorMessage(err);\n }, 10);\n } finally {\n $(this.runButton).removeAttr(\"disabled\");\n this.firstAfterRun = true;\n if (typeof window.allVisualizers != \"undefined\") {\n $.each(window.allVisualizers, function (i, e) {\n e.redrawConnectors();\n });\n }\n this.editor.acEditEvent = false;\n }\n }\n\n disableInteraction() {\n $(this.runButton).hide();\n $(this.codeDiv).addClass(\"ac-disabled\");\n }\n}\n\nvar languageExtensions = {\n python: \"py\",\n html: \"html\",\n javascript: \"js\",\n java: \"java\",\n python2: \"py\",\n python3: \"py\",\n cpp: \"cpp\",\n c: \"c\",\n sql: \"sql\",\n octave: \"m\",\n kotlin: \"kt\",\n};\n\nexport function isInViewport(element) {\n const rect = element.getBoundingClientRect();\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n}\n\n\n\n// Languages that get a \"Reformat\" button. Probably works fine for any curly\n// brace language but better not to add them until someone actually checks a\n// book using that language. Definitely works badly for Python since it will\n// indent anything after an `if` to be part of the if.\nvar reformatable = new Set([\"java\", \"cpp\", \"c\", \"javascript\"]);\n\nvar errorText = {};\n\nerrorText.ParseError = $.i18n(\"msg_sctivecode_parse_error\");\nerrorText.ParseErrorFix = $.i18n(\"msg_sctivecode_parse_error_fix\");\nerrorText.TypeError = $.i18n(\"msg_activecode_type_error\");\nerrorText.TypeErrorFix = $.i18n(\"msg_activecode_type_error_fix\");\nerrorText.NameError = $.i18n(\"msg_activecode_name_error\");\nerrorText.NameErrorFix = $.i18n(\"msg_activecode_name_error_fix\");\nerrorText.ValueError = $.i18n(\"msg_activecode_value_error\");\nerrorText.ValueErrorFix = $.i18n(\"msg_activecode_value_error_fix\");\nerrorText.AttributeError = $.i18n(\"msg_activecode_attribute_error\");\nerrorText.AttributeErrorFix = $.i18n(\"msg_activecode_attribute_error_fix\");\nerrorText.TokenError = $.i18n(\"msg_activecode_token_error\");\nerrorText.TokenErrorFix = $.i18n(\"msg_activecode_token_error_fix\");\nerrorText.TimeLimitError = $.i18n(\"msg_activecode_time_limit_error\");\nerrorText.TimeLimitErrorFix = $.i18n(\"msg_activecode_time_limit_error_fix\");\nerrorText.TimeoutError = $.i18n(\"msg_activecode_time_limit_error\");\nerrorText.TimeoutErrorFix = $.i18n(\"msg_activecode_time_limit_error_fix\");\nerrorText.Error = $.i18n(\"msg_activecode_general_error\");\nerrorText.ErrorFix = $.i18n(\"msg_activecode_general_error_fix\");\nerrorText.SyntaxError = $.i18n(\"msg_activecode_syntax_error\");\nerrorText.SyntaxErrorFix = $.i18n(\"msg_activecode_syntax_error_fix\");\nerrorText.IndexError = $.i18n(\"msg_activecode_index_error\");\nerrorText.IndexErrorFix = $.i18n(\"msg_activecode_index_error_fix\");\nerrorText.URIError = $.i18n(\"msg_activecode_uri_error\");\nerrorText.URIErrorFix = $.i18n(\"msg_activecode_uri_error_fix\");\nerrorText.ImportError = $.i18n(\"msg_activecode_import_error\");\nerrorText.ImportErrorFix = $.i18n(\"msg_activecode_import_error_fix\");\nerrorText.ReferenceError = $.i18n(\"msg_activecode_reference_error\");\nerrorText.ReferenceErrorFix = $.i18n(\"msg_activecode_reference_error_fix\");\nerrorText.ZeroDivisionError = $.i18n(\"msg_activecode_zero_division_error\");\nerrorText.ZeroDivisionErrorFix = $.i18n(\n \"msg_activecode_zero_division_error_fix\"\n);\nerrorText.RangeError = $.i18n(\"msg_activecode_range_error\");\nerrorText.RangeErrorFix = $.i18n(\"msg_activecode_range_error_fix\");\nerrorText.InternalError = $.i18n(\"msg_activecode_internal_error\");\nerrorText.InternalErrorFix = $.i18n(\"msg_activecode_internal_error_fix\");\nerrorText.IndentationError = $.i18n(\"msg_activecode_indentation_error\");\nerrorText.IndentationErrorFix = $.i18n(\"msg_activecode_indentation_error_fix\");\nerrorText.NotImplementedError = $.i18n(\"msg_activecode_not_implemented_error\");\nerrorText.NotImplementedErrorFix = $.i18n(\n \"msg_activecode_not_implemented_error_fix\"\n);\nerrorText.KeyError = $.i18n(\"msg_activecode_key_error\");\nerrorText.KeyErrorFix = $.i18n(\"msg_activecode_key_error_fix\");\nerrorText.AssertionError = $.i18n(\"msg_activecode_assertion_error\");\nerrorText.AssertionErrorFix = $.i18n(\"msg_activecode_assertion_error_fix\");\n\nString.prototype.replaceAll = function (target, replacement) {\n return this.split(target).join(replacement);\n};\n","var testString = `Starting Tests\nExpected: Answer Actual: Answer Message: Checking method printAnswer() Passed: true\nExpected: 6 line(s) of text Actual: 0 line(s) of text Message: Checking main method Passed: false\nHello World\nExpected: String String Actual: String String Message: Checking Instance Variable Type(s) Passed: true\nExpected: Question Actual: Question Message: Checking method printQuestion() Passed: true\nDebugging output\nMore debug output\nExpected: 2 Private Actual: 2 Private Message: Checking Private Instance Variable(s) Passed: true\nExpected: pass Actual: pass Message: Checking constructor with parameters Passed: true\nExpected: fail Actual: fail Message: Checking default constructor Passed: true\nEnding Tests\nYou got 6 out of 7 correct. 85.71%`;\n\nexport default class JUnitTestParser {\n constructor(output, parentId) {\n let patt = new RegExp(\n \"Expected:\\\\s+(.*?)Actual:\\\\s+(.*?)Message:\\\\s+(.*?)Passed:\\\\s+(true|false)\",\n \"g\"\n );\n this.textResults = \"\";\n let matches = output.matchAll(patt);\n let parent = document.createElement(\"div\");\n parent.classList.add(\"unittest-results\");\n let tbl = document.createElement(\"table\");\n tbl.classList.add(\"ac-feedback\");\n parent.appendChild(tbl);\n parent.setAttribute(\"id\", `${parentId}_unit_results`);\n let tr = document.createElement(\"tr\");\n tr.innerHTML =\n 'ResultExpectedActualNotes';\n tbl.appendChild(tr);\n for (const match of matches) {\n let tr = document.createElement(\"tr\");\n let td = document.createElement(\"td\");\n td.classList.add(\"ac-feedback\");\n if (match[match.length - 1] == \"true\") {\n td.classList.add(\"ac-feedback-pass\");\n td.innerHTML = $.i18n(\"msg_activecode_passed\");\n } else {\n td.classList.add(\"ac-feedback-fail\");\n td.innerHTML = $.i18n(\"msg_activecode_failed\");\n }\n tr.appendChild(td);\n tbl.appendChild(tr);\n for (let i = 1; i < match.length - 1; i++) {\n let td = document.createElement(\"td\");\n td.innerHTML = match[i];\n td.classList.add(\"ac-feedback\");\n tr.appendChild(td);\n }\n tbl.appendChild(tr);\n this.table = parent;\n this.textResults += match[0] + \"\\n\";\n output = output.replace(match[0], \"\");\n }\n let match = output.match(\n /You got\\s+(\\d+) out of (\\d+) correct.\\s+(\\d+\\.\\d+)%/\n );\n if (match) {\n output = output.replace(match[0], \"\");\n let pctString = document.createElement(\"span\");\n pctString.innerHTML = match[0];\n this.pctString = pctString;\n this.pct = match[3];\n this.passed = match[1];\n this.failed = match[2] - match[1];\n }\n output = output.replace(\"Starting Tests\", \"\");\n output = output.replace(\"Ending Tests\", \"\");\n output = output.replace(/\\n/g, \"
    \");\n output = output.replace(/(
    )+/g, \"
    \");\n // do not mess up this next line, it is THE hack that makes turtle graphics and images work\n output = output.replaceAll(\"<img\", \"\").html(this.origElem.innerHTML).text();\n $(this.runButton).text(\"Render\");\n this.editor.setValue(this.code);\n }\n\n async runProg() {\n var prog = await this.buildProg(true);\n let saveCode = \"True\";\n this.saveCode = await this.manage_scrubber(saveCode);\n $(this.output).text(\"\");\n this.outDiv.style.visibility = \"visible\";\n prog =\n \"\" +\n prog;\n this.output.srcdoc = prog;\n }\n\n createOutput() {\n var outDiv = document.createElement(\"div\");\n $(outDiv).addClass(\"ac_output\");\n this.outDiv = outDiv;\n this.output = document.createElement(\"iframe\");\n $(this.output).css(\"background-color\", \"white\");\n $(this.output).css(\"position\", \"relative\");\n $(this.output).css(\"height\", \"400px\");\n $(this.output).css(\"width\", \"100%\");\n outDiv.appendChild(this.output);\n this.outerDiv.appendChild(outDiv);\n var clearDiv = document.createElement(\"div\");\n $(clearDiv).css(\"clear\", \"both\"); // needed to make parent div resize properly\n this.outerDiv.appendChild(clearDiv);\n }\n enableSaveLoad() {\n $(this.runButton).text($.i18n(\"msg_activecode_render\"));\n }\n}\n","import { ActiveCode } from \"./activecode.js\";\nimport Handsontable from \"handsontable\";\nimport \"handsontable/dist/handsontable.full.css\";\nimport initSqlJs from \"sql.js/dist/sql-wasm.js\";\n\nvar allDburls = {};\n\nexport default class SQLActiveCode extends ActiveCode {\n constructor(opts) {\n super(opts);\n // fnprefix sets the path to load the sql-wasm.wasm file\n var bookprefix;\n var fnprefix;\n // Fix: the mode=browsing problem wich disables useRunestoneServices and\n // makes it impossible to cororectly load sql-wasm\n if (\n eBookConfig.useRunestoneServices ||\n window.location.search.includes(\"mode=browsing\")\n ) {\n bookprefix = `/ns/books/published/${eBookConfig.basecourse}`;\n fnprefix = bookprefix + \"/_static\";\n } else {\n // The else clause handles the case where you are building for a static web browser\n fnprefix = \"_static\";\n }\n this.config = {\n locateFile: (filename) => `${fnprefix}/${filename}`,\n };\n this.showLast = $(this.origElem).data(\"showlastsql\");\n var self = this;\n initSqlJs(this.config).then(function (SQL) {\n // set up call to load database asynchronously if given\n if (self.dburl) {\n if (self.dburl.startsWith(\"/_static\")) {\n // RST markup\n self.dburl = `${bookprefix}${self.dburl}`;\n } else if (self.dburl.startsWith(\"external\")) {\n // PTX markup\n if (\n eBookConfig.useRunestoneServices ||\n window.location.search.includes(\"mode=browsing\")\n ) {\n // On Runestone server\n self.dburl = `${bookprefix}/${self.dburl}`;\n } else {\n // static individual book\n self.dburl = `${self.dburl}`;\n }\n }\n $(self.runButton).attr(\"disabled\", \"disabled\");\n let buttonText = $(self.runButton).text();\n $(self.runButton).text($.i18n(\"msg_activecode_load_db\"));\n if (!(self.dburl in allDburls)) {\n allDburls[self.dburl] = {\n status: \"loading\",\n xWaitFor: jQuery.Deferred(),\n };\n } else {\n if (allDburls[self.dburl].status == \"loading\") {\n allDburls[self.dburl].xWaitFor.done(function () {\n self.db = allDburls[self.dburl].dbObject;\n $(self.runButton).removeAttr(\"disabled\");\n $(self.runButton).text(buttonText);\n });\n return;\n }\n self.db = allDburls[self.dburl].dbObject;\n $(self.runButton).removeAttr(\"disabled\");\n $(self.runButton).text(buttonText);\n return;\n }\n var xhr = new XMLHttpRequest();\n // For example: https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite\n xhr.open(\"GET\", self.dburl, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onload = (e) => {\n var uInt8Array = new Uint8Array(xhr.response);\n self.db = new SQL.Database(uInt8Array);\n allDburls[self.dburl].dbObject = self.db;\n $(self.runButton).text(buttonText);\n $(self.runButton).removeAttr(\"disabled\");\n allDburls[self.dburl].db = uInt8Array;\n allDburls[self.dburl].status = \"ready\";\n allDburls[self.dburl].xWaitFor.resolve();\n // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]\n };\n xhr.send();\n } else {\n self.db = new SQL.Database();\n }\n });\n }\n async runProg(noUI, logResults) {\n if (typeof logResults === \"undefined\") {\n this.logResults = true;\n } else {\n this.logResults = logResults;\n }\n if (typeof noUI !== \"boolean\") {\n noUI = false;\n }\n // Clear any old results\n this.saveCode = \"True\";\n let divid = this.divid + \"_sql_out\";\n let respDiv = document.getElementById(divid);\n if (respDiv) {\n respDiv.parentElement.removeChild(respDiv);\n }\n $(this.output).text(\"\");\n // Run this query\n let query = await this.buildProg(false); // false --> Do not include suffix\n if (!this.db) {\n $(this.output).text(\n `Error: Database not initialized! DBURL: ${this.dburl}`\n );\n return;\n }\n\n let it = this.db.iterateStatements(query);\n this.results = [];\n try {\n for (let statement of it) {\n let columns = statement.getColumnNames();\n if (columns.length > 0) {\n // data! probably a SELECT\n let data = [];\n while (statement.step()) {\n data.push(statement.get());\n }\n this.results.push({\n status: \"success\",\n columns: columns,\n values: data,\n rowcount: data.length,\n });\n } else {\n let nsql = statement.getNormalizedSQL();\n let prefix = nsql.substr(0, 6).toLowerCase();\n statement.step(); // execute the query\n // Try to detect INSERT/UPDATE/DELETE to give friendly feedback\n // on rows modified - unfortunately, this won't catch such queries\n // if they use CTEs. There seems to be no reliable way of knowing\n // when a SQLite query actually modified data.\n if (\n prefix === \"insert\" ||\n prefix === \"update\" ||\n prefix === \"delete\"\n ) {\n this.results.push({\n status: \"success\",\n operation: prefix,\n rowcount: this.db.getRowsModified(),\n });\n } else {\n this.results.push({ status: \"success\" });\n }\n }\n }\n } catch (e) {\n this.results.push({\n status: \"failure\",\n message: e.toString(),\n sql: it.getRemainingSQL(),\n });\n }\n\n if (this.results.length === 0) {\n this.results.push({\n status: \"failure\",\n message: \"No queries submitted.\",\n });\n }\n\n try {\n this.saveCode = await this.manage_scrubber(this.saveCode);\n if (this.slideit) {\n $(this.historyScrubber).on(\n \"slidechange\",\n this.slideit.bind(this)\n );\n }\n $(this.historyScrubber).slider(\"enable\");\n } catch (e) {\n console.log(`Failed to update scrubber ${e}`);\n }\n\n respDiv = document.createElement(\"div\");\n respDiv.id = divid;\n this.outDiv.appendChild(respDiv);\n this.outDiv.style.visibility = \"visible\";\n // Sometimes we don't want to show a bunch of intermediate results\n // like when we are including a bunch of previous statements from\n // other activecodes In that case the showlastsql flag can be set\n // so we only show the last result\n let resultArray = this.results;\n if (this.showLast) {\n resultArray = this.results.slice(-1);\n }\n for (let r of resultArray) {\n let section = document.createElement(\"div\");\n section.setAttribute(\"class\", \"ac_sql_result\");\n section.setAttribute(\"aria-live\", \"polite\");\n section.setAttribute(\"aria-atomic\", \"true\");\n section.setAttribute(\"role\", \"log\");\n respDiv.appendChild(section);\n if (r.status === \"success\") {\n if (r.columns) {\n let tableDiv = document.createElement(\"div\");\n section.appendChild(tableDiv);\n let maxHeight = 350;\n if (resultArray.length > 1) maxHeight = 200; // max height smaller if lots of results\n createTable(r, tableDiv, maxHeight);\n let messageBox = document.createElement(\"pre\");\n let rmsg = r.rowcount !== 1 ? \" rows \" : \" row \";\n let msg = \"\" + r.rowcount + rmsg + \"returned\";\n if (r.rowcount > 100) {\n msg = msg + \" (only first 100 rows displayed)\";\n }\n msg = msg + \".\";\n messageBox.textContent = msg;\n messageBox.setAttribute(\"class\", \"ac_sql_result_success\");\n section.appendChild(messageBox);\n } else if (r.rowcount) {\n let messageBox = document.createElement(\"pre\");\n let op = r.operation;\n op = op + (op.charAt(op.length - 1) === \"e\" ? \"d.\" : \"ed.\");\n let rmsg = r.rowcount !== 1 ? \" rows \" : \" row \";\n messageBox.textContent = \"\" + r.rowcount + rmsg + op;\n messageBox.setAttribute(\"class\", \"ac_sql_result_success\");\n section.appendChild(messageBox);\n } else {\n let messageBox = document.createElement(\"pre\");\n messageBox.textContent = \"Operation succeeded.\";\n messageBox.setAttribute(\"class\", \"ac_sql_result_success\");\n section.appendChild(messageBox);\n }\n } else {\n let messageBox = document.createElement(\"pre\");\n messageBox.textContent = r.message;\n section.classList.add(\"ac_sql_result_failure\");\n // screenreaders seem to miss error message without the delay\n setTimeout(() => {\n section.appendChild(messageBox);\n }, 10);\n }\n }\n\n // Now handle autograding\n if (this.suffix) {\n this.testResult = this.autograde(\n this.results[this.results.length - 1]\n );\n } else {\n $(this.output).css(\"visibility\", \"hidden\");\n }\n\n return Promise.resolve(\"done\");\n }\n\n async logCurrentAnswer(sid) {\n let data = {\n div_id: this.divid,\n code: this.editor.getValue(),\n language: this.language,\n errinfo: this.results[this.results.length - 1].status,\n to_save: this.saveCode,\n prefix: this.pretext,\n suffix: this.suffix,\n partner: this.partner,\n }; // Log the run event\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logRunEvent(data);\n\n if (this.unit_results) {\n let unitData = {\n event: \"unittest\",\n div_id: this.divid,\n course: eBookConfig.course,\n act: this.unit_results,\n };\n if (typeof sid !== \"undefined\") {\n unitData.sid = sid;\n }\n await this.logBookEvent(unitData);\n }\n }\n\n renderFeedback() {\n if (this.testResult) {\n $(this.output).text(this.testResult);\n $(this.output).css(\"visibility\", \"visible\");\n }\n }\n\n autograde(result_table) {\n var tests = this.suffix.split(/\\n/);\n this.passed = 0;\n this.failed = 0;\n // Tests should be of the form\n // assert row,col oper value for example\n // assert 4,4 == 3\n var result = \"\";\n tests = tests.filter(function (s) {\n return s.indexOf(\"assert\") > -1;\n });\n for (let test of tests) {\n let wlist = test.split(/\\s+/);\n wlist.shift();\n let loc = wlist.shift();\n let oper = wlist.shift();\n let expected = wlist.join(\" \");\n let [row, col] = loc.split(\",\");\n result += this.testOneAssert(\n row,\n col,\n oper,\n expected,\n result_table\n );\n result += \"\\n\";\n }\n let pct = (100 * this.passed) / (this.passed + this.failed);\n if (isNaN(pct)) {\n pct = 0.0;\n }\n pct = pct.toLocaleString(undefined, { maximumFractionDigits: 2 });\n result += `You passed ${this.passed} out of ${this.passed + this.failed\n } tests for ${pct}%`;\n this.unit_results = `percent:${pct}:passed:${this.passed}:failed:${this.failed}`;\n return result;\n }\n testOneAssert(row, col, oper, expected, result_table) {\n // make sure row and col are in bounds\n let actual;\n let output = \"\";\n try {\n actual = result_table.values[row][col];\n } catch (e) {\n output = `Failed Not enough data to check row ${row} or column ${col}`;\n this.failed++;\n return output;\n }\n const operators = {\n \"==\": function (operand1, operand2) {\n return operand1 == operand2;\n },\n \"!=\": function (operand1, operand2) {\n return operand1 != operand2;\n },\n \">\": function (operand1, operand2) {\n return operand1 > operand2;\n },\n \"<\": function (operand1, operand2) {\n return operand1 > operand2;\n },\n };\n let res = operators[oper](actual, expected);\n if (res) {\n output = `Pass: ${actual} ${oper} ${expected} in row ${row} column ${result_table.columns[col]}`;\n this.passed++;\n } else {\n output = `Failed ${actual} ${oper} ${expected} in row ${row} column ${result_table.columns[col]}`;\n this.failed++;\n }\n return output;\n }\n}\n\nfunction createTable(tableData, container, maxHeight) {\n let data = tableData.values;\n let trimRows = undefined;\n if (data.length === 0) {\n // kludge: no column headers will show up unless we do this\n data = [tableData.columns.map((e) => null)];\n trimRows = [0];\n }\n\n var hot = new Handsontable(container, {\n data: data,\n trimRows: trimRows,\n width: \"100%\",\n height: maxHeight,\n autoRowSize: true,\n autoColumnSize: { useHeaders: true },\n rowHeaders: false,\n colHeaders: tableData.columns,\n editor: false,\n maxRows: 100,\n filters: false,\n dropdownMenu: false,\n licenseKey: \"non-commercial-and-evaluation\",\n });\n\n // calculate actual height and resize\n let actualHeight = 40; // header height + small margin\n if (tableData.values.length > 0) {\n for (let i = 0; i < data.length; i++) {\n actualHeight = actualHeight + hot.getRowHeight(i);\n if (actualHeight > maxHeight) break;\n }\n }\n\n hot.updateSettings({ height: actualHeight });\n\n return hot;\n}\n","import { ActiveCode, isInViewport } from \"./activecode.js\";\nimport JSActiveCode from \"./activecode_js.js\";\nimport HTMLActiveCode from \"./activecode_html.js\";\nimport SQLActiveCode from \"./activecode_sql.js\";\nimport LiveCode from \"./livecode.js\";\nimport {\n TimedActiveCode,\n TimedLiveCode,\n TimedJSActiveCode,\n TimedHTMLActiveCode,\n TimedSQLActiveCode,\n} from \"./timed_activecode\";\nimport \"../../common/js/jquery.highlight.js\";\n\nexport default class ACFactory {\n constructor() {\n this.foo = \"bar\";\n }\n static createActiveCode(orig, lang, addopts) {\n var opts = {\n orig: orig,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n python3: eBookConfig.python3,\n };\n if (addopts) {\n for (var attrname in addopts) {\n opts[attrname] = addopts[attrname];\n }\n }\n if (lang === undefined) {\n let dataElem = opts.orig.querySelector(\"[data-lang]\");\n lang = dataElem ? dataElem.dataset.lang : undefined;\n }\n if (opts.timed == true) {\n if (lang === \"python\") {\n return new TimedActiveCode(opts);\n } else if (\n lang === \"java\" ||\n lang === \"cpp\" ||\n lang === \"c\" ||\n lang === \"python3\"\n ) {\n return new TimedLiveCode(opts);\n } else if (lang === \"javascript\") {\n return new TimedJSActiveCode(opts);\n } else if (lang === \"htmlmixed\" || lang === \"html\") {\n return new TimedHTMLActiveCode(opts);\n } else if (lang === \"sql\") {\n return new TimedSQLActiveCode(opts);\n } else {\n return new TimedActiveCode(opts);\n }\n } else {\n if (lang === \"javascript\") {\n return new JSActiveCode(opts);\n } else if (lang === \"htmlmixed\" || lang === \"html\") {\n return new HTMLActiveCode(opts);\n } else if (lang === \"sql\") {\n return new SQLActiveCode(opts);\n } else if (\n [\"java\", \"cpp\", \"c\", \"python3\", \"python2\", \"octave\", \"kotlin\"].indexOf(\n lang\n ) > -1\n ) {\n return new LiveCode(opts);\n } else {\n // default is python\n return new ActiveCode(opts);\n }\n }\n }\n // used by web2py controller(s)\n static addActiveCodeToDiv(outerdivid, acdivid, sid, initialcode, language) {\n var acdiv = document.getElementById(acdivid);\n acdiv.innerHTML = \"\";\n var thepre = document.createElement(\"textarea\");\n thepre[\"data-component\"] = \"activecode\";\n thepre.id = outerdivid;\n thepre.dataset.lang = language;\n acdiv.appendChild(thepre);\n var opts = {\n orig: thepre,\n useRunestoneServices: true,\n };\n var addopts = {\n sid: sid,\n graderactive: true,\n };\n var newac = ACFactory.createActiveCode(thepre, language, addopts);\n var savediv = newac.divid;\n newac.divid = savediv;\n newac.editor.setSize(500, 300);\n setTimeout(function () {\n newac.editor.refresh();\n }, 500);\n }\n static createActiveCodeFromOpts(opts) {\n return ACFactory.createActiveCode(opts.orig, opts.lang, opts);\n }\n static createScratchActivecode() {\n /* set up the scratch Activecode editor in the search menu */\n // use the URL to assign a divid - each page should have a unique Activecode block id.\n // Remove everything from the URL but the course and page name\n // todo: this could probably be eliminated and simply moved to the template file\n\n if (eBookConfig.enableScratchAC == false) return;\n\n var divid = eBookConfig.course + \"_scratch_ac\";\n divid = divid.replace(/[#.]/g, \"\"); // in case book title has characters that will mess up our selectors\n eBookConfig.scratchDiv = divid;\n let stdin = \"\";\n var lang = eBookConfig.acDefaultLanguage\n ? eBookConfig.acDefaultLanguage\n : \"python\";\n if (lang === \"java\" || lang === \"cpp\" || lang === \"python3\") {\n stdin = `data-stdin=\"text for stdin\"`;\n }\n const languageNames = {\n cpp: \"C++\",\n c: \"C\",\n html: \"HTML\",\n htmlmixed: \"HTML\",\n java: \"Java\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n kotlin: \"Kotlin\",\n octave: \"Octave\",\n python: \"Python\",\n py2: \"Python 2\",\n python2: \"Python 2\",\n py3: \"Python 3\",\n py3anaconda: \"Python 3 with Anaconda\",\n python3: \"Python 3\",\n ruby: \"Ruby\",\n sql: \"SQL\",\n ts: \"TypeScript\",\n };\n\n // generate the HTML\n var html = `
    \n
    \n
    \n
    \n \n

    Scratch ActiveCode (${languageNames[lang.toLowerCase()] || lang\n })

    \n
    \n
    \n
    \n

    Use this area for writing code or taking notes.

    \n \n
    \n
    \n
    \n
    \n
    `;\n var el = document.createElement(\"div\");\n el.innerHTML = html;\n document.body.appendChild(el);\n let observable = document.getElementById(\"ac_modal_\" + divid);\n // when the modal becomes visible we want to refresh the CodeMirror editor to ensure\n // that it is properly displayed.\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === 'style' || mutation.attributeName === 'class') {\n if (isInViewport(observable)) {\n observable.querySelectorAll(\".CodeMirror\").forEach(function (e) {\n e.CodeMirror.refresh();\n });\n }\n }\n });\n });\n\n // Start observing the element for style changes\n observer.observe(observable, {\n attributes: true,\n attributeFilter: ['style', 'class']\n });\n\n //todo intercept the close event and return focus to the pencil icon\n let closeBtn = document.querySelector(\".ac-modal-header button.close\");\n closeBtn.addEventListener(\"click\", function () {\n let popUp = document.getElementById(\"ac_modal_\" + divid);\n popUp.style.display = \"none\";\n document.querySelector(\".activecode-toggle\").focus();\n });\n }\n\n // Note: this function is called from popScratchAC in webpack.index.js\n // this happens after activecode.js is dynamically loaded.\n static toggleScratchActivecode() {\n if (!eBookConfig.enableScratchAC) return;\n var divid = \"ac_modal_\" + eBookConfig.scratchDiv;\n var realDiv = document.getElementById(divid);\n realDiv.classList.remove(\"ac_section\");\n realDiv.style.display = (realDiv.style.display === \"none\" || realDiv.style.display === \"\") ? \"block\" : \"none\";\n\n const selectors = '.first-focusable, button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n let firstFocusableElement = realDiv.querySelector(selectors);\n let focusableElements = realDiv.querySelectorAll(selectors);\n let lastFocusableElement =\n focusableElements[focusableElements.length - 1];\n\n realDiv.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Tab\") {\n firstFocusableElement = realDiv.querySelector(selectors);\n focusableElements = realDiv.querySelectorAll(selectors);\n lastFocusableElement =\n focusableElements[focusableElements.length - 1];\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstFocusableElement) {\n event.preventDefault();\n lastFocusableElement.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastFocusableElement) {\n event.preventDefault();\n firstFocusableElement.focus();\n }\n }\n } else {\n if (event.key === \"Escape\") {\n realDiv.style.display = \"none\";\n document.querySelector(\".activecode-toggle\").focus();\n }\n }\n });\n\n\n\n if (firstFocusableElement) {\n console.log(`focus on ${firstFocusableElement}`);\n firstFocusableElement.focus();\n }\n }\n}\n\n//\n// Page Initialization\n//\n\ndocument.addEventListener(\"runestone:login-complete\", function () {\n ACFactory.createScratchActivecode();\n document.querySelectorAll(\"[data-component='activecode']\").forEach(function (element) {\n if (element.closest(\"[data-component='timedAssessment']\") === null) {\n try {\n let textArea = element.querySelector(\"textarea\");\n window.componentMap[element.id] = ACFactory.createActiveCode(element, textArea ? textArea.dataset.lang : null);\n } catch (err) {\n console.error(`Error rendering Activecode Problem ${element.id}\n Details: ${err}`);\n console.error(err.stack);\n }\n }\n });\n if (loggedout) {\n for (let k in window.componentMap) {\n if (window.componentMap[k].disableSaveLoad) {\n window.componentMap[k].disableSaveLoad();\n }\n }\n } else {\n for (let k in window.componentMap) {\n if (window.componentMap[k].enableSaveLoad) {\n window.componentMap[k].enableSaveLoad();\n }\n }\n }\n});\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\n\nwindow.component_factory.activecode = ACFactory.createActiveCodeFromOpts;\n\n// This is the easiest way to expose this outside the module.\nwindow.ACFactory = ACFactory;\n\n// This seems a bit hacky and possibly brittle, but its hard to know how long it will take to\n// figure out the login/logout status of the user. Sometimes its immediate, and sometimes its\n// long. So to be safe we'll do it both ways..\nvar loggedout;\ndocument.addEventListener(\"runestone:logout\", function () {\n loggedout = true;\n});\ndocument.addEventListener(\"runestone:logout\", function () {\n for (let k in window.componentMap) {\n if (\n window.componentMap.hasOwnProperty(k) &&\n window.componentMap[k].attributes[\"data-component\"] == \"activecode\"\n ) {\n window.componentMap[k].disableSaveLoad();\n }\n }\n});\n","/*\nThe TimedActivecode classes are a great example of where multiple inheritance would be useful\nBut since Javascript does not support multiple inheritance we use the mixin pattern.\n\n*/\nimport LiveCode from \"./livecode\";\nimport { ActiveCode } from \"./activecode\";\nimport JSActiveCode from \"./activecode_js\";\nimport HTMLActiveCode from \"./activecode_html\";\nimport SQLActiveCode from \"./activecode_sql\";\n\nvar TimedActiveCodeMixin = {\n timedInit: async function (opts) {\n this.isTimed = true;\n this.hideButtons();\n this.needsReinitialization = true; // the run button click listener needs to be reinitialized\n this.containerDiv.classList.add(\"timedComponent\");\n window.componentMap[this.divid] = this;\n return true;\n },\n\n hideButtons: function () {\n var buttonList = [\n this.saveButton,\n this.loadButton,\n this.gradeButton,\n this.showHideButt,\n this.coachButton,\n this.atButton,\n ];\n for (var i = 0; i < buttonList.length; i++) {\n if (buttonList[i] !== undefined && buttonList[i] !== null)\n $(buttonList[i]).hide();\n }\n },\n\n // bje - not needed anymore\n renderTimedIcon: function (component) {\n // renders the clock icon on timed components. The component parameter\n // is the element that the icon should be appended to.\n var timeIconDiv = document.createElement(\"div\");\n var timeIcon = document.createElement(\"img\");\n $(timeIcon).attr({\n src: \"../_static/clock.png\",\n style: \"width:15px;height:15px\",\n });\n timeIconDiv.className = \"timeTip\";\n timeIconDiv.title = \"\";\n timeIconDiv.appendChild(timeIcon);\n $(component).prepend(timeIconDiv);\n },\n\n checkCorrectTimed: function () {\n // pct_correct is set by the unittest/gui.py module in skulpt.\n // it relies on finding this object in the edList\n if (this.isAnswered) {\n if (this.pct_correct >= 100.0) {\n return \"T\";\n } else {\n return \"F\";\n }\n } else {\n return \"I\"; // we ignore this in the grading if no unittests\n }\n },\n\n hideFeedback: function () {\n $(this.output).css(\"visibility\", \"hidden\");\n },\n\n reinitializeListeners: function (taken) {\n if (!this.runButton.onclick) {\n console.log(\"reattaching runbuttonhandler\");\n this.runButton.onclick = this.runButtonHander.bind(this);\n }\n $(this.codeDiv).show();\n this.runButton.disabled = false;\n $(this.codeDiv).removeClass(\"ac-disabled\");\n this.editor.refresh();\n if (this.historyScrubber !== null) {\n $(this.historyScrubber).slider({\n max: this.history.length - 1,\n value: this.history.length - 1,\n slide: this.slideit.bind(this),\n change: this.slideit.bind(this),\n });\n }\n if (taken) {\n $(`#${this.divid}_unit_results`).show();\n }\n },\n};\n\nexport class TimedLiveCode extends LiveCode {\n constructor(opts) {\n super(opts);\n this.timedInit(opts);\n }\n}\n\nObject.assign(TimedLiveCode.prototype, TimedActiveCodeMixin);\n\nexport class TimedActiveCode extends ActiveCode {\n constructor(opts) {\n super(opts);\n this.timedInitComplete = this.timedInit(opts);\n }\n\n // for timed exams we need to call runProg and tell it that there is\n // no GUI for sliders or other things.\n // the answers.\n async checkCurrentAnswer() {\n let noUI = true;\n const result = await this.timedInitComplete;\n if (this.isAnswered) {\n await this.runProg(noUI, false);\n }\n }\n}\n\nObject.assign(TimedActiveCode.prototype, TimedActiveCodeMixin);\n\nexport class TimedJSActiveCode extends JSActiveCode {\n constructor(opts) {\n super(opts);\n this.timedInit(opts);\n }\n}\nObject.assign(TimedJSActiveCode.prototype, TimedActiveCodeMixin);\n\nexport class TimedHTMLActiveCode extends HTMLActiveCode {\n constructor(opts) {\n super(opts);\n this.timedInit(opts);\n }\n}\nObject.assign(TimedHTMLActiveCode.prototype, TimedActiveCodeMixin);\n\nexport class TimedSQLActiveCode extends SQLActiveCode {\n constructor(opts) {\n super(opts);\n this.timedInit(opts);\n }\n}\nObject.assign(TimedSQLActiveCode.prototype, TimedActiveCodeMixin);\n","$.i18n().load({\n en: {\n msg_activecode_load_history: \"Load History\",\n msg_activecode_audio_tour: \"Audio Tour\",\n msg_activecode_loaded_code: \"Loaded your saved code.\",\n msg_activecode_no_saved_code: \"No saved code.\",\n msg_activecode_run_code: \"Run\",\n msg_activecode_show_feedback: \"Show Feedback\",\n msg_activecode_show_code: \"Show Code\",\n msg_activecode_hide_code: \"Hide Code\",\n msg_activecode_show_codelens: \"Show CodeLens\",\n msg_activecode_show_in_codelens: \"Show in CodeLens\",\n msg_activecode_hide_codelens: \"Hide Codelens\",\n msg_activecode_reformat: \"Reformat\",\n\n msg_activecode_parse_error:\n \"A parse error means that Python does not understand the syntax on the line the error message points out. Common examples are forgetting commas beteween arguments or forgetting a : on a for statement\",\n msg_activecode_parse_error_fix:\n \"To fix a parse error you just need to look carefully at the line with the error and possibly the line before it. Make sure it conforms to all of Python's rules.\",\n msg_activecode_type_error:\n \"Type errors most often occur when an expression tries to combine two objects with types that should not be combined. Like raising a string to a power\",\n msg_activecode_type_error_fix:\n \"To fix a type error you will most likely need to trace through your code and make sure the variables have the types you expect them to have. It may be helpful to print out each variable along the way to be sure its value is what you think it should be.\",\n msg_activecode_name_error:\n \"A name error almost always means that you have used a variable before it has a value. Often this may be a simple typo, so check the spelling carefully.\",\n msg_activecode_name_error_fix:\n \"Check the right hand side of assignment statements and your function calls, this is the most likely place for a NameError to be found.\",\n msg_activecode_value_error:\n \"A ValueError most often occurs when you pass a parameter to a function and the function is expecting one type and you pass another.\",\n msg_activecode_value_error_fix:\n \"The error message gives you a pretty good hint about the name of the function as well as the value that is incorrect. Look at the error message closely and then trace back to the variable containing the problematic value.\",\n msg_activecode_attribute_error:\n \"This error message is telling you that the object on the left hand side of the dot, does not have the attribute or method on the right hand side.\",\n msg_activecode_attribute_error_fix:\n \"The most common variant of this message is that the object undefined does not have attribute X. This tells you that the object on the left hand side of the dot is not what you think. Trace the variable back and print it out in various places until you discover where it becomes undefined. Otherwise check the attribute on the right hand side of the dot for a typo.\",\n msg_activecode_token_error:\n \"Most of the time this error indicates that you have forgotten a right parenthesis or have forgotten to close a pair of quotes.\",\n msg_activecode_token_error_fix:\n \"Check each line of your program and make sure that your parenthesis are balanced.\",\n msg_activecode_time_limit_error:\n \"Your program is running too long. Most programs in this book should run in less than 10 seconds easily. This probably indicates your program is in an infinite loop.\",\n msg_activecode_time_limit_error_fix:\n \"Add some print statements to figure out if your program is in an infinte loop. If it is not you can increase the run time with sys.setExecutionLimit(msecs)\",\n msg_activecode_general_error:\n \"Your program is running for too long. Most programs in this book should run in less than 30 seconds easily. This probably indicates your program is in an infinite loop.\",\n msg_activecode_general_error_fix:\n \"Add some print statements to figure out if your program is in an infinte loop. If it is not you can increase the run time with sys.setExecutionLimit(msecs)\",\n msg_activecode_syntax_error:\n \"This message indicates that Python can't figure out the syntax of a particular statement. Some examples are assigning to a literal, or a function call\",\n msg_activecode_syntax_error_fix:\n \"Check your assignment statements and make sure that the left hand side of the assignment is a variable, not a literal or a function.\",\n msg_activecode_key_error:\n \"This message indicates that you are trying to access an element of a dictionary, but the dictionary does not have that the key you are using.\",\n msg_activecode_key_error_fix:\n \"You may have a typo in the name of your key. It is also good practice to check if the key exists using a statement like if key in mydict. You can also use mydict.get(key,defaultvalue) so that if the key is not in the dictionary you get the default value instead of an error.\",\n msg_activecode_index_error:\n \"This message means that you are trying to index past the end of a string or a list. For example if your list has 3 things in it and you try to access the item at position 3 or more.\",\n msg_activecode_index_error_fix:\n \"Remember that the first item in a list or string is at index position 0, quite often this message comes about because you are off by one. Remember in a list of length 3 the last legal index is 2\",\n msg_activecode_uri_error: \"\",\n msg_activecode_uri_error_fix: \"\",\n msg_activecode_import_error:\n \"This error message indicates that you are trying to import a module that does not exist\",\n msg_activecode_import_error_fix:\n \"One problem may simply be that you have a typo. It may also be that you are trying to import a module that exists in 'real' Python, but does not exist in this book. If this is the case, please submit a feature request to have the module added.\",\n msg_activecode_reference_error:\n \"This is most likely an internal error, particularly if the message references the console.\",\n msg_activecode_reference_error_fix:\n \"Try refreshing the webpage, and if the error continues, submit a bug report along with your code\",\n msg_activecode_zero_division_error:\n \"This tells you that you are trying to divide by 0. Typically this is because the value of the variable in the denominator of a division expression has the value 0\",\n msg_activecode_zero_division_error_fix:\n \"You may need to protect against dividing by 0 with an if statment, or you may need to rexamine your assumptions about the legal values of variables, it could be an earlier statment that is unexpectedly assigning a value of zero to the variable in question.\",\n msg_activecode_range_error:\n \"This message almost always shows up in the form of Maximum call stack size exceeded.\",\n msg_activecode_range_error_fix:\n \"This always occurs when a function calls itself. Its pretty likely that you are not doing this on purpose. Except in the chapter on recursion. If you are in that chapter then its likely you haven't identified a good base case.\",\n msg_activecode_internal_error:\n \"An Internal error may mean that you've triggered a bug in our Python\",\n msg_activecode_internal_error_fix:\n \"Report this error, along with your code as a bug.\",\n msg_activecode_indentation_error:\n \"This error occurs when you have not indented your code properly. This is most likely to happen as part of an if, for, while or def statement.\",\n msg_activecode_indentation_error_fix:\n \"Check your if, def, for, and while statements to be sure the lines are properly indented beneath them. Another source of this error comes from copying and pasting code where you have accidentally left some bits of code lying around that don't belong there anymore.\",\n msg_activecode_not_implemented_error:\n \"This error occurs when you try to use a builtin function of Python that has not been implemented in this in-browser version of Python.\",\n msg_activecode_not_implemented_error_fix:\n \"For now the only way to fix this is to not use the function. There may be workarounds. If you really need this builtin function then file a bug report and tell us how you are trying to use the function.\",\n\n msg_activecode_file_not_found: \"File not found: '$1'\",\n msg_activecode_no_file_or_dir:\n \"[Errno 2] No such file or directory: '$1'\",\n msg_activecode_starting: \"Click the play button to begin the $1\",\n msg_activecode_playing: \"Playing the $1\",\n msg_activecode_loading_audio:\n \"Loading audio. Please wait. If the tour doesn't start soon click on the leftmost control button (Play first audio in tour)\",\n msg_activecode_pause_current_audio: \"Pause current audio\",\n msg_activecode_pause_audio: \"Pause audio\",\n msg_activecode_play_paused_audio: \"Play paused audio\",\n msg_activecode_audio_paused:\n \"The $1 has been paused. Click on the play button to resume the tour.\",\n msg_activecode_input_prg: \"Input for Program\",\n msg_activecode_were_compiling_err:\n \"There were errors compiling your code. See below.\",\n msg_activecode_compile_only:\n \"Code successfully compiled. No executable built.\",\n msg_activecode_time_limit_exc: \"Time Limit Exceeded on your program\",\n msg_activecode_server_err: \"A server error occurred\",\n msg_activecode_compiling_running:\n \"Compiling and Running your Code Now...\",\n msg_activecode_server_comm_err: \"Error communicating with the server.\",\n msg_activecode_save_run: \"Save & Run\",\n msg_activecode_run_button_title: \"Save & Run (ctrl-s)\",\n msg_activecode_render: \"Save & Render\",\n msg_activecode_assertion_error:\n \"An assertion error happens when python encounters an assertion statement. Python evaluates the expression to the right of the word assert; if that expression is True everything is fine and the program continues. If the expression is False Python raises an error and stops.\",\n msg_activecode_assertion_error_fix:\n \"Check the expression to the right of assert. The expression is False and you will need to determine why that is. You may want to simply print out the individual parts of the expression to understand why it is evaluating to False.\",\n msg_activecode_load_db: \"Loading DB...\",\n msg_activecode_code_coach: \"Code Coach\",\n msg_activecode_passed: \"Passed\",\n msg_activecode_failed: \"Failed\",\n msg_activecode_unit_test_results: \"Unit Test Results\",\n msg_activecode_test_run_error: \"Runtime error\",\n msg_activecode_test_compile_error: \"Compiler error\",\n msg_activecode_iotest_results: \"IO tests completed. See table for results.\",\n msg_activecode_assertions_checked: \"Assertions checked:\",\n },\n});\n","$.i18n().load({\n \"sr-Cyrl\": {\n msg_activecode_load_history: \"Учитај историју\",\n msg_activecode_audio_tour: \"Аудио тура\",\n msg_activecode_loaded_code: \"Ваш изворни код је учитан.\",\n msg_activecode_no_saved_code: \"Не постоји снимљен код.\",\n msg_activecode_run_code: \"Покрени програм\",\n msg_activecode_show_feedback: \"Прикажи резултат\",\n msg_activecode_show_code: \"Прикажи код\",\n msg_activecode_hide_code: \"Затвори код\",\n msg_activecode_show_codelens: \"Корак по корак\",\n msg_activecode_show_in_codelens: \"Корак по корак\",\n msg_activecode_hide_codelens: \"Затвори корак по корак\",\n msg_activecode_reformat: \"Реформат\",\n\n msg_sctivecode_parse_error:\n \"Синтаксна грешка (parse error) значи да Пајтон не разуме синтаксу у линији кога на коју порука о грешци указује. Типични примери овакве грешке су заборавлјена двотачка код 'if' или 'for' исказа или заборављена запета између аргумената код позива функције\",\n msg_sctivecode_parse_error_fix:\n \"Да бисте исправили синтаксну грешку треба пажњиво да погледате линију изворног кода на коју указује поруга о грешци и можда претходну линину изворног кода. Проверите да ли су поштована сва синтаксна правила Пајтона.\",\n },\n});\n","/**\n *\n * MD5 (Message-Digest Algorithm)\n * http://www.webtoolkit.info/\n *\n **/\n\nexport default function MD5(string) {\n function RotateLeft(lValue, iShiftBits) {\n return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));\n }\n\n function AddUnsigned(lX, lY) {\n var lX4, lY4, lX8, lY8, lResult;\n lX8 = lX & 0x80000000;\n lY8 = lY & 0x80000000;\n lX4 = lX & 0x40000000;\n lY4 = lY & 0x40000000;\n lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff);\n if (lX4 & lY4) {\n return lResult ^ 0x80000000 ^ lX8 ^ lY8;\n }\n if (lX4 | lY4) {\n if (lResult & 0x40000000) {\n return lResult ^ 0xc0000000 ^ lX8 ^ lY8;\n } else {\n return lResult ^ 0x40000000 ^ lX8 ^ lY8;\n }\n } else {\n return lResult ^ lX8 ^ lY8;\n }\n }\n\n function F(x, y, z) {\n return (x & y) | (~x & z);\n }\n\n function G(x, y, z) {\n return (x & z) | (y & ~z);\n }\n\n function H(x, y, z) {\n return x ^ y ^ z;\n }\n\n function I(x, y, z) {\n return y ^ (x | ~z);\n }\n\n function FF(a, b, c, d, x, s, ac) {\n a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));\n return AddUnsigned(RotateLeft(a, s), b);\n }\n\n function GG(a, b, c, d, x, s, ac) {\n a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));\n return AddUnsigned(RotateLeft(a, s), b);\n }\n\n function HH(a, b, c, d, x, s, ac) {\n a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));\n return AddUnsigned(RotateLeft(a, s), b);\n }\n\n function II(a, b, c, d, x, s, ac) {\n a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));\n return AddUnsigned(RotateLeft(a, s), b);\n }\n\n function ConvertToWordArray(string) {\n var lWordCount;\n var lMessageLength = string.length;\n var lNumberOfWords_temp1 = lMessageLength + 8;\n var lNumberOfWords_temp2 =\n (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;\n var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;\n var lWordArray = Array(lNumberOfWords - 1);\n var lBytePosition = 0;\n var lByteCount = 0;\n while (lByteCount < lMessageLength) {\n lWordCount = (lByteCount - (lByteCount % 4)) / 4;\n lBytePosition = (lByteCount % 4) * 8;\n lWordArray[lWordCount] =\n lWordArray[lWordCount] |\n (string.charCodeAt(lByteCount) << lBytePosition);\n lByteCount++;\n }\n lWordCount = (lByteCount - (lByteCount % 4)) / 4;\n lBytePosition = (lByteCount % 4) * 8;\n lWordArray[lWordCount] =\n lWordArray[lWordCount] | (0x80 << lBytePosition);\n lWordArray[lNumberOfWords - 2] = lMessageLength << 3;\n lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;\n return lWordArray;\n }\n\n function WordToHex(lValue) {\n var WordToHexValue = \"\",\n WordToHexValue_temp = \"\",\n lByte,\n lCount;\n for (lCount = 0; lCount <= 3; lCount++) {\n lByte = (lValue >>> (lCount * 8)) & 255;\n WordToHexValue_temp = \"0\" + lByte.toString(16);\n WordToHexValue =\n WordToHexValue +\n WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);\n }\n return WordToHexValue;\n }\n\n function Utf8Encode(string) {\n string = string.replace(/\\r\\n/g, \"\\n\");\n var utftext = \"\";\n\n for (var n = 0; n < string.length; n++) {\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utftext += String.fromCharCode(c);\n } else if (c > 127 && c < 2048) {\n utftext += String.fromCharCode((c >> 6) | 192);\n utftext += String.fromCharCode((c & 63) | 128);\n } else {\n utftext += String.fromCharCode((c >> 12) | 224);\n utftext += String.fromCharCode(((c >> 6) & 63) | 128);\n utftext += String.fromCharCode((c & 63) | 128);\n }\n }\n\n return utftext;\n }\n\n var x = Array();\n var k, AA, BB, CC, DD, a, b, c, d;\n var S11 = 7,\n S12 = 12,\n S13 = 17,\n S14 = 22;\n var S21 = 5,\n S22 = 9,\n S23 = 14,\n S24 = 20;\n var S31 = 4,\n S32 = 11,\n S33 = 16,\n S34 = 23;\n var S41 = 6,\n S42 = 10,\n S43 = 15,\n S44 = 21;\n\n string = Utf8Encode(string);\n\n x = ConvertToWordArray(string);\n\n a = 0x67452301;\n b = 0xefcdab89;\n c = 0x98badcfe;\n d = 0x10325476;\n\n for (k = 0; k < x.length; k += 16) {\n AA = a;\n BB = b;\n CC = c;\n DD = d;\n a = FF(a, b, c, d, x[k + 0], S11, 0xd76aa478);\n d = FF(d, a, b, c, x[k + 1], S12, 0xe8c7b756);\n c = FF(c, d, a, b, x[k + 2], S13, 0x242070db);\n b = FF(b, c, d, a, x[k + 3], S14, 0xc1bdceee);\n a = FF(a, b, c, d, x[k + 4], S11, 0xf57c0faf);\n d = FF(d, a, b, c, x[k + 5], S12, 0x4787c62a);\n c = FF(c, d, a, b, x[k + 6], S13, 0xa8304613);\n b = FF(b, c, d, a, x[k + 7], S14, 0xfd469501);\n a = FF(a, b, c, d, x[k + 8], S11, 0x698098d8);\n d = FF(d, a, b, c, x[k + 9], S12, 0x8b44f7af);\n c = FF(c, d, a, b, x[k + 10], S13, 0xffff5bb1);\n b = FF(b, c, d, a, x[k + 11], S14, 0x895cd7be);\n a = FF(a, b, c, d, x[k + 12], S11, 0x6b901122);\n d = FF(d, a, b, c, x[k + 13], S12, 0xfd987193);\n c = FF(c, d, a, b, x[k + 14], S13, 0xa679438e);\n b = FF(b, c, d, a, x[k + 15], S14, 0x49b40821);\n a = GG(a, b, c, d, x[k + 1], S21, 0xf61e2562);\n d = GG(d, a, b, c, x[k + 6], S22, 0xc040b340);\n c = GG(c, d, a, b, x[k + 11], S23, 0x265e5a51);\n b = GG(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa);\n a = GG(a, b, c, d, x[k + 5], S21, 0xd62f105d);\n d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);\n c = GG(c, d, a, b, x[k + 15], S23, 0xd8a1e681);\n b = GG(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8);\n a = GG(a, b, c, d, x[k + 9], S21, 0x21e1cde6);\n d = GG(d, a, b, c, x[k + 14], S22, 0xc33707d6);\n c = GG(c, d, a, b, x[k + 3], S23, 0xf4d50d87);\n b = GG(b, c, d, a, x[k + 8], S24, 0x455a14ed);\n a = GG(a, b, c, d, x[k + 13], S21, 0xa9e3e905);\n d = GG(d, a, b, c, x[k + 2], S22, 0xfcefa3f8);\n c = GG(c, d, a, b, x[k + 7], S23, 0x676f02d9);\n b = GG(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a);\n a = HH(a, b, c, d, x[k + 5], S31, 0xfffa3942);\n d = HH(d, a, b, c, x[k + 8], S32, 0x8771f681);\n c = HH(c, d, a, b, x[k + 11], S33, 0x6d9d6122);\n b = HH(b, c, d, a, x[k + 14], S34, 0xfde5380c);\n a = HH(a, b, c, d, x[k + 1], S31, 0xa4beea44);\n d = HH(d, a, b, c, x[k + 4], S32, 0x4bdecfa9);\n c = HH(c, d, a, b, x[k + 7], S33, 0xf6bb4b60);\n b = HH(b, c, d, a, x[k + 10], S34, 0xbebfbc70);\n a = HH(a, b, c, d, x[k + 13], S31, 0x289b7ec6);\n d = HH(d, a, b, c, x[k + 0], S32, 0xeaa127fa);\n c = HH(c, d, a, b, x[k + 3], S33, 0xd4ef3085);\n b = HH(b, c, d, a, x[k + 6], S34, 0x4881d05);\n a = HH(a, b, c, d, x[k + 9], S31, 0xd9d4d039);\n d = HH(d, a, b, c, x[k + 12], S32, 0xe6db99e5);\n c = HH(c, d, a, b, x[k + 15], S33, 0x1fa27cf8);\n b = HH(b, c, d, a, x[k + 2], S34, 0xc4ac5665);\n a = II(a, b, c, d, x[k + 0], S41, 0xf4292244);\n d = II(d, a, b, c, x[k + 7], S42, 0x432aff97);\n c = II(c, d, a, b, x[k + 14], S43, 0xab9423a7);\n b = II(b, c, d, a, x[k + 5], S44, 0xfc93a039);\n a = II(a, b, c, d, x[k + 12], S41, 0x655b59c3);\n d = II(d, a, b, c, x[k + 3], S42, 0x8f0ccc92);\n c = II(c, d, a, b, x[k + 10], S43, 0xffeff47d);\n b = II(b, c, d, a, x[k + 1], S44, 0x85845dd1);\n a = II(a, b, c, d, x[k + 8], S41, 0x6fa87e4f);\n d = II(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0);\n c = II(c, d, a, b, x[k + 6], S43, 0xa3014314);\n b = II(b, c, d, a, x[k + 13], S44, 0x4e0811a1);\n a = II(a, b, c, d, x[k + 4], S41, 0xf7537e82);\n d = II(d, a, b, c, x[k + 11], S42, 0xbd3af235);\n c = II(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb);\n b = II(b, c, d, a, x[k + 9], S44, 0xeb86d391);\n a = AddUnsigned(a, AA);\n b = AddUnsigned(b, BB);\n c = AddUnsigned(c, CC);\n d = AddUnsigned(d, DD);\n }\n\n var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);\n\n return temp.toLowerCase();\n}\n","import { ActiveCode } from \"./activecode.js\";\nimport MD5 from \"./md5.js\";\nimport JUnitTestParser from \"./extractUnitResults-JUnit.js\";\nimport DoctestTestParser from \"./extractUnitResults-Doctest.js\";\nimport \"../../codelens/js/pytutor-embed.bundle.js\";\nimport { base64encode } from \"byte-base64\";\n\nexport default class LiveCode extends ActiveCode {\n constructor(opts) {\n var orig = $(opts.orig).find(\"textarea\")[0];\n super(opts);\n this.stdin = $(orig).data(\"stdin\");\n this.additional_files = $(orig).data(\"add-files\");\n // Accept older \"datafile\" attribute for backwards compatibility\n this.datafiles = $(orig).data(\"datafile\");\n this.sourcefile = $(orig).data(\"sourcefile\");\n this.compileargs = unescapeHtml($(orig).data(\"compileargs\")) || \"\";\n this.compileAlso = unescapeHtml($(orig).data(\"compile-also\"));\n this.linkargs = unescapeHtml($(orig).data(\"linkargs\"));\n this.runargs = unescapeHtml($(orig).data(\"runargs\"));\n this.interpreterargs = unescapeHtml($(orig).data(\"interpreterargs\"));\n this.API_KEY = \"67033pV7eUUvqo07OJDIV8UZ049aLEK1\";\n this.USE_API_KEY = true;\n this.JOBE_SERVER = eBookConfig.jobehost || eBookConfig.host;\n this.resource = eBookConfig.proxyuri_runs || \"/ns/rsproxy/jobeRun\";\n this.jobePutFiles =\n eBookConfig.proxyuri_files || \"/ns/rsproxy/jobePushFile/\";\n this.jobeCheckFiles =\n eBookConfig.proxyuri_files || \"/ns/rsproxy/jobeCheckFile/\";\n // TODO: should add a proper put/check in pavement.tmpl as this is misleading and will break on runestone\n this.div2id = {};\n if (typeof this.stdin !== \"undefined\") {\n this.createInputElement();\n }\n this.createErrorOutput();\n }\n outputfun(a) { }\n createInputElement() {\n let inputContainer = document.createElement(\"div\");\n var label = document.createElement(\"label\");\n label.for = this.divid + \"_stdin\";\n $(label).text($.i18n(\"msg_activecode_input_prg\"));\n var input = document.createElement(\"textarea\");\n input.id = this.divid + \"_stdin\";\n input.classList.add(\"activecode__stdin\");\n input.value = this.stdin;\n input.setAttribute(\"rows\", \"3\");\n this.outerDiv.appendChild(inputContainer);\n inputContainer.appendChild(label);\n inputContainer.appendChild(input);\n this.stdin_el = input;\n }\n createErrorOutput() { }\n\n\n getCombinedSuffixes() {\n if (this.suffix && this.visibleSuffix)\n return this.suffix + this.visibleSuffix;\n else if (this.suffix)\n return this.suffix;\n else if (this.visibleSuffix)\n return this.visibleSuffix;\n return \"\";\n }\n\n hasUnitTests() {\n let combinedSuffix = this.getCombinedSuffixes();\n\n // import used to detect java unit tests is historically assumed to always be in suffix\n if (this.language === \"java\")\n return combinedSuffix.indexOf(\"import org.junit\") > -1;\n\n // cpp unit test include may be in suffix or hidden prefix code\n if (this.language === \"cpp\")\n return combinedSuffix.indexOf(\"doctest.h\") > -1 || (this.prefix && this.prefix.indexOf(\"doctest.h\") > -1);\n\n return false;\n }\n\n /* Main runProg method for livecode\n *\n */\n async runProg(noUI, logResults) {\n if (typeof logResults === \"undefined\") {\n this.logResults = true;\n } else {\n this.logResults = logResults;\n }\n if (typeof noUI !== \"boolean\") {\n noUI = false;\n }\n await this.runSetup();\n try {\n // Either have one run or are doing a series of io tests\n if (!this.iotests) {\n let res = await this.submitToJobe();\n if (!res.ok) {\n this.addJobeErrorMessage(\n $.i18n(`Server Error: ${res.statusText}`)\n );\n $(this.runButton).removeAttr(\"disabled\");\n return \"fail\";\n }\n let runResults = await res.json();\n this.processJobeResponse(runResults);\n } else {\n if(this.hasUnitTests()) {\n console.log(`IO tests are not supported with unit tests. They will be ignored in ${this.divid}`);\n } else {\n let ioResults = [];\n for(let iotest of this.iotests) {\n let spec = JSON.parse(this.json_runspec);\n spec.run_spec.input = iotest.input;\n this.json_runspec = JSON.stringify(spec);\n let iores = await this.submitToJobe();\n if (!iores.ok) {\n this.addJobeErrorMessage(\n $.i18n(`Server Error: ${iores.statusText}`)\n );\n $(this.runButton).removeAttr(\"disabled\");\n return \"fail\";\n }\n let result = await iores.json();\n result.test = iotest;\n ioResults.push(result);\n }\n this.processJobeIOResponses(ioResults);\n }\n }\n } catch (e) {\n this.addJobeErrorMessage(\n $.i18n(\"msg_activecode_server_comm_err\") + e.toString()\n );\n $(this.runButton).removeAttr(\"disabled\");\n return `fail: ${e}`;\n }\n return \"success\";\n }\n /**\n * Note:\n * In order to check for supplemental files in java and deal with asynchronicity\n * I split the original runProg into two functions: runProg and runProg_callback\n */\n async runSetup() {\n var stdin;\n var source;\n var saveCode = \"True\";\n var sfilemap = {\n java: \"\",\n cpp: \"test.cpp\",\n c: \"test.c\",\n python3: \"test.py\",\n python2: \"test.py\",\n octave: \"octatest.m\",\n };\n var sourcefilename = \"\";\n var testdrivername = \"\";\n var file_checkp;\n\n // extract the class names so files can be named properly\n if (this.suffix && this.language == \"java\") {\n // the suffix contains unit test code and should include and import of junit\n // import static org.junit.Assert.*;\n // import org.junit.*;\n // import java.io.*;\n if (this.suffix.indexOf(\"import org.junit\") < 0) {\n console.log(`Missing imports in unit tests:\n ${this.suffix}`);\n // alert(\"The unit tests for this problem are incomplete, Please report this.\");\n this.suffix =\n `\n import static org.junit.Assert.*;\n import org.junit.*;\n import java.io.*;\n ` + this.suffix;\n }\n let classMatch = new RegExp(/public\\s+class\\s+(\\w+)/);\n source = await this.buildProg(false);\n let m = source.match(classMatch);\n if (m) {\n sourcefilename = m[1] + \".java\";\n } else {\n alert(\n \"Error: Could not find the class name in the source, this will not compile.\"\n );\n throw new Error(\"No class name in source\");\n }\n // this will be unit test code\n m = this.suffix.match(classMatch);\n if (m) {\n testdrivername = m[1] + \".java\";\n }\n } else {\n source = await this.buildProg(true);\n }\n // Validate the data is convertible to Base64. If not then error out now\n try {\n btoa(source);\n } catch (e) {\n alert(\n \"Error: Bad Characters in the activecode window. Likely a quote character that has been copy/pasted. 🙁\"\n );\n return;\n }\n\n this.saveCode = await this.manage_scrubber(saveCode);\n\n // assemble parameters for JOBE\n var paramlist = [\n \"compileargs\",\n \"linkargs\",\n \"runargs\",\n \"interpreterargs\",\n \"memorylimit\",\n ];\n var paramobj = {};\n for (let param of paramlist) {\n if (this[param]) {\n paramobj[param] = eval(this[param]); // needs a list\n }\n }\n if (this.language === \"octave\") {\n paramobj.memorylimit = 200000;\n }\n if (this.compileargs && this.compileargs.toString().indexOf(\"fsanitize\") > -1) {\n //fsanitize requires an allocation of a giant block of memory\n paramobj.memorylimit = 2000000000;\n }\n if (this.timelimit) {\n // convert to seconds to match JOBE - decimal is OK\n let timelimitSeconds = this.timelimit / 1000;\n paramobj.cputime = timelimitSeconds;\n }\n\n if (this.stdin) {\n stdin = $(this.stdin_el).val();\n }\n if (!this.sourcefile) {\n this.sourcefile = sfilemap[this.language];\n }\n\n $(this.output).html($.i18n(\"msg_activecode_compiling_running\"));\n\n // Need to handle additional files\n // that come from additional_files (based on ids) and datafiles (based on filenames)\n // merge into one collection of objects we can iterate over. Tag datafiles as \"datafile\"\n let allFilesRaw = [];\n if (this.datafiles != undefined) {\n let datafiles = this.datafiles.split(\",\");\n for (let d of datafiles) {\n let datafileFileName = d.trim();\n allFilesRaw.push({filename:datafileFileName, type: \"datafile\"});\n }\n }\n if (this.additional_files != undefined) {\n let additionalFiles = this.additional_files.split(\",\");\n for (let f of additionalFiles) {\n let addFileId = f.trim();\n allFilesRaw.push({acid:addFileId});\n }\n }\n\n // Now build up actual file collection\n var files = [];\n for (let f of allFilesRaw) {\n // Need to determine content and filename for each datafile\n let fileName, content;\n // Check on page to see if we have the datafile.\n // Datafiles are looked up via data-filename attribute while additional_files are looked up via id\n let fileElement;\n if (f.type === \"datafile\") {\n fileElement = document.querySelector(`[data-filename=\"${f.filename}\"]`);\n // But RST markup uses filename as id\n if (!fileElement)\n fileElement = document.getElementById(f.filename);\n }\n else {\n fileElement = document.getElementById(f.acid);\n }\n\n if (fileElement) {\n // if the element is a code mirror, get the value from the editor\n if (window.componentMap && window.componentMap.hasOwnProperty(fileElement.id)) {\n let editor = window.componentMap[fileElement.id].editor;\n content = editor.getValue();\n } else {\n // if file element is editable textarea, file.value is defined and has the current contents\n // otherwise rely on static contents\n if(fileElement.value)\n content = fileElement.value;\n else\n content = fileElement.textContent;\n }\n // Note - content may be undefined at this point if file is an image\n // If the file came from an item with a data-filename attribute, use that as the filename\n // otherwise this must be an RST item with filename as the id\n fileName = fileElement.dataset.filename || f.filename;\n } else {\n // check to see if file is in db\n let result = null;\n let studentCode = null;\n let url;\n // Again, datafiles traditionally are looked up via filename, additional_files are looked up via acid\n if (f.type === \"datafile\") {\n url = `/ns/logger/get_source_code?course_id=${eBookConfig.course}&filename=${f.filename}`;\n } else {\n url = `/ns/logger/get_source_code?course_id=${eBookConfig.course}&acid=${f.acid}`;\n // if looking up additional file, also check to see if there is a student submission\n // if so, we will want to use their code. Still need to hit source_code table for filename.\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/get_latest_code?acid=${f.acid}`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n }\n );\n try {\n let response = await fetch(request);\n let data = await response.json();\n data = data.detail;\n if (data && data.code) {\n studentCode = data.code;\n }\n } catch (e) {\n console.log(\"Error getting student code: \" + e);\n // do nothing, we will just use the original code\n }\n }\n // Now make request for source_code\n $.ajax({\n async: false,\n url: url,\n success: function (data) {\n result = data.detail;\n }\n });\n if (result) {\n // favor student code if it exists\n content = studentCode || result.file_contents;\n fileName = result.filename;\n }\n }\n\n if (fileName) {\n let fileExtension = fileName.substring(\n fileName.lastIndexOf(\".\") + 1\n );\n if (fileExtension === \"jar\") {\n files = files.concat(this.parseJavaClasses(content));\n } else if ([\"jpg\", \"png\", \"gif\"].indexOf(fileExtension) > -1) {\n let base64;\n if (fileElement) {\n if (fileElement.toDataURL) {\n base64 = fileElement.toDataURL(\"image/\" + fileExtension);\n base64 = base64.substring(base64.indexOf(\",\") + 1);\n } else {\n base64 = fileElement.src.substring(\n fileElement.src.indexOf(\",\") + 1\n );\n }\n } else {\n base64 = content;\n }\n files.push({ name: fileName, content: base64 });\n } else {\n // if no className or un recognized className it is treated as an individual file\n // this could be any type of file, .txt, .java, .csv, etc\n files.push({ name: fileName, content: content });\n }\n } else {\n // if we don't have a file name, then we don't have a file\n $.i18n(\"msg_activecode_no_file_or_dir\")\n }\n }\n // If we are running unit tests we need to substitute the test driver for the student\n // code and send the student code as a file. We'll do that here.\n this.junitDriverCode = `\n import org.junit.runner.JUnitCore;\n import org.junit.runner.Result;\n import org.junit.runner.notification.Failure;\n\n public class TestRunner {\n public static void main(String[] args) {\n CodeTestHelper.resetFinalResults();\n Result result = JUnitCore.runClasses(${testdrivername.replace(\n \".java\",\n \".class\"\n )});\n System.out.println(CodeTestHelper.getFinalResults());\n\n int total = result.getRunCount();\n int fails = result.getFailureCount();\n int corr = total - fails;\n System.out.println(\"You got \" + corr + \" out of \" + total + \" correct. \" + String.format(\"%.2f\", (100.0 * corr / total)) + \"%\");\n }\n }\n `;\n if (this.suffix && this.language == \"java\") {\n files.push({ name: sourcefilename, content: source });\n files.push({ name: testdrivername, content: this.suffix });\n source = this.junitDriverCode;\n if (paramobj.compileargs) {\n paramobj.compileargs.push(sourcefilename);\n } else {\n paramobj.compileargs = [sourcefilename];\n }\n }\n if (this.compileAlso) {\n // a comma separated list of files that also need to be compiled\n // they also all should be part of additional_files\n // we will stick them onto the end of the compilerargs\n // so that jobe builds them into the string sent to the compiler\n // e.g. g++ [other_compile_args] [compileAlso] sourcefile -o executable\n paramobj.compileargs = paramobj.compileargs || [];\n let compileList = this.compileAlso.split(\",\");\n paramobj.compileargs = paramobj.compileargs.concat(compileList);\n }\n let runspec = {\n language_id: this.language,\n sourcecode: source,\n parameters: paramobj,\n sourcefilename: this.sourcefile,\n };\n\n if (stdin) {\n runspec.input = stdin;\n }\n if (files.length === 0) {\n this.json_runspec = JSON.stringify({ run_spec: runspec });\n file_checkp = Promise.resolve(\"ready\");\n } else {\n runspec[\"file_list\"] = [];\n var promises = [];\n var instance = this;\n\n for (let i = 0; i < files.length; i++) {\n var fileName = files[i].name;\n var fileContent = files[i].content;\n instance.div2id[fileName] =\n \"runestone\" + MD5(fileName + fileContent);\n runspec[\"file_list\"].push([\n instance.div2id[fileName],\n fileName,\n ]);\n promises.push(\n new Promise((resolve, reject) => {\n instance.checkFile(files[i], resolve, reject);\n })\n );\n }\n this.json_runspec = JSON.stringify({ run_spec: runspec });\n this.div2id = instance.div2id;\n file_checkp = Promise.all(promises).catch(function (err) {\n console.log(\"Error: \" + err);\n });\n }\n return file_checkp;\n }\n\n /* Submit the assembled job to the JOBE server and await the results.\n *\n */\n async submitToJobe() {\n var data = this.json_runspec;\n let host = this.JOBE_SERVER + this.resource;\n $(this.runButton).attr(\"disabled\", \"disabled\");\n $(this.outDiv).show({ duration: 700, queue: false });\n $(this.errDiv).remove();\n $(this.output).css(\"visibility\", \"visible\");\n\n let headers = new Headers({\n \"Content-type\": \"application/json; charset=utf-8\",\n Accept: \"application/json\",\n \"X-API-KEY\": this.API_KEY,\n });\n let request = new Request(host, {\n method: \"POST\",\n headers: headers,\n body: data,\n });\n return fetch(request);\n\n ///$(\"#\" + divid + \"_errinfo\").remove();\n }\n\n // Handle the results of a single program run (including formal unit tests)\n processJobeResponse(result) {\n var logresult;\n var odiv = this.output;\n this.parsedOutput = {};\n $(this.runButton).removeAttr(\"disabled\");\n if (result.outcome === 15) {\n logresult = \"success\";\n } else {\n logresult = result.outcome;\n }\n this.errinfo = logresult;\n switch (result.outcome) {\n case 15: {\n if (this.language === \"java\") {\n this.parsedOutput = new JUnitTestParser(\n result.stdout,\n this.divid\n );\n $(odiv).html(this.parsedOutput.stdout);\n } else if (this.language === \"cpp\" && result.stdout.includes(\"[doctest]\")) {\n this.parsedOutput = new DoctestTestParser(\n result.stdout,\n this.divid\n );\n $(odiv).html(this.parsedOutput.stdout);\n } else {\n let output = result.stdout ? result.stdout : \"\";\n $(odiv).html(output);\n }\n if (this.hasUnitTests() || this.iotests) {\n if (this.parsedOutput.pct === undefined) {\n this.parsedOutput.pct =\n this.parsedOutput.passed =\n this.parsedOutput.failed =\n 0;\n }\n this.unit_results = `percent:${this.parsedOutput.pct}:passed:${this.parsedOutput.passed}:failed:${this.parsedOutput.failed}`;\n }\n break;\n }\n case 11: // compiler error\n $(odiv).html($.i18n(\"msg_activecode_were_compiling_err\"));\n this.addJobeErrorMessage(result.cmpinfo);\n this.errinfo = result.cmpinfo;\n break;\n case 12: // run time error\n // special case for compile-only request when using c/cpp\n if(\n (this.language === \"cpp\" || this.language === \"c\")\n && result.stderr.includes(\"Permission denied\")\n && this.compileargs && this.compileargs.includes(\"-c\")\n ) {\n $(odiv).html($.i18n(\"msg_activecode_compile_only\"));\n } else {\n // any other case is real run time error\n $(odiv).html(result.stdout.replace(/\\n/g, \"
    \"));\n if (result.stderr) {\n this.addJobeErrorMessage(result.stderr);\n }\n }\n break;\n case 13: // time limit\n $(odiv).html(escapeHtml(result.stdout).replace(/\\n/g, \"
    \"));\n this.addJobeErrorMessage(\n $.i18n(\"msg_activecode_time_limit_exc\")\n );\n break;\n default:\n if (result.stderr) {\n $(odiv).html(result.stderr.replace(/\\n/g, \"
    \"));\n } else {\n this.addJobeErrorMessage(\n $.i18n(\"msg_activecode_server_err\")\n );\n }\n }\n // todo: handle server busy errors too\n }\n\n // Handle the results of a seriest of program runs from IO tests\n processJobeIOResponses(resultList) {\n //process a series of IO test results into one unittest-like result\n\n $(this.output).html($.i18n(\"msg_activecode_iotest_results\"));\n $(this.runButton).removeAttr(\"disabled\");\n const odiv = this.output;\n this.parsedOutput = {};\n\n // Make a pretty results table\n const parent = document.createElement(\"div\");\n const heading = document.createElement(\"div\");\n heading.classList.add(\"unittest-results__heading\");\n heading.innerHTML = $.i18n(\"msg_activecode_unit_test_results\");\n parent.appendChild(heading);\n parent.classList.add(\"unittest-results\");\n const tbl = document.createElement(\"table\");\n tbl.classList.add(\"ac-feedback\");\n parent.appendChild(tbl);\n parent.setAttribute(\"id\", `${this.divid}_unit_results`);\n const trh = document.createElement(\"tr\");\n trh.innerHTML =\n 'Input:Expected Output:Your Output:Result:';\n tbl.appendChild(trh);\n this.parsedOutput.table = parent;\n\n // Process each IO test result\n let passedTests = 0;\n // we will stop on the first error\n this.errinfo = null;\n // trim any trailing whitespace so invisible extra newline doesn't fail test\n // then trim trailing whitespace on each remaining line\n const trimLines = (s) => s.trimEnd().split(\"\\n\").map( s => s.trimEnd()).join(\"\\n\")\n for (let result of resultList) {\n const produced = trimLines(result.stdout);\n const desired = trimLines(result.test.out);\n const tr = document.createElement(\"tr\");\n const td1 = document.createElement(\"td\");\n td1.classList.add(\"ac-feedback\");\n td1.innerHTML = `
    ${result.test.input}\\n\\n
    `;\n tr.appendChild(td1);\n const td2 = document.createElement(\"td\");\n td2.classList.add(\"ac-feedback\");\n td2.innerHTML = `
    ${desired}
    `;\n tr.appendChild(td2);\n const td3 = document.createElement(\"td\");\n td3.classList.add(\"ac-feedback\");\n //
     doesn't prevent browser from gulping leading space\n            // so produce a version that transforms whitespace into html entities/tags\n            let producedRenderOutput = produced.replaceAll(\" \", \" \").replaceAll(\"\\n\", \"
    \");\n td3.innerHTML = `
    ${producedRenderOutput}
    `;\n tr.appendChild(td3);\n const td4 = document.createElement(\"td\");\n td4.classList.add(\"ac-feedback\");\n tr.appendChild(td4);\n tbl.appendChild(tr);\n switch (result.outcome) {\n case 15:\n if(produced === desired) {\n passedTests++;\n td4.innerHTML = $.i18n(\"msg_activecode_passed\");\n td4.classList.add(\"ac-feedback-pass\");\n } else {\n td4.innerHTML = $.i18n(\"msg_activecode_failed\");\n td4.classList.add(\"ac-feedback-fail\");\n }\n break;\n case 11: // compiler error\n $(odiv).html(result.cmpinfo.replace(/\\n/g, \"
    \"));\n td4.innerHTML = $.i18n(\"msg_activecode_test_compile_error\");\n td4.classList.add(\"ac-feedback-fail\");\n this.errinfo = result.cmpinfo;\n break;\n case 12: // run time error\n $(odiv).html(result.stderr.replace(/\\n/g, \"
    \"));\n td4.innerHTML = $.i18n(\"msg_activecode_test_run_error\");\n td4.classList.add(\"ac-feedback-fail\");\n this.errinfo = result.stderr;\n break;\n case 13: // time limit\n $(odiv).html(escapeHtml(result.stdout).replace(/\\n/g, \"
    \"));\n td4.innerHTML = $.i18n(\"msg_activecode_time_limit_exc\");\n td4.classList.add(\"ac-feedback-fail\");\n this.errinfo = 'time exceeded ' + result.stdout;\n break;\n default:\n if (result.stderr) {\n $(odiv).html(result.stderr.replace(/\\n/g, \"
    \"));\n }\n td4.innerHTML = $.i18n(\"msg_activecode_server_err\");\n td4.classList.add(\"ac-feedback-fail\");\n this.errinfo = result.stderr;\n }\n if (this.errinfo) {\n break;\n }\n }\n\n const pct = (passedTests / resultList.length) * 100;\n this.unit_results = `percent:${pct}:passed:${passedTests}:failed:${resultList.length - passedTests}`;\n const pctString = document.createElement(\"div\");\n pctString.classList.add(\"unittest-results__percent\");\n pctString.innerHTML = `${Math.round(pct)}% ` + $.i18n(\"msg_activecode_passed\");\n this.parsedOutput.pctString = pctString;\n\n if (!this.errinfo) {\n this.errinfo = \"success\";\n }\n }\n\n renderFeedback() {\n let rdiv = document.getElementById(`${this.divid}_unit_results`);\n if (rdiv) {\n rdiv.remove();\n }\n if (this.parsedOutput && this.parsedOutput.table) {\n this.outDiv.parentNode.appendChild(this.parsedOutput.table);\n }\n rdiv = document.getElementById(`${this.divid}_unit_results`);\n if (rdiv) {\n rdiv.appendChild(this.parsedOutput.pctString);\n }\n }\n\n addJobeErrorMessage(err) {\n if (this.errDiv) {\n this.errDiv.remove();\n }\n var errHead = $(\"

    \").html(\"Error\");\n var eContainer = this.outerDiv.appendChild(\n document.createElement(\"div\")\n );\n this.errDiv = eContainer;\n eContainer.setAttribute(\"aria-live\", \"polite\");\n eContainer.setAttribute(\"aria-atomic\", \"true\");\n eContainer.setAttribute(\"role\", \"log\");\n eContainer.className = \"error alert alert-danger\";\n eContainer.id = this.divid + \"_errinfo\";\n eContainer.appendChild(errHead[0]);\n var errText = eContainer.appendChild(document.createElement(\"pre\"));\n // screenreaders seem to miss error message without the delay\n setTimeout(() => {\n errText.innerHTML = escapeHtml(err);\n }, 10);\n }\n /**\n * Checks to see if file is on server\n * Places it on server if it is not on server\n * @param {object{name, contents}} file File to place on server\n * @param {function} resolve promise resolve function\n * @param {function} reject promise reject function\n */\n checkFile(file, resolve, reject) {\n var file_id = this.div2id[file.name];\n var resource = this.jobeCheckFiles + file_id;\n var host = this.JOBE_SERVER + resource;\n var xhr = new XMLHttpRequest();\n xhr.open(\"HEAD\", host, true);\n xhr.setRequestHeader(\"Content-type\", \"application/json\");\n xhr.setRequestHeader(\"Accept\", \"text/plain\");\n xhr.setRequestHeader(\"X-API-KEY\", this.API_KEY);\n xhr.onerror = function () {\n // console.log(\"error sending file\" + xhr.responseText);\n };\n xhr.onload = function () {\n switch (xhr.status) {\n case 208:\n case 404:\n // console.log(\"File not on Server\");\n this.pushDataFile(file, resolve, reject);\n break;\n case 400:\n // console.log(\"Bad Request\");\n reject();\n break;\n case 204:\n // console.log(\"File already on Server\");\n resolve();\n break;\n default:\n //console.log(\"This case should never happen\");\n reject();\n }\n }.bind(this);\n xhr.send();\n }\n /**\n * Places a file on a server\n */\n pushDataFile(file, resolve, reject) {\n var fileName = file.name;\n var extension = fileName.substring(fileName.indexOf(\".\") + 1);\n var file_id = this.div2id[fileName];\n var contents = file.content;\n // File types being uploaded that come in already in base64 format\n var extensions = [\"jar\", \"zip\", \"png\", \"jpg\", \"jpeg\"];\n var contentsb64;\n if (extensions.indexOf(extension) === -1) {\n contentsb64 = base64encode(contents);\n } else {\n contentsb64 = contents;\n }\n var data = JSON.stringify({ file_contents: contentsb64 });\n var resource = this.jobePutFiles + file_id;\n var host = this.JOBE_SERVER + resource;\n var xhr = new XMLHttpRequest();\n xhr.open(\"PUT\", host, true);\n xhr.setRequestHeader(\"Content-type\", \"application/json\");\n xhr.setRequestHeader(\"Accept\", \"text/plain\");\n xhr.setRequestHeader(\"X-API-KEY\", this.API_KEY);\n xhr.onload = function () {\n switch (xhr.status) {\n case 403:\n // console.log(\"Forbidden\");\n reject();\n break;\n case 400:\n // console.log(\"Bad Request\");\n reject();\n break;\n case 204:\n //console.log(\"successfully sent file \" + xhr.responseText);\n //console.log(\"File \" + fileName +\", \" + file_id +\" placed on server\");\n resolve();\n break;\n default:\n // console.log(\"This case should never happen\");\n reject();\n }\n }.bind(this);\n xhr.onerror = function () {\n // console.log(\"error sending file\" + xhr.responseText);\n reject();\n };\n xhr.send(data);\n }\n\n async showCodelens() {\n let clMess = \"\";\n if (this.codelens.style.display == \"none\") {\n this.codelens.style.display = \"block\";\n clMess = \"Building your visualization\";\n this.codelens.innerHTML = clMess;\n this.clButton.innerText = $.i18n(\"msg_activecode_hide_codelens\");\n } else {\n this.codelens.style.display = \"none\";\n this.clButton.innerText = $.i18n(\"msg_activecode_show_in_codelens\");\n return;\n }\n var cl = this.codelens.firstChild;\n if (cl) {\n this.codelens.removeChild(cl);\n this.codelens.innerHTML = clMess;\n }\n var code = await this.buildProg(false);\n if (code.match(/System.exit/)) {\n alert(\n \"Sorry... System.exit breaks the visualizer temporarily removing\"\n );\n code = code.replace(/System.exit\\(\\d+\\);/, \"\");\n }\n var myVars = {};\n myVars.code = code;\n myVars.lang = this.language;\n if (this.stdin) {\n myVars.stdin = $(this.stdin_el).val();\n }\n var targetDiv = this.codelens.id;\n\n let request = new Request(\"/ns/rsproxy/pytutor_trace\", {\n method: \"POST\",\n body: JSON.stringify(myVars),\n headers: this.jsonHeaders,\n });\n try {\n let response = await fetch(request);\n let data = await response.json();\n let vis = addVisualizerToPage(data, targetDiv, {\n startingInstruction: 0,\n editCodeBaseURL: null,\n hideCode: false,\n lang: myVars.lang,\n });\n } catch (error) {\n let targetDivError = document.getElementById(targetDiv);\n targetDivError.innerHTML =\n \"Sorry, an error occurred while creating your visualization.\";\n console.log(\"Get Trace Failed -- \");\n console.log(error);\n }\n\n this.logBookEvent({\n event: \"codelens\",\n act: \"view\",\n div_id: this.divid,\n });\n }\n\n /**\n * Seperates text into multiple .java files\n * @param {String} text String with muliple java classes needed to be seperated\n * @return {array of objects} .name gives the name of the java file with .java extension\n * .content gives the contents of the file\n */\n parseJavaClasses(text) {\n text = text.trim();\n var found = false;\n var stack = 0;\n var startIndex = 0;\n var classes = [];\n var importIndex = 0;\n var endOfLastCommentBeforeClassBegins = 0;\n for (var i = 0; i < text.length; i++) {\n var char = text.charAt(i);\n if (char === \"/\") {\n i++;\n if (text.charAt(i) === \"/\") {\n i++;\n while (text.charAt(i) !== \"\\n\" && i < text.length) {\n i++;\n }\n if (!found) {\n endOfLastCommentBeforeClassBegins = i;\n }\n } else if (text.charAt(i) == \"*\") {\n i++;\n while (\n (text.charAt(i) !== \"*\" ||\n text.charAt(i + 1) !== \"/\") &&\n i + 1 < text.length\n ) {\n i++;\n }\n if (!found) {\n endOfLastCommentBeforeClassBegins = i;\n }\n }\n } else if (char === '\"') {\n i++;\n while (text.charAt(i) !== '\"' && i < text.length) {\n i++;\n }\n } else if (char === \"'\") {\n while (text.charAt(i) !== \"'\" && i < text.length) {\n i++;\n }\n } else if (char === \"(\") {\n var pCount = 1;\n i++;\n while (pCount > 0 && i < text.length) {\n if (text.charAt(i) === \"(\") {\n pCount++;\n } else if (text.charAt(i) === \")\") {\n pCount--;\n }\n i++;\n }\n }\n if (!found && text.charAt(i) === \"{\") {\n startIndex = i;\n found = true;\n stack = 1;\n } else if (found) {\n if (text.charAt(i) === \"{\") {\n stack++;\n }\n if (text.charAt(i) === \"}\") {\n stack--;\n }\n }\n if (found && stack === 0) {\n let endIndex = i + 1;\n var words = text\n .substring(endOfLastCommentBeforeClassBegins, startIndex)\n .trim()\n .split(\" \");\n var className = \"\";\n for (var w = 0; w < words.length; w++) {\n className = words[w];\n if (words[w] === \"extends\" || words[w] === \"implements\") {\n className = words[w - 1];\n w = words.length;\n }\n }\n className = className.trim() + \".java\";\n classes.push({\n name: className,\n content: text.substring(importIndex, endIndex),\n });\n found = false;\n importIndex = endIndex;\n endOfLastCommentBeforeClassBegins = endIndex;\n }\n }\n return classes;\n }\n}\n\n// Warning - returns undefined if safe is an empty string\n// existing usages in constructor appear to rely on that behavior\nfunction unescapeHtml(safe) {\n if (safe) {\n return safe\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n }\n}\n\n// Designed to produce HTML from a string, so always return a string\nfunction escapeHtml(str) {\n if (str) {\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/'/g, ''')\n .replace(/\"/g, '"');\n }\n return '';\n}\n"],"names":["Sk","builtinFiles","JSActiveCode","constructor","opts","super","outputfun","a","$","this","output","css","str","length","i","j","JSON","stringify","e","runProg","_this","prog","buildProg","saveCode","write","innerHTML","writeln","manage_scrubber","eContainer","remove","text","outDiv","show","duration","queue","eval","errinfo","addErrorMessage","err","errLastRun","errHead","html","outerDiv","appendChild","document","createElement","setAttribute","className","id","divid","errText","errString","toString","setTimeout","console","log","DoctestTestParser","parentId","sep","pre","testDetails","report","parts","split","cleanedOutput","programOutLines","slice","line","trim","testOutputLines","reportLines","stdout","patt","RegExp","matches","matchAll","match","pct","groups","passed","tests","pctString","replace","parseInt","failed","parent","classList","add","tbl","trh","i18n","tr","td","table","load","msg_activecode_load_history","msg_activecode_audio_tour","msg_activecode_loaded_code","msg_activecode_no_saved_code","msg_activecode_run_code","msg_activecode_show_feedback","msg_activecode_show_code","msg_activecode_hide_code","msg_activecode_show_codelens","msg_activecode_show_in_codelens","msg_activecode_hide_codelens","msg_activecode_reformat","msg_activecode_parse_error","msg_activecode_parse_error_fix","msg_activecode_type_error","msg_activecode_type_error_fix","msg_activecode_name_error","msg_activecode_name_error_fix","msg_activecode_value_error","msg_activecode_value_error_fix","msg_activecode_attribute_error","msg_activecode_attribute_error_fix","msg_activecode_token_error","msg_activecode_token_error_fix","msg_activecode_time_limit_error","msg_activecode_time_limit_error_fix","msg_activecode_general_error","msg_activecode_general_error_fix","msg_activecode_syntax_error","msg_activecode_syntax_error_fix","msg_activecode_key_error","msg_activecode_key_error_fix","msg_activecode_index_error","msg_activecode_index_error_fix","msg_activecode_uri_error","msg_activecode_uri_error_fix","msg_activecode_import_error","msg_activecode_import_error_fix","msg_activecode_reference_error","msg_activecode_reference_error_fix","msg_activecode_zero_division_error","msg_activecode_zero_division_error_fix","msg_activecode_range_error","msg_activecode_range_error_fix","msg_activecode_internal_error","msg_activecode_internal_error_fix","msg_activecode_indentation_error","msg_activecode_indentation_error_fix","msg_activecode_not_implemented_error","msg_activecode_not_implemented_error_fix","msg_activecode_file_not_found","msg_activecode_no_file_or_dir","msg_activecode_starting","msg_activecode_playing","msg_activecode_loading_audio","msg_activecode_pause_current_audio","msg_activecode_pause_audio","msg_activecode_play_paused_audio","msg_activecode_audio_paused","msg_activecode_input_prg","msg_activecode_were_compiling_err","msg_activecode_time_limit_exc","msg_activecode_server_err","msg_activecode_compiling_running","msg_activecode_server_comm_err","msg_activecode_save_run","msg_activecode_render","msg_activecode_assertion_error","msg_activecode_assertion_error_fix","msg_activecode_load_db","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","code","keys","Object","resolve","module","exports","jQuery","fn","highlight","pat","innerHighlight","node","skip","nodeType","pos","data","toUpperCase","indexOf","spannode","middlebit","splitText","middleclone","cloneNode","parentNode","replaceChild","childNodes","test","tagName","each","removeHighlight","find","firstChild","nodeName","normalize","end","$jscomp","scope","ASSUME_ES5","ASSUME_NO_NATIVE_MAP","ASSUME_NO_NATIVE_SET","SIMPLE_FROUND_POLYFILL","ISOLATE_POLYFILLS","FORCE_POLYFILL_PROMISE","FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION","defineProperty","defineProperties","D","R","Array","prototype","value","getGlobal","globalThis","window","self","g","Math","global","IS_SYMBOL_NATIVE","Symbol","TRUST_ES6_POLYFILLS","polyfills","propertyToPolyfillSymbol","POLYFILL_PREFIX","polyfill","d","polyfillIsolated","polyfillUnisolated","c","configurable","writable","k","isArray","flat","call","push","apply","arrayIteratorImpl","done","arrayIterator","next","initSymbol","iteratorPrototype","iterator","TypeError","p","lastIndex","h","exec","String","max","is","owns","hasOwnProperty","checkStringArgs","stringPadding","repeat","ceil","substring","iteratorFromArray","l","m","enumerable","get","r","toStringTag","t","__esModule","create","bind","n","s","Function","Cc","Cf","Co","Cs","Cn","Ll","Lm","Lo","Lt","Lu","M","Mc","Me","Mn","Nd","Nl","No","Pc","Pd","Pe","Pf","Pi","Po","Ps","Sc","Sm","So","Zl","Zp","Zs","C","L","LC","N","P","S","Z","w","b","bOut","bIn","bInCapture","B","strftime","builtin","object","type","forEach","abstr","setUpSlots","setUpMethods","setUpGetSets","setUpClassMethods","none","NotImplemented","__doc__","tp$doc","none$","build","githash","date","exportSymbol","f","isArrayLike","js_beautify","getDay","Date","UTC","getFullYear","getMonth","getDate","floor","warn","de_DE","identifier","days","shortDays","months","shortMonths","AM","PM","am","pm","formats","F","T","v","X","x","en_CA","ordinalSuffixes","en_US","es_MX","fr_FR","it_IT","nl_NL","pt_BR","ru_RU","tr_TR","zh_CN","q","z","G","K","U","y","J","Q","charCodeAt","getHours","getMinutes","getSeconds","getTime","getTimezoneOffset","abs","E","now","localize","localizeByIdentifier","timezone","utc","JSBI","BigInt","__isBigInt","powermod","greaterThan","__ZERO","unaryMinus","bitwiseAnd","remainder","multiply","signedRightShift","assign","toNumber","Number","bitwiseNot","bitwiseOr","bitwiseXor","exponentiate","divide","subtract","leftShift","unsignedRightShift","lessThan","lessThanOrEqual","greaterThanOrEqual","equal","notEqual","__MAX_SAFE","MAX_SAFE_INTEGER","__MIN_SAFE","numberIfSafe","BigUp","imul","clz32","sign","__kMaxLength","RangeError","isFinite","__zero","__isOneDigitInt","__oneDigit","__fromDouble","__fromString","SyntaxError","__toPrimitive","toDebugString","join","__toStringGeneric","__toStringBasePowerOfTwo","__unsignedDigit","__digit","__clz30","__decideRounding","__kBitConversionInts","__kBitConversionDouble","__copy","__absoluteSubOne","__trim","__absoluteAddOne","__kMaxLengthBits","__initializeDigits","__setDigit","__clzmsd","__multiplyAccumulate","__absoluteCompare","__absoluteDivSmall","__absoluteDivLarge","__absoluteModSmall","__absoluteAdd","__absoluteSub","__rightShiftByAbsolute","__leftShiftByAbsolute","__compareToBigInt","__absoluteAnd","__absoluteOr","__absoluteAndNot","__absoluteXor","asIntN","__truncateToNBits","__truncateAndSubFromPowerOfTwo","asUintN","ADD","__toNumeric","LT","__compare","LE","GT","GE","EQ","__equalToNumber","NE","pop","__isWhitespace","__kMaxBitsPerChar","__kBitsPerCharTableMultiplier","__kBitsPerCharTableShift","__inplaceMultiplyAdd","__fillFromParts","__kConversionChars","__halfDigit","__setHalfDigit","quotient","__unequalSign","__absoluteGreater","__absoluteLess","__compareToNumber","__compareToDouble","__comparisonResultToBool","__setDigitGrow","__imul","__internalMultiplyAdd","__halfDigitLength","__clz15","__specialLeftShift","__inplaceSub","__inplaceAdd","__inplaceRightShift","__toShiftAmount","__rightShiftByMaximum","toPrimitive","valueOf","min","__digitPow","__kBitConversionBuffer","ArrayBuffer","Float64Array","Int32Array","LN2","callback","args","setImmediate","getPrototypeOf","process","nextTick","postMessage","importScripts","onmessage","random","source","addEventListener","attachEvent","MessageChannel","port1","port2","documentElement","onreadystatechange","removeChild","arguments","clearImmediate","concat","run","clearTimeout","fun","array","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","umask","asserts","assert","fail","bool_check","python2","print_function","division","absolute_import","unicode_literals","python3","class_repr","inherit_from_object","super_args","octal_number_literal","bankers_rounding","python_version","dunder_round","exceptions","no_long_type","ceil_floor_int","silent_octal_literal","configure","filewriter","debugout","uncaughtException","read","nonreadopen","fileopen","filewrite","timeoutMsg","sysargv","__future__","imageProxy","inputfun","inputfunTakesPrompt","retainGlobals","retainglobals","debugging","killableWhile","killableFor","signals","removeEventListener","splice","signal","breakpoints","execLimit","yieldLimit","syspath","realsyspath","sysmodules","dict","misceval","softspace_","defaultHandlers","suspensionHandlers","switch_version","$next","setupOperators","setupDunderMethods","setupObjects","token","setupTokens","POSITIVE_INFINITY","files","getSysArgv","inBrowser","print","prompt","setup_method_mappings","setupDictIterators","float_","method_names","int_","list","py3$methods","d$def","py2$methods","method_descriptor","func","$mangled","tp$mro","tp$base","sk$klass","__dict__","checkDataDescr","tp$name","$jsstr","ob$type","tp$slots","tp$call","tp$new","$isSuspension","chain","$isSubType","tp$init","typeName","checkString","sk$asarray","sk$solidBase","sk$solidSlotBase","checkClass","sk$unacceptableBase","setUpInheritance","sk$prototypical","tp$bases","ht$type","ht$name","ht$qualname","$buildMRO","$typeLookup","sk$hasDict","$d","$s","globals","__module__","__name__","quick$lookup","$slots","$dict","Set","arrayFromIterable","$isIdentifier","mangleName","sk$nslots","$fixReserved","getset_descriptor","$get","AttributeError","$set","sort","localeCompare","ht$slots","$items","has","ValueError","__qualname__","$allocateSlots","lookupSpecial","$setname","unfixReserved","callsimArray","RuntimeError","$cause","super_","tp$getattr","$initsubclass","tp$descr_get","tp$descr_set","tp$setattr","dunderToSkulpt","$allocateGetterSlot","$allocateSlot","$r","tp$methods","tp$classmethods","tp$getsets","sk$type","includes","slots","$slot_name","$slot_func","tp$hash","__hash__","getOwnPropertyDescriptor","$mroMerge","sk$attrError","__base__","__bases__","sk$tuple_bases","tuple","__mro__","sk$tuple_mro","mappingproxy","$doc","lastIndexOf","$name","$module","mro","$meth","$flags","NoArgs","__dir__","$mergeClassDict","__prepare__","FastCall","generic","getSetDict","getAttr","setAttr","dict$setItem","dict$delItem","sk$object","new","newMethodDef","shift","sk$staticNew","$textsig","selfIter","iterNextWithArrayCheckSize","$seq","$orig","get$size","$index","iterNextWithArray","tp$iternext","iterLengthHintWithArrayMethodDef","iterReverseLengthHintMethodDef","seqCompare","opAllowsEquality","sk$builtinBase","NotImplemented$","richCompareBool","classGetItem","__class_getitem__","GenericAlias","OneArg","pyCheckArgs","Infinity","pyCheckArgsLen","pyCheckType","checkSequence","mp$subscript","checkIterable","tp$iter","checkCallable","checkNumber","lng","checkComplex","complex","checkInt","isInteger","checkFloat","checkBytes","bytes","checkBool","bool","checkNone","checkFunction","checkAnySet","set","frozenset","checkMapping","$keys","nb$reflected_add","nb$reflected_subtract","nb$reflected_multiply","nb$reflected_matrix_multiply","nb$reflected_divide","nb$reflected_floor_divide","nb$reflected_remainder","nb$reflected_divmod","nb$reflected_power","nb$reflected_lshift","nb$reflected_rshift","nb$reflected_and","nb$reflected_xor","nb$reflected_or","sk$baseClass","nb$add","nb$subtract","nb$multiply","nb$matrix_multiply","nb$divide","nb$floor_divide","nb$remainder","nb$divmod","nb$power","nb$lshift","nb$rshift","nb$and","nb$xor","nb$or","nb$inplace_add","nb$inplace_subtract","nb$inplace_multiply","nb$inplace_matrix_multiply","nb$inplace_divide","nb$inplace_floor_divide","nb$inplace_remainder","nb$inplace_power","nb$inplace_lshift","nb$inplace_rshift","nb$inplace_and","nb$inplace_or","nb$inplace_xor","Add","Sub","Mult","MatMult","Div","FloorDiv","Mod","DivMod","Pow","LShift","RShift","BitAnd","BitXor","BitOr","UAdd","USub","Invert","numberBinOp","numberInplaceBinOp","numberUnaryOp","isTrue","false$","true$","nb$negative","nb$positive","nb$invert","fixSeqIndex_","asnum$","sq$length","sequenceContains","sq$contains","iterFor","iter","Break","retryOptionalSuspensionOrThrow","sequenceConcat","sq$concat","sequenceInPlaceConcat","sq$inplace_concat","sequenceGetIndexOf","index","sequenceGetCountOf","count","sequenceGetItem","objectGetItem","sequenceSetItem","objectSetItem","sequenceDelItem","objectDelItem","sequenceGetSlice","sequenceDelSlice","sequenceSetSlice","sequenceUnpack","mappingUnpackIntoKeywordArray","callsimOrSuspendArray","$qualname","keywordArrayFromPyDict","keywordArrayToPyDict","mp$ass_subscript","copyKeywordsToNamedArgs","filter","checkNoKwargs","checkNoArgs","checkOneArg","checkArgsLen","objectFormat","$emptystr","$format","objectHash","objectAdd","objectNegative","objectPositive","typeLookup","$class_getitem","gattr","sattr","iternext","seq_iter_","lookupAttr","markUnhashable","setPrototypeOf","setUpBuiltinMro","entries","classmethod_descriptor","Eq","NotEq","Gt","GtE","LtE","wrapper_descriptor","tp$richcompare","ob$eq","tp$as_number","reflectedNumberSlots","reflected","slot","tp$as_sequence_or_mapping","sequenceAndMappingSlots","__new__","sk_method","subSlots","main_slots","number_slots","sequence_and_mapping_slots","buildNativeClass","base","meta","getsets","methods","classmethods","proto","flags","buildIteratorClass","built$iterators","setUpModuleMethods","superConstructor","WeakMap","tp$str","__class__","every","dict$copy","$class","__format__","__init_subclass__","NoKwargs","dict$merge","$bases","len","$getattribute","d$wrapped","tryCatch","__init__","$wrapper","sk$static_new","__call__","__repr__","__str__","__getattribute__","$getattr","__getattr__","__setattr__","MinArgs","MaxArgs","__delattr__","__get__","__set__","__delete__","__eq__","__ge__","__gt__","__le__","__lt__","__ne__","__iter__","__next__","StopIteration","gi$ret","$value","__len__","asIndexOrThrow","__contains__","__getitem__","__setitem__","__delitem__","__add__","__radd__","__iadd__","__sub__","__rsub__","__imul__","__mul__","__rmul__","__isub__","__mod__","__rmod__","__imod__","__divmod__","__rdivmod__","__pos__","__neg__","__abs__","__bool__","__invert__","__lshift__","__rlshift__","__rshift__","__rrshift__","__ilshift__","__irshift__","__and__","__rand__","__iand__","__xor__","__rxor__","__ixor__","__or__","__ror__","__ior__","__int__","__float__","__floordiv__","__rfloordiv__","__ifloordiv__","__truediv__","__rtruediv__","__itruediv__","__index__","__pow__","__rpow__","__ipow__","__matmul__","__rmatmul__","__imatmul__","__long__","__nonzero__","__div__","__rdiv__","__idiv__","ob$ne","ob$lt","ob$le","ob$gt","ob$ge","nb$abs","nb$int","nb$long","nb$float","nb$index","nb$bool","sq$repeat","mp$length","sq$inplace_repeat","findIndex","py3$slots","d$repr_name","d$check","d$set_check","d$type","d$name","__objclass__","__text_signature__","$methodFastCallNoKwargs","$methodFastCall","$methodCallNoArgs","$methodCallOneArg","NamedArgs","$methodCallNamedArgs","$methodCallMinArgs","func_code","$defaultCall","$memoiseFlags","$resolveArgs","m$checkself","Defaults","method_wrapper","raw$call","m$descr","m$self","__self__","$self","name","m$def","$fastCallNoKwargs","$callNoArgs","$callOneArg","$callNamedArgs","$callMinArgs","$defaultCallMethod","sysModules","mp$lookup","Ellipsis","formatting","str$","nb$isnegative","toLocaleString","mkNumber__format__","fromCodePoint","isNaN","toLowerCase","toFixed","format","KeyError","IndexError","repr","ascii","formatString","charAt","get$tgt","asIndexSized","OverflowError","start","startEnd$wrt","$hasAstralCodePoints","codepoints","default","Map","$savedKeyHash","$hash","$subtype_new","check$encodeArgs","$decode","codePointAt","isIndex","sssiter$","ba","ia","oa","pa","la","qa","na","substr","ja","W","ea","I","aa","parseFloat","toExponential","fromCharCode","$bytes","find$left","find$right","isIdentifier","encode","encoding","errors","str$encode","rsplit","capitalize","center","expandtabs","partition","ljust","lower","lstrip","removeprefix","startsWith","removesuffix","endsWith","rfind","rindex","rjust","rstrip","rpartition","splitlines","strip","swapcase","upper","startswith","endswith","isascii","islower","isupper","istitle","isspace","isdecimal","isdigit","isnumeric","isalpha","isalnum","isidentifier","isprintable","zfill","__getnewargs__","$py2decode","__length_hint__","abstract","as","boolean","break","byte","case","catch","char","class","continue","const","debugger","delete","do","double","else","enum","export","extends","false","final","finally","float","for","function","goto","if","implements","import","in","instanceof","int","interface","long","namespace","native","null","package","private","protected","public","return","short","static","switch","synchronized","throw","throws","transient","true","try","typeof","use","var","void","volatile","while","with","__defineGetter__","__defineSetter__","caller","isPrototypeOf","__lookupGetter__","__lookupSetter__","__noSuchMethod__","propertyIsEnumerable","toSource","unwatch","watch","reservedWords_","func_globals","co_name","co_docstring","co_qualname","func_closure","func_annotations","memoised","co_fastcall","$funcCall","method","__annotations__","__defaults__","$defaults","co_varnames","co_argcount","co_kwonlyargcount","co_varargs","co_kwargs","$kwdefs","no_kw","unshift","assk$","asnum$nofloat","round","round$","$round","any","all","sum","zip","fabs","ord","chr","unichr","message","int2str_","hex","oct","bin","dir","$dir","sorted","NotImplementedError","open","file","isinstance","hash","getattr","objectRepr","setattr","raw_input","importModule","stdin","fileno","$readline","readline","input","jseval","ffi","remapToJs","remapToPy","jsmillis","compiled","filename","compile","__file__","parse","astFromParse","cst","body","astnodes","Expr","__final_res__","reduce","list$sort","hasattr","pow","quit","SystemExit","issubclass","divmod","bytearray","callable","delattr","execfile","help","callable_iter_","locals","memoryview","next_","reload","vars","apply_","buffer","coerce","intern","u","A","H","fromEntries","traceback","lineno","context","cause","__cause__","BaseException","$path","$msg","$filename","$lineno","$offset","$text","KeyboardInterrupt","GeneratorExit","Exception","StopAsyncIteration","ArithmeticError","FloatingPointError","ZeroDivisionError","AssertionError","BufferError","EOFError","ImportError","ModuleNotFoundError","LookupError","MemoryError","NameError","UnboundLocalError","OSError","IOError","FileNotFoundError","TimeoutError","ReferenceError","RecursionError","IndentationError","TabError","SystemError","UnicodeError","UnicodeDecodeError","UnicodeEncodeError","SuspensionError","ExternalError","nativeError","getExcInfo","im_func","im_self","im_call","__func__","sk$int","Suspension","resume","child","optional","colno","$colno","reverse","asIndex","applySlice","assignSlice","arrayFromArguments","$obj","swappedOp_","opSymbols","Is","IsNot","In_","NotIn","enumerate","filter_","map_","zip_","$cmp","print_","loadname","builtins","callAsync","applyAsync","callOrSuspend","applyOrSuspend","callsim","callsimAsync","callsimOrSuspend","asyncToPromise","Promise","result","error","then","promise","brValue","iterArray","promiseToSuspension","buildClass","$prepare","navigator","userAgent","Proxy","$callable","$sentinel","$flag","in$repr","list$inRange","del$subscript","ass$subscript","__reversed__","clear","copy","append","insert","extend","list$indexOf","list$reverse","timSort","lt","listlength","ass$index","stop","step","slice$indices","ass$slice","ass$ext_slice","del$index","del$slice","del$ext_slice","Uint8Array","decode","TextDecoder","subarray","get$raw","find$subright","find$subleft","fill","utf","utf8","utf_8","latin_1","utf16","utf_16","TextEncoder","get$splitArgs","maxsplit","padStart","fromhex","SharedArrayBuffer","isView","Uint16Array","isdisjoint","$version","next$item","size","buckets","update$common","update$onearg","$missing","setdefault","get$bucket_item","set$bucket_item","pop$item","popitem","items","values","update","dict$clear","fromkeys","dict$merge_seq","pop$bucket_item","difference","intersection","union","symmetric_difference","has_key","mapping","str$get","str$keys","str$items","str$values","str$copy","$ann","property","prop$get","prop$set","prop$del","getter$doc","prop$doc","getter","$copy","setter","deleter","fget","fset","fdel","classmethod","cm$callable","__wrapped__","staticmethod","sm$callable","str2number","$trunc","nb$ispositive","real","imag","numerator","denominator","from_bytes","conjugate","bit_length","to_bytes","__trunc__","__floor__","__ceil__","__round__","log2","MAX_VALUE","MIN_VALUE","longFromStr","withinThreshold","stringToNumberOrBig","str$True","str$False","NaN","trunc","as_integer_ratio","is_integer","PyFloat_Check","toPrecision","hypot","atan2","exp","cos","sin","Py_DTSF_ADD_DOT_0","Py_DTSF_ALT","Py_DTSF_SIGN","complex_subtype_from_string","$complex","Py_DTST_FINITE","Py_DTST_INFINITE","Py_DTST_NAN","indices","slice$as_indices","$wrt","set$clear","set$update","set$issubset","set$copy","difference_update","intersection_update","symmetric_difference_update","set$add","discard","set$discard","set$difference_update","set$intersection_multi","swap$bodies","issubset","set$make_basetype","issuperset","set$symmetric_diff_update","set$intersection","$emptyset","$write","init$dict","get$name","get$mod_reprf","from$file","empty_or$loader","__package__","__spec__","__loader__","$initializing","$file","$js","$loader","str$mod_repr","structseq_types","make_structseq","$hidden","__reduce__","num_sequence_fields","generator","gi$running","gi$resumeat","gi$sentvalue","gi$locals","gi$cells","send","makeGenerator","mode","closed","data$","currentFileno","lineList","currentLine","pos$","$lines","__enter__","__exit__","close","flush","isatty","readlines","seek","tell","truncate","$isPyWrapped","unwrap","funcHook","arrayHook","dictHook","setHook","mapHook","proxyHook","unhandledHook","stringHook","numberHook","bigintHook","objectHook","from","bound","$bound","js$wrapped","$lookup","proxy$getItem","remapToJsOrWrap","toPy","toJs","toJsString","toJsNumber","toJsArray","toJsHashMap","toPyDict","toPyFloat","toPyInt","toPyNumber","toPyStr","toPyList","toPyTuple","toPySet","numberToPy","proxy","isFrozen","getOwnPropertyNames","$methods","memoized$slots","is$callable","is$type","js$proto","$new","$call","Boolean","range_","range","xrange","$iterable","$func","check$filter","$iters","reversed","$idx","$reversed","$len","T_ENDMARKER","T_NAME","T_NUMBER","T_STRING","T_NEWLINE","T_INDENT","T_DEDENT","T_LPAR","T_RPAR","T_LSQB","T_RSQB","T_COLON","T_COMMA","T_SEMI","T_PLUS","T_MINUS","T_STAR","T_SLASH","T_VBAR","T_AMPER","T_LESS","T_GREATER","T_EQUAL","T_DOT","T_PERCENT","T_LBRACE","T_RBRACE","T_EQEQUAL","T_NOTEQUAL","T_LESSEQUAL","T_GREATEREQUAL","T_TILDE","T_CIRCUMFLEX","T_LEFTSHIFT","T_RIGHTSHIFT","T_DOUBLESTAR","T_PLUSEQUAL","T_MINEQUAL","T_STAREQUAL","T_SLASHEQUAL","T_PERCENTEQUAL","T_AMPEREQUAL","T_VBAREQUAL","T_CIRCUMFLEXEQUAL","T_LEFTSHIFTEQUAL","T_RIGHTSHIFTEQUAL","T_DOUBLESTAREQUAL","T_DOUBLESLASH","T_DOUBLESLASHEQUAL","T_AT","T_ATEQUAL","T_RARROW","T_ELLIPSIS","T_OP","T_AWAIT","T_ASYNC","T_ERRORTOKEN","T_NT_OFFSET","T_N_TOKENS","T_COMMENT","T_NL","T_ENCODING","tokens","tok_name","EXACT_TOKEN_TYPES","ISTERMINAL","ISNONTERMINAL","ISEOF","string","exact_type","_tokenize","O","ha","V","ca","Y","da","fa","Floatnumber","OpMap","T_BACKQUOTE","ParseTables","sym","and_expr","and_test","annassign","arglist","argument","arith_expr","assert_stmt","async_funcdef","async_stmt","atom","atom_expr","augassign","break_stmt","classdef","comp_for","comp_if","comp_iter","comp_op","comparison","compound_stmt","continue_stmt","debugger_stmt","decorated","decorator","decorators","del_stmt","dictorsetmaker","dotted_as_name","dotted_as_names","dotted_name","encoding_decl","eval_input","except_clause","expr","expr_stmt","exprlist","factor","file_input","flow_stmt","for_stmt","funcdef","global_stmt","if_stmt","import_as_name","import_as_names","import_from","import_name","import_stmt","lambdef","lambdef_nocond","nonlocal_stmt","not_test","or_test","parameters","pass_stmt","power","print_stmt","raise_stmt","return_stmt","shift_expr","simple_stmt","single_input","sliceop","small_stmt","star_expr","stmt","subscript","subscriptlist","suite","term","test_nocond","testlist","testlist_comp","testlist_star_expr","tfpdef","trailer","try_stmt","typedargslist","varargslist","vfpdef","while_stmt","with_item","with_stmt","xor_expr","yield_arg","yield_expr","yield_stmt","number2symbol","dfas","states","labels","keywords","False","None","True","and","def","del","elif","except","lambda","nonlocal","not","or","pass","raise","yield","grammar","p_flags","FUTURE_PRINT_FUNCTION","FUTURE_UNICODE_LITERALS","FUTURE_DIVISION","FUTURE_ABSOLUTE_IMPORT","FUTURE_WITH_STATEMENT","FUTURE_NESTED_SCOPES","FUTURE_GENERATORS","CO_FUTURE_PRINT_FUNCTION","CO_FUTURE_UNICODE_LITERALS","CO_FUTURE_DIVISON","CO_FUTURE_ABSOLUTE_IMPORT","CO_FUTURE_WITH_STATEMENT","setup","stack","dfa","state","children","used_names","addtoken","classify","col_offset","rootnode","parseTreeDump","Load","Store","Del","AugLoad","AugStore","Param","And","Or","Not","In","Module","docstring","Interactive","Expression","Suite","FunctionDef","decorator_list","returns","AsyncFunctionDef","ClassDef","bases","Return","Delete","targets","Assign","AugAssign","target","op","AnnAssign","annotation","simple","For","orelse","AsyncFor","While","If","With","AsyncWith","Raise","exc","inst","tback","Try","handlers","finalbody","Assert","msg","Import","names","ImportFrom","level","Global","Nonlocal","Pass","Continue","Print","dest","nl","Debugger","BoolOp","BinOp","left","right","UnaryOp","operand","Lambda","IfExp","Dict","elts","ListComp","elt","generators","SetComp","DictComp","key","GeneratorExp","Await","Yield","YieldFrom","Compare","ops","comparators","Call","Num","Str","FormattedValue","conversion","format_spec","JoinedStr","Bytes","NameConstant","Constant","Attribute","attr","ctx","Subscript","Starred","Name","List","Tuple","Slice","ExtSlice","dims","Index","comprehension","ifs","is_async","ExceptHandler","arguments_","vararg","kwonlyargs","kw_defaults","kwarg","defaults","arg","keyword","alias","asname","withitem","context_expr","optional_vars","_astname","_fields","_isenum","c_encoding","c_filename","c_flags","Repr","end_lineno","end_col_offset","listmaker","testlist_safe","testlist1","old_test","ma","kind","Index_kind","c_feature_version","T_TYPE_COMMENT","T_NEW_TYPE_COMMENT","ka","ra","Slice_kind","ExtSlice_kind","astDump","__name","__flags","__scope","__namespaces","symFlags","varnames","blockType","returnsValue","varkeywords","varargs","childHasFree","hasFree","isNested","cur","nested","scopeId","stss","symbols","top","curClass","tmpname","DEF_GLOBAL","DEF_LOCAL","DEF_PARAM","USE","DEF_STAR","DEF_DOUBLESTAR","DEF_INTUPLE","DEF_FREE","DEF_FREE_GLOBAL","DEF_FREE_CLASS","DEF_IMPORT","DEF_BOUND","SCOPE_OFF","SCOPE_MASK","LOCAL","GLOBAL_EXPLICIT","GLOBAL_IMPLICIT","FREE","CELL","OPT_IMPORT_STAR","OPT_EXEC","OPT_BARE_EXEC","OPT_TOPLEVEL","GENERATOR","GENERATOR_EXPRESSION","ModuleBlock","FunctionBlock","ClassBlock","get_name","is_referenced","is_parameter","is_global","is_declared_global","is_local","is_free","is_imported","is_assigned","is_namespace","get_namespaces","get_type","get_lineno","is_nested","has_children","get_identifiers","_identsMatching","lookup","__check_children","get_parameters","_funcParams","get_locals","_funcLocals","get_globals","_funcGlobals","get_frees","_funcFrees","get_methods","_classMethods","getScope","getStsForAst","SEQStmt","visitStmt","SEQExpr","visitExpr","enterBlock","fixReserved","exitBlock","visitParams","addDef","visitAnnotations","posonlyargs","visitArgAnnotations","visitArguments","newTmpname","visitSlice","visitAlias","visit_withitem","visitExcepthandlers","visitComprehension","visitGenexp","analyzeBlock","analyzeName","analyzeChildBlock","analyzeCells","updateSymbols","analyze","symboltable","dumpSymtab","st","canSuspend","interactive","nestlevel","allUnits","ste","doesSuspend","private_","firstlineno","linenoSet","localnames","localtemps","tempsToSave","blocknum","blocks","curblock","consts","scopename","suffixCode","switchCode","varDeclsCode","prefixCode","breakBlocks","continueBlocks","exceptBlocks","finallyBlocks","gensymcount","activateScope","_next","getSourceLine","annotateSource","gensym","niceName","makeConstant","_gr","outputInterruptTest","_jumpfalse","_jumpundef","_jumpnotundef","_jumptrue","_jump","_checkSuspension","newBlock","setBlock","cunpackstarstoarray","vexpr","cunpackkwstoarray","ctuplelistorset","csubdict","cdict","clistcomp","ccompgen","cdictcomp","csetcomp","cyield","SYMTAB_CONSTS","cyieldfrom","ccompare","ccall","cslice","eslice","vslicesub","vslice","chandlesubscr","cboolop","cjoinedstr","cformattedvalue","clambda","cifexp","cgenexp","nameop","vseqexpr","cannassign","hasAnnotations","caugassign","exprConstant","_name","pushBreakBlock","popBreakBlock","pushContinueBlock","popContinueBlock","pushExceptBlock","popExceptBlock","pushFinallyBlock","blk","breakDepth","popFinallyBlock","peekFinallyBlock","setupExcept","endExcept","outputLocals","argnames","outputSuspensionHelpers","outputAllUnits","cif","vseqstmt","cwhile","cfor","craise","outputFinallyCascade","ctry","cwith","cassert","cimportas","cimport","cfromimport","buildcodeobj","cannotations","enterScope","isCell","exitScope","cDocstringOfCode","cargannotation","cargannotations","maybeCDocstringOfBody","cfunction","cgenexpgen","cclass","cbody","ccontinue","cbreak","vstmt","cprint","cmod","funcname","resetCompiler","importSearchPathForName","packagePath","importSetUpPath","importModuleInternal_","onBeforeImport","dateSet","__path__","onAfterImport","importMain","filesLoaded","importMainWithBody","importBuiltinWithBody","__import__","importStar","MIN_GALLOP","le","setitem","binary_sort","getitem","count_run","listSlice","descending","merge_init","merge_compute_minrun","advance","pending","merge_collapse","merge_force_collapse","gallop","min_gallop","merge_lo","copyitems","popleft","merge_hi","popright","merge_at","obj","obj_type","$supercheck","__thisclass__","__self_class__","$origin","$args","$params","attr$exc","ga$repr","mk$params","__mro_entries__","__instancecheck__","__subclasscheck__","__parameters__","__origin__","__args__","is$typevar","tuple$index","str$orig","str$args","OperationError","NegativePowerError","float_$rw$","int_$rw$","long_$rw$","exit","super_$rw$","apply_$rw$","eval_$rw$","StandardError","unicode","basestring","$empty","$utf8","$ascii","$default_factory","$imag","$real","$abs","$contains","$enter","$eq","$exit","$init","$int_","$iter","$float_","$ge","$getitem","$gt","$le","$length_hint","$lt","$ne","$repr","$setattr","$setitem","$str","op2method_","AudioTour","bnum","audio_text","audio_tour","audio_code","windowcode","first_audio","prev_audio","pause_audio","next_audio","last_audio","status","stop_button","tourButtons","elem","currIndex","buttonCount","aname","ahash","theDivid","afile","playing","tourName","codeArray","replaceAll","audio_hash","bval","audio_type","aword","first","num_lines","bcount","newButton","align","disabled","hide","click","pause","logBookEvent","event","act","div_id","tour","firstAudio","prevAudio","pauseAndPlayAudio","nextAudio","lastAudio","removeAttr","atype","temp","temp_line","temp_aname","akey","lnums","playCurrIndexAudio","handlePlaying","unbind","unhighlightLines","handleTourEnd","playaudio","outerAudio","playWhenReady","currentTime","highlightLines","play","getElementById","paused","processLines","lnum","color","comma","setBackgroundForLines","hyphen","en","msd_pyflakes_coach_line","PyflakesCoach","check","reject","fetch","response","json","errorLines","codeLines","cleaner","lineParts","vegaEmbed","socket","connection","doc","stopExecution","onmousedown","onmouseup","componentMap","chatcodesServer","autocomplete","cm","showHint","hint","anyword","ActiveCode","orig","containerDiv","useRunestoneServices","origElem","origText","textContent","codeCoachList","problem_description","parsonspersonalize","parsonsexample","puzzleScaffoldingDivid","language","timelimit","hidecode","chatcodes","hidehistory","question","tie","dburl","runButton","enabledownload","parseBooleanAttribute","downloadButton","saveButton","loadButton","partner","runCount","firstAfterRun","logResults","eBookConfig","allow_pairs","enablePartner","graphics","codecoach","codelens","controlDiv","historyScrubber","timestamps","autorun","outputLineCount","outputLines","enable_chatcodes","WebSocket","sharedb","Connection","graderactive","isTimed","iotestsStart","iotestText","iotests","prefixMarker","prefixEnd","prefixLength","prefix","markerLength","visiblePrefixEnd","visiblePrefix","suffixMarker","suffStart","suffLength","suffix","visibleSuffixStart","visibleSuffixLength","visibleSuffix","baseCode","trimLockedCode","history","highlightedLines","lockedLines","lockTextMarkers","lockGutterLines","createEditor","createOutput","createControls","caption","addCaption","editor","refresh","decorateStatus","runButtonHandler","indicate_component_ready","Prism","highlightAllUnder","helpLoaded","prevHelpedCode","linkdiv","codeDiv","replaceWith","edmode","gutterList","style","lineNumbers","indentUnit","getComputedStyle","getPropertyValue","matchBrackets","autoMatchParens","gutters","screenReaderLabel","extraKeys","Tab","requestAnimationFrame","display","scrollbars","vert","bottom","getWrapperElement","resizable","resize","setSize","width","height","borderTopColor","borderBottomColor","ev","acEditEvent","undefined","getValue","addingScrubber","isAnswered","startEditTimeStamp","preventDefault","acElement","tabDown","getInputField","setOption","ctrlKey","metaKey","toggleComment","setLockedRegions","setHighlightLines","operation","lineNumber","removeLineClass","lineNum","startLine","endLine","lastLine","addLineClass","highlightLine","placeLock","marker","setGutterMarker","posFromIndex","endPos","markText","ch","readOnly","atomic","inclusiveLeft","inclusiveRight","endIndex","endPos2","logCurrentAnswer","runCoaches","renderFeedback","toggleAlert","getParsonsCodeTailor","problem_id","personalization_level","internal_test_case","raw_test_case","junitCode","helperMatch","helperCode","junitToBackend","cleanTestcase","student_code","scaffoldingController","AbortController","timeoutMessage","timeoutId","abort","course","headers","ok","loadingBarDiv","reopenHelpBtnHandler","isNewHelp","splitIntoChunks","chunkSize","chunks","startIndex","adjustedChunkSize","lastLineBreakIndex","latestParsonsHelpID","removeClass","reopen_act","reopen","helpText","codeSolution","puzzleHtml","solutionGenerationType","generationResultType","codeAnswer","puzzle_rst","code_answer","generation_type","solution_type","cleaned","tempDiv","innerText","cleanParsonsHTML","basicData","chunkIndex","codeChunks","chunk","content","totalChunks","puzzle","puzzleChunks","puzzleIndex","logActInParts","probDescHTML","last","puzzleCode","scaffoldingContainer","insertBefore","closeScaffoldingButton","onclick","close_divId","currentTarget","closest","parsonsScaffolding","querySelector","parsonsContainer","innerDiv","addClass","copyAnswerButton","copyScaffoldingSolutionToClipboard","parsonsDiv","temptextarea","select","setSelectionRange","execCommand","prop","alert","parsonsBtnHandler","parsonsBtn","existingLoadingPrompt","loadingPrompt","spinner","encouragementText","countdownText","scrollIntoView","request_act","requestChunkIndex","butt","ctrlDiv","downloadsEnabled","addDownloadButton","addHistoryScrubber","addFeedbackButton","enableHideShow","enableCodeLens","parsonsScaffoldingBtn","reopenScaffoldingBtn","reformatable","enableReformat","enableAudioTours","isInstructor","enableInstructorSharing","setupPartner","enableChatCodes","prepend","gradeButton","createGradeSummary","downloadFile","showHideButt","toggle","parentElement","clButton","showCodelens","reformatButton","reformat","atButton","shareButt","async","confirm","lang","request","Request","ajaxURL","jsonHeaders","post_promise","mess","share_count","checkPartner","plabel","partnerTextBox","didAgree","localStorage","getItem","setItem","change","chatBar","channels","topic","location","host","param","chatButton","updateChatCodesChannels","channel","archived","link","href","channelName","subscribe","enableSaveLoad","pos_last","reqData","acid","sid","practice_mode","isLoggedIn","assessmentTaken","renderScrubber","new_server_prefix","detail","scrubberDiv","scrubber","timestampP","slideit","el","submittedCode","slider","readdLockedCode","setValue","curVal","outOf","deadline","ts","insertAfter","coachDiv","lensDiv","visibility","disableSaveLoad","computeChangesPerSecond","lastCode","editDistance","computeEditDistance","timeDifference","currentCode","dp","fileName","toJSON","languageExtensions","textToWrite","textFileAsBlob","Blob","msSaveOrOpenBlob","downloadLink","download","URL","createObjectURL","modal","cl","myVars","origin","cumulative","heapPrimitives","drawParentPointers","textReferences","showOnlyOutputs","rawInputLstJSON","py","langauge","curInstr","codeDivWidth","codeDivHeight","embedUrlStr","myIframe","background","src","firstLine","indentLine","blur","toggleEditorVisibility","errorLine","pretextLines","progLines","to","errName","errorText","setTimeLimit","timer","builtinRead","fileReader","skulptFile","ajax","url","success","file_contents","fobj","filecomponent","val","container","tab","rows","cols","current","getIncludedCode","wresult","visPrefixLength","visSuffixLength","useSuffix","pretext","userCode","checkCurrentAnswer","to_save","editDist","changesPerSecond","logRunEvent","unit_results","unitData","results","coach","allSettled","promises","checkDiv","unit_results_divid","urDivid","unitFeedback","tmp","rowHeaders","querySelectorAll","rh","backgroundColor","urResults","is_toggle","noUI","urdiv","jsonpSites","gradeContainer","TurtleGraphics","canvas","allVisualizers","redrawConnectors","disableInteraction","python","javascript","java","cpp","sql","octave","kotlin","isInViewport","element","rect","getBoundingClientRect","innerHeight","clientHeight","innerWidth","clientWidth","ParseError","ParseErrorFix","TypeErrorFix","NameErrorFix","ValueErrorFix","AttributeErrorFix","TokenError","TokenErrorFix","TimeLimitError","TimeLimitErrorFix","TimeoutErrorFix","ErrorFix","SyntaxErrorFix","IndexErrorFix","URIError","URIErrorFix","ImportErrorFix","ReferenceErrorFix","ZeroDivisionErrorFix","RangeErrorFix","InternalError","InternalErrorFix","IndentationErrorFix","NotImplementedErrorFix","KeyErrorFix","AssertionErrorFix","replacement","JUnitTestParser","textResults","HTMLActiveCode","srcdoc","clearDiv","allDburls","SQLActiveCode","bookprefix","fnprefix","search","basecourse","config","locateFile","showLast","SQL","buttonText","xWaitFor","db","dbObject","Deferred","xhr","XMLHttpRequest","responseType","onload","uInt8Array","Database","respDiv","query","it","iterateStatements","statement","columns","getColumnNames","rowcount","getNormalizedSQL","getRowsModified","getRemainingSQL","resultArray","section","tableDiv","maxHeight","createTable","messageBox","rmsg","testResult","autograde","result_table","wlist","loc","oper","expected","row","col","testOneAssert","maximumFractionDigits","actual","operand1","operand2","tableData","trimRows","hot","autoRowSize","autoColumnSize","useHeaders","colHeaders","maxRows","filters","dropdownMenu","licenseKey","actualHeight","getRowHeight","updateSettings","loggedout","TimedActiveCodeMixin","timedInit","hideButtons","needsReinitialization","buttonList","coachButton","renderTimedIcon","component","timeIconDiv","timeIcon","checkCorrectTimed","pct_correct","hideFeedback","reinitializeListeners","taken","runButtonHander","slide","TimedLiveCode","TimedActiveCode","timedInitComplete","TimedJSActiveCode","TimedHTMLActiveCode","TimedSQLActiveCode","ACFactory","foo","createActiveCode","addopts","attrname","dataElem","dataset","timed","addActiveCodeToDiv","outerdivid","acdivid","initialcode","acdiv","thepre","newac","savediv","createActiveCodeFromOpts","createScratchActivecode","enableScratchAC","scratchDiv","acDefaultLanguage","htmlmixed","js","py2","py3","py3anaconda","ruby","observable","MutationObserver","mutations","mutation","attributeName","CodeMirror","observe","attributes","attributeFilter","focus","toggleScratchActivecode","realDiv","selectors","firstFocusableElement","focusableElements","lastFocusableElement","shiftKey","activeElement","textArea","component_factory","activecode","msg_activecode_compile_only","msg_activecode_run_button_title","msg_activecode_code_coach","msg_activecode_passed","msg_activecode_failed","msg_activecode_unit_test_results","msg_activecode_test_run_error","msg_activecode_test_compile_error","msg_activecode_iotest_results","msg_activecode_assertions_checked","msg_sctivecode_parse_error","msg_sctivecode_parse_error_fix","MD5","RotateLeft","lValue","iShiftBits","AddUnsigned","lX","lY","lX4","lY4","lX8","lY8","lResult","FF","ac","GG","HH","II","WordToHex","lCount","WordToHexValue","WordToHexValue_temp","AA","BB","CC","DD","utftext","Utf8Encode","lWordCount","lMessageLength","lNumberOfWords_temp1","lNumberOfWords","lWordArray","lBytePosition","lByteCount","ConvertToWordArray","LiveCode","additional_files","datafiles","sourcefile","compileargs","unescapeHtml","compileAlso","linkargs","runargs","interpreterargs","API_KEY","USE_API_KEY","JOBE_SERVER","jobehost","resource","proxyuri_runs","jobePutFiles","proxyuri_files","jobeCheckFiles","div2id","createInputElement","createErrorOutput","inputContainer","label","stdin_el","getCombinedSuffixes","hasUnitTests","combinedSuffix","runSetup","ioResults","iotest","spec","json_runspec","run_spec","iores","submitToJobe","addJobeErrorMessage","statusText","processJobeIOResponses","res","runResults","processJobeResponse","sfilemap","sourcefilename","testdrivername","file_checkp","classMatch","btoa","paramlist","paramobj","memorylimit","timelimitSeconds","cputime","allFilesRaw","datafileFileName","additionalFiles","addFileId","fileElement","studentCode","fileExtension","parseJavaClasses","base64","toDataURL","junitDriverCode","compileList","runspec","language_id","sourcecode","instance","fileContent","checkFile","errDiv","Headers","Accept","logresult","odiv","parsedOutput","outcome","cmpinfo","stderr","escapeHtml","resultList","heading","passedTests","trimLines","trimEnd","produced","desired","out","td1","td2","td3","producedRenderOutput","td4","rdiv","file_id","setRequestHeader","onerror","pushDataFile","contentsb64","extension","contents","clMess","targetDiv","addVisualizerToPage","startingInstruction","editCodeBaseURL","hideCode","found","classes","importIndex","endOfLastCommentBeforeClassBegins","pCount","words","safe"],"sourceRoot":""} \ No newline at end of file diff --git a/course/_static/877.c2f5ef32dd94b9b6.js.map.gz b/course/_static/877.c2f5ef32dd94b9b6.js.map.gz new file mode 100755 index 0000000000000000000000000000000000000000..4aa4bffb03748d65c69ad2aa5aea26eff706ca04 GIT binary patch literal 590089 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 ^0YRlC{CDgABV%$Xn{n(##sQ$e@HQ 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

  • '),e(".dropdown-toggle").dropdown(),patchTables(),e("div.note").addClass("alert").addClass("alert-info"),e("div.warning").addClass("alert").addClass("alert-warning"),e("tt.docutils.literal").not(".xref").each((function(n,t){e(t).parent().hasClass("reference")||e(t).replaceWith((function(){return e("").text(e(this).text())}))}))}))}(window.jQuery)},19695:()=>{var e,n=!1;function t(){n||(function(){let n=$("[data-childcomponent]");n.addClass("runestone"),n.parent().closest("div").not("section").addClass("runestone"),n.parent().closest("div").css("max-width","none"),n.each((function(e){$(this),$(this).find(".ac_code_div, .ac_output").wrapAll("
    ")})),$("section img").wrap('
    '),e=$(".runestone").not(".runestone .runestone"),$("h1").before("
    ")}(),n=!0);let t=$("body"),o="present",s="full-height",a="bottom";t.hasClass(o)?($("section *").not("h1, .presentation-title, .btn-presenter, .runestone, .runestone *, section, .pre, code").removeClass("hidden"),$("#completionButton").removeClass("hidden"),t.removeClass(o),$("."+s).removeClass(s),$("."+a).removeClass(a),localStorage.setItem("presentMode","text"),e.removeClass("hidden"),undefined.disabled=!0):($("section *").not("h1, .presentation-title, .btn-presenter, .runestone, .runestone *, section, .pre, code").addClass("hidden"),$("#completionButton").addClass("hidden"),t.addClass(o),t.addClass(s),$("html").addClass(s),$("section .runestone").addClass(s),$(".ac-caption").addClass(a),localStorage.setItem("presentMode",o),i())}function o(){return active=e.filter(".active")}function i(n){void 0===n&&(n=0);let t=o();e.length&&(t.removeClass("active"),t=$(e[n]).addClass("active"),t.removeClass("hidden"),e.not(e.filter(".active")).addClass("hidden"))}window.nextExercise=function(){let n=o(),t=e.index(n)+1;t=0&&i(t)},$(document).on("runestone:login-complete",(function(){eBookConfig.isInstructor&&($(".navbar-right").prepend(""),$(".mode-select").change(t))}))},23836:()=>{!function(e){"use strict";e.i18n=e.i18n||{},e.extend(e.i18n.fallbacks,{ab:["ru"],ace:["id"],aln:["sq"],als:["gsw","de"],an:["es"],anp:["hi"],arn:["es"],arz:["ar"],av:["ru"],ay:["es"],ba:["ru"],bar:["de"],"bat-smg":["sgs","lt"],bcc:["fa"],"be-x-old":["be-tarask"],bh:["bho"],bjn:["id"],bm:["fr"],bpy:["bn"],bqi:["fa"],bug:["id"],"cbk-zam":["es"],ce:["ru"],crh:["crh-latn"],"crh-cyrl":["ru"],csb:["pl"],cv:["ru"],"de-at":["de"],"de-ch":["de"],"de-formal":["de"],dsb:["de"],dtp:["ms"],egl:["it"],eml:["it"],ff:["fr"],fit:["fi"],"fiu-vro":["vro","et"],frc:["fr"],frp:["fr"],frr:["de"],fur:["it"],gag:["tr"],gan:["gan-hant","zh-hant","zh-hans"],"gan-hans":["zh-hans"],"gan-hant":["zh-hant","zh-hans"],gl:["pt"],glk:["fa"],gn:["es"],gsw:["de"],hif:["hif-latn"],hsb:["de"],ht:["fr"],ii:["zh-cn","zh-hans"],inh:["ru"],iu:["ike-cans"],jut:["da"],jv:["id"],kaa:["kk-latn","kk-cyrl"],kbd:["kbd-cyrl"],khw:["ur"],kiu:["tr"],kk:["kk-cyrl"],"kk-arab":["kk-cyrl"],"kk-latn":["kk-cyrl"],"kk-cn":["kk-arab","kk-cyrl"],"kk-kz":["kk-cyrl"],"kk-tr":["kk-latn","kk-cyrl"],kl:["da"],"ko-kp":["ko"],koi:["ru"],krc:["ru"],ks:["ks-arab"],ksh:["de"],ku:["ku-latn"],"ku-arab":["ckb"],kv:["ru"],lad:["es"],lb:["de"],lbe:["ru"],lez:["ru"],li:["nl"],lij:["it"],liv:["et"],lmo:["it"],ln:["fr"],ltg:["lv"],lzz:["tr"],mai:["hi"],"map-bms":["jv","id"],mg:["fr"],mhr:["ru"],min:["id"],mo:["ro"],mrj:["ru"],mwl:["pt"],myv:["ru"],mzn:["fa"],nah:["es"],nap:["it"],nds:["de"],"nds-nl":["nl"],"nl-informal":["nl"],no:["nb"],os:["ru"],pcd:["fr"],pdc:["de"],pdt:["de"],pfl:["de"],pms:["it"],pt:["pt-br"],"pt-br":["pt"],qu:["es"],qug:["qu","es"],rgn:["it"],rmy:["ro"],"roa-rup":["rup"],rue:["uk","ru"],ruq:["ruq-latn","ro"],"ruq-cyrl":["mk"],"ruq-latn":["ro"],sa:["hi"],sah:["ru"],scn:["it"],sg:["fr"],sgs:["lt"],sli:["de"],sr:["sr-ec"],srn:["nl"],stq:["de"],su:["id"],szl:["pl"],tcy:["kn"],tg:["tg-cyrl"],tt:["tt-cyrl","ru"],"tt-cyrl":["ru"],ty:["fr"],udm:["ru"],ug:["ug-arab"],uk:["ru"],vec:["it"],vep:["et"],vls:["nl"],vmf:["de"],vot:["fi"],vro:["et"],wa:["fr"],wo:["fr"],wuu:["zh-hans"],xal:["ru"],xmf:["ka"],yi:["he"],za:["zh-hans"],zea:["nl"],zh:["zh-hans"],"zh-classical":["lzh"],"zh-cn":["zh-hans"],"zh-hant":["zh-hans"],"zh-hk":["zh-hant","zh-hans"],"zh-min-nan":["nan"],"zh-mo":["zh-hk","zh-hant","zh-hans"],"zh-my":["zh-sg","zh-hans"],"zh-sg":["zh-hans"],"zh-tw":["zh-hant","zh-hans"],"zh-yue":["yue"]})}(jQuery)},35773:()=>{!function(e){"use strict";var n={pluralRules:{ak:{one:"n = 0..1"},am:{one:"i = 0 or n = 1"},ar:{zero:"n = 0",one:"n = 1",two:"n = 2",few:"n % 100 = 3..10",many:"n % 100 = 11..99"},ars:{zero:"n = 0",one:"n = 1",two:"n = 2",few:"n % 100 = 3..10",many:"n % 100 = 11..99"},as:{one:"i = 0 or n = 1"},be:{one:"n % 10 = 1 and n % 100 != 11",few:"n % 10 = 2..4 and n % 100 != 12..14",many:"n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14"},bh:{one:"n = 0..1"},bn:{one:"i = 0 or n = 1"},br:{one:"n % 10 = 1 and n % 100 != 11,71,91",two:"n % 10 = 2 and n % 100 != 12,72,92",few:"n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99",many:"n != 0 and n % 1000000 = 0"},bs:{one:"v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"},cs:{one:"i = 1 and v = 0",few:"i = 2..4 and v = 0",many:"v != 0"},cy:{zero:"n = 0",one:"n = 1",two:"n = 2",few:"n = 3",many:"n = 6"},da:{one:"n = 1 or t != 0 and i = 0,1"},dsb:{one:"v = 0 and i % 100 = 1 or f % 100 = 1",two:"v = 0 and i % 100 = 2 or f % 100 = 2",few:"v = 0 and i % 100 = 3..4 or f % 100 = 3..4"},fa:{one:"i = 0 or n = 1"},ff:{one:"i = 0,1"},fil:{one:"v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9"},fr:{one:"i = 0,1"},ga:{one:"n = 1",two:"n = 2",few:"n = 3..6",many:"n = 7..10"},gd:{one:"n = 1,11",two:"n = 2,12",few:"n = 3..10,13..19"},gu:{one:"i = 0 or n = 1"},guw:{one:"n = 0..1"},gv:{one:"v = 0 and i % 10 = 1",two:"v = 0 and i % 10 = 2",few:"v = 0 and i % 100 = 0,20,40,60,80",many:"v != 0"},he:{one:"i = 1 and v = 0",two:"i = 2 and v = 0",many:"v = 0 and n != 0..10 and n % 10 = 0"},hi:{one:"i = 0 or n = 1"},hr:{one:"v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"},hsb:{one:"v = 0 and i % 100 = 1 or f % 100 = 1",two:"v = 0 and i % 100 = 2 or f % 100 = 2",few:"v = 0 and i % 100 = 3..4 or f % 100 = 3..4"},hy:{one:"i = 0,1"},is:{one:"t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0"},iu:{one:"n = 1",two:"n = 2"},iw:{one:"i = 1 and v = 0",two:"i = 2 and v = 0",many:"v = 0 and n != 0..10 and n % 10 = 0"},kab:{one:"i = 0,1"},kn:{one:"i = 0 or n = 1"},kw:{one:"n = 1",two:"n = 2"},lag:{zero:"n = 0",one:"i = 0,1 and n != 0"},ln:{one:"n = 0..1"},lt:{one:"n % 10 = 1 and n % 100 != 11..19",few:"n % 10 = 2..9 and n % 100 != 11..19",many:"f != 0"},lv:{zero:"n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19",one:"n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1"},mg:{one:"n = 0..1"},mk:{one:"v = 0 and i % 10 = 1 or f % 10 = 1"},mo:{one:"i = 1 and v = 0",few:"v != 0 or n = 0 or n != 1 and n % 100 = 1..19"},mr:{one:"i = 0 or n = 1"},mt:{one:"n = 1",few:"n = 0 or n % 100 = 2..10",many:"n % 100 = 11..19"},naq:{one:"n = 1",two:"n = 2"},nso:{one:"n = 0..1"},pa:{one:"n = 0..1"},pl:{one:"i = 1 and v = 0",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14",many:"v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14"},prg:{zero:"n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19",one:"n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1"},pt:{one:"i = 0..1"},ro:{one:"i = 1 and v = 0",few:"v != 0 or n = 0 or n != 1 and n % 100 = 1..19"},ru:{one:"v = 0 and i % 10 = 1 and i % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14",many:"v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14"},se:{one:"n = 1",two:"n = 2"},sh:{one:"v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"},shi:{one:"i = 0 or n = 1",few:"n = 2..10"},si:{one:"n = 0,1 or i = 0 and f = 1"},sk:{one:"i = 1 and v = 0",few:"i = 2..4 and v = 0",many:"v != 0"},sl:{one:"v = 0 and i % 100 = 1",two:"v = 0 and i % 100 = 2",few:"v = 0 and i % 100 = 3..4 or v != 0"},sma:{one:"n = 1",two:"n = 2"},smi:{one:"n = 1",two:"n = 2"},smj:{one:"n = 1",two:"n = 2"},smn:{one:"n = 1",two:"n = 2"},sms:{one:"n = 1",two:"n = 2"},sr:{one:"v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14"},ti:{one:"n = 0..1"},tl:{one:"v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9"},tzm:{one:"n = 0..1 or n = 11..99"},uk:{one:"v = 0 and i % 10 = 1 and i % 100 != 11",few:"v = 0 and i % 10 = 2..4 and i % 100 != 12..14",many:"v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14"},wa:{one:"n = 0..1"},zu:{one:"i = 0 or n = 1"}},convertPlural:function(n,t){var o,i,s,a,r=new RegExp("\\d+=","i");if(!t||0===t.length)return"";for(s=0;s{!function(e){"use strict";var n;n=new RegExp("(?:([A-Za-zªµºÀ-ÖØ-öø-ʸʻ-ˁːˑˠ-ˤˮͰ-ͳͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-҂Ҋ-ԯԱ-Ֆՙ-՟ա-և։ः-हऻऽ-ीॉ-ौॎ-ॐक़-ॡ।-ঀংঃঅ-ঌএঐও-নপ-রলশ-হঽ-ীেৈোৌৎৗড়ঢ়য়-ৡ০-ৱ৴-৺ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਾ-ੀਖ਼-ੜਫ਼੦-੯ੲ-ੴઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽ-ીૉોૌૐૠૡ૦-૰ૹଂଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽାୀେୈୋୌୗଡ଼ଢ଼ୟ-ୡ୦-୷ஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹாிுூெ-ைொ-ௌௐௗ௦-௲ఁ-ఃఅ-ఌఎ-ఐఒ-నప-హఽు-ౄౘ-ౚౠౡ౦-౯౿ಂಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ-ೄೆ-ೈೊೋೕೖೞೠೡ೦-೯ೱೲംഃഅ-ഌഎ-ഐഒ-ഺഽ-ീെ-ൈൊ-ൌൎൗൟ-ൡ൦-൵൹-ൿංඃඅ-ඖක-නඳ-රලව-ෆා-ෑෘ-ෟ෦-෯ෲ-෴ก-ะาำเ-ๆ๏-๛ກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆ໐-໙ໜ-ໟༀ-༗༚-༴༶༸༾-ཇཉ-ཬཿ྅ྈ-ྌ྾-࿅࿇-࿌࿎-࿚က-ာေးျြဿ-ၗၚ-ၝၡ-ၰၵ-ႁႃႄႇ-ႌႎ-ႜ႞-ჅჇჍა-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፠-፼ᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙿᚁ-ᚚᚠ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱ᜵᜶ᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳាើ-ៅះៈ។-៚ៜ០-៩᠐-᠙ᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᤣ-ᤦᤩ-ᤫᤰᤱᤳ-ᤸ᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧚ᨀ-ᨖᨙᨚ᨞-ᩕᩗᩡᩣᩤᩭ-ᩲ᪀-᪉᪐-᪙᪠-᪭ᬄ-ᬳᬵᬻᬽ-ᭁᭃ-ᭋ᭐-᭪᭴-᭼ᮂ-ᮡᮦᮧ᮪ᮮ-ᯥᯧᯪ-ᯬᯮ᯲᯳᯼-ᰫᰴᰵ᰻-᱉ᱍ-᱿᳀-᳇᳓᳡ᳩ-ᳬᳮ-ᳳᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‎ⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎ⅏Ⅰ-ↈ⌶-⍺⎕⒜-ⓩ⚬⠀-⣿Ⰰ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵰ⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〮〯〱-〵〸-〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎ㆐-ㆺㇰ-㈜㈠-㉏㉠-㉻㉿-㊰㋀-㋋㋐-㋾㌀-㍶㍻-㏝㏠-㏾㐀-䶵一-鿕ꀀ-ꒌꓐ-ꘌꘐ-ꘫꙀ-ꙮꚀ-ꚝꚠ-ꛯ꛲-꛷Ꜣ-ꞇ꞉-ꞭꞰ-ꞷꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠤꠧ꠰-꠷ꡀ-ꡳꢀ-ꣃ꣎-꣙ꣲ-ꣽ꤀-ꤥ꤮-ꥆꥒ꥓꥟-ꥼꦃ-ꦲꦴꦵꦺꦻꦽ-꧍ꧏ-꧙꧞-ꧤꧦ-ꧾꨀ-ꨨꨯꨰꨳꨴꩀ-ꩂꩄ-ꩋꩍ꩐-꩙꩜-ꩻꩽ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫫꫮ-ꫵꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭥꭰ-ꯤꯦꯧꯩ-꯬꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ-舘並-龎ff-stﬓ-ﬗA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]|\ud800[\udc00-\udc0b]|\ud800[\udc0d-\udc26]|\ud800[\udc28-\udc3a]|𐀼|𐀽|\ud800[\udc3f-\udc4d]|\ud800[\udc50-\udc5d]|\ud800[\udc80-\udcfa]|𐄀|𐄂|\ud800[\udd07-\udd33]|\ud800[\udd37-\udd3f]|\ud800[\uddd0-\uddfc]|\ud800[\ude80-\ude9c]|\ud800[\udea0-\uded0]|\ud800[\udf00-\udf23]|\ud800[\udf30-\udf4a]|\ud800[\udf50-\udf75]|\ud800[\udf80-\udf9d]|\ud800[\udf9f-\udfc3]|\ud800[\udfc8-\udfd5]|\ud801[\udc00-\udc9d]|\ud801[\udca0-\udca9]|\ud801[\udd00-\udd27]|\ud801[\udd30-\udd63]|𐕯|\ud801[\ude00-\udf36]|\ud801[\udf40-\udf55]|\ud801[\udf60-\udf67]|𑀀|\ud804[\udc02-\udc37]|\ud804[\udc47-\udc4d]|\ud804[\udc66-\udc6f]|\ud804[\udc82-\udcb2]|𑂷|𑂸|\ud804[\udcbb-\udcc1]|\ud804[\udcd0-\udce8]|\ud804[\udcf0-\udcf9]|\ud804[\udd03-\udd26]|𑄬|\ud804[\udd36-\udd43]|\ud804[\udd50-\udd72]|\ud804[\udd74-\udd76]|\ud804[\udd82-\uddb5]|\ud804[\uddbf-\uddc9]|𑇍|\ud804[\uddd0-\udddf]|\ud804[\udde1-\uddf4]|\ud804[\ude00-\ude11]|\ud804[\ude13-\ude2e]|𑈲|𑈳|𑈵|\ud804[\ude38-\ude3d]|\ud804[\ude80-\ude86]|𑊈|\ud804[\ude8a-\ude8d]|\ud804[\ude8f-\ude9d]|\ud804[\ude9f-\udea9]|\ud804[\udeb0-\udede]|\ud804[\udee0-\udee2]|\ud804[\udef0-\udef9]|𑌂|𑌃|\ud804[\udf05-\udf0c]|𑌏|𑌐|\ud804[\udf13-\udf28]|\ud804[\udf2a-\udf30]|𑌲|𑌳|\ud804[\udf35-\udf39]|\ud804[\udf3d-\udf3f]|\ud804[\udf41-\udf44]|𑍇|𑍈|\ud804[\udf4b-\udf4d]|𑍐|𑍗|\ud804[\udf5d-\udf63]|\ud805[\udc80-\udcb2]|𑒹|\ud805[\udcbb-\udcbe]|𑓁|\ud805[\udcc4-\udcc7]|\ud805[\udcd0-\udcd9]|\ud805[\udd80-\uddb1]|\ud805[\uddb8-\uddbb]|𑖾|\ud805[\uddc1-\udddb]|\ud805[\ude00-\ude32]|𑘻|𑘼|𑘾|\ud805[\ude41-\ude44]|\ud805[\ude50-\ude59]|\ud805[\ude80-\udeaa]|𑚬|𑚮|𑚯|𑚶|\ud805[\udec0-\udec9]|\ud805[\udf00-\udf19]|𑜠|𑜡|𑜦|\ud805[\udf30-\udf3f]|\ud806[\udca0-\udcf2]|𑣿|\ud806[\udec0-\udef8]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e]|\ud809[\udc70-\udc74]|\ud809[\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38]|\ud81a[\ude40-\ude5e]|\ud81a[\ude60-\ude69]|𖩮|𖩯|\ud81a[\uded0-\udeed]|𖫵|\ud81a[\udf00-\udf2f]|\ud81a[\udf37-\udf45]|\ud81a[\udf50-\udf59]|\ud81a[\udf5b-\udf61]|\ud81a[\udf63-\udf77]|\ud81a[\udf7d-\udf8f]|\ud81b[\udf00-\udf44]|\ud81b[\udf50-\udf7e]|\ud81b[\udf93-\udf9f]|𛀀|𛀁|\ud82f[\udc00-\udc6a]|\ud82f[\udc70-\udc7c]|\ud82f[\udc80-\udc88]|\ud82f[\udc90-\udc99]|𛲜|𛲟|\ud834[\udc00-\udcf5]|\ud834[\udd00-\udd26]|\ud834[\udd29-\udd66]|\ud834[\udd6a-\udd72]|𝆃|𝆄|\ud834[\udd8c-\udda9]|\ud834[\uddae-\udde8]|\ud834[\udf60-\udf71]|\ud835[\udc00-\udc54]|\ud835[\udc56-\udc9c]|𝒞|𝒟|𝒢|𝒥|𝒦|\ud835[\udca9-\udcac]|\ud835[\udcae-\udcb9]|𝒻|\ud835[\udcbd-\udcc3]|\ud835[\udcc5-\udd05]|\ud835[\udd07-\udd0a]|\ud835[\udd0d-\udd14]|\ud835[\udd16-\udd1c]|\ud835[\udd1e-\udd39]|\ud835[\udd3b-\udd3e]|\ud835[\udd40-\udd44]|𝕆|\ud835[\udd4a-\udd50]|\ud835[\udd52-\udea5]|\ud835[\udea8-\udeda]|\ud835[\udedc-\udf14]|\ud835[\udf16-\udf4e]|\ud835[\udf50-\udf88]|\ud835[\udf8a-\udfc2]|\ud835[\udfc4-\udfcb]|\ud836[\udc00-\uddff]|\ud836[\ude37-\ude3a]|\ud836[\ude6d-\ude74]|\ud836[\ude76-\ude83]|\ud836[\ude85-\ude8b]|\ud83c[\udd10-\udd2e]|\ud83c[\udd30-\udd69]|\ud83c[\udd70-\udd9a]|\ud83c[\udde6-\ude02]|\ud83c[\ude10-\ude3a]|\ud83c[\ude40-\ude48]|🉐|🉑|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6]|\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34]|\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1d]|\ud86e[\udc20-\udfff]|[\ud86f-\ud872][\udc00-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]|[\udb80-\udbbe][\udc00-\udfff]|\udbbf[\udc00-\udffd]|[\udbc0-\udbfe][\udc00-\udfff]|\udbff[\udc00-\udffd])|([֐־׀׃׆׈-׿߀-ߪߴߵߺ-ࠕࠚࠤࠨ࠮-ࡘ࡜-࢟‏יִײַ-ﬨשׁ-ﭏ؈؋؍؛-ي٭-ٯٱ-ەۥۦۮۯۺ-ܐܒ-ܯ݋-ޥޱ-޿ࢠ-࣢ﭐ-ﴽ﵀-﷏ﷰ-﷼﷾﷿ﹰ-﻾]|\ud802[\udc00-\udd1e]|\ud802[\udd20-\ude00]|𐨄|\ud802[\ude07-\ude0b]|\ud802[\ude10-\ude37]|\ud802[\ude3b-\ude3e]|\ud802[\ude40-\udee4]|\ud802[\udee7-\udf38]|\ud802[\udf40-\udfff]|\ud803[\udc00-\ude5f]|\ud803[\ude7f-\udfff]|\ud83a[\udc00-\udccf]|\ud83a[\udcd7-\udfff]|\ud83b[\udc00-\uddff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\udf00-\udfff]|\ud83b[\ude00-\udeef]|\ud83b[\udef2-\udeff]))"),e.extend(e.i18n.parser.emitter,{bidi:function(e){var t,o=(t=e[0].match(n))?void 0===t[2]?"ltr":"rtl":null;return"ltr"===o?"‪"+e[0]+"‬":"rtl"===o?"‫"+e[0]+"‬":e[0]}})}(jQuery)},41669:e=>{"use strict";e.exports=jQuery},46905:()=>{!function(e){"use strict";var n=function(){this.language=e.i18n.languages[String.locale]||e.i18n.languages.default};n.prototype={constructor:n,emit:function(n,t){var o,i,s,a=this;switch(typeof n){case"string":case"number":o=n;break;case"object":if(i=e.map(n.slice(1),(function(e){return a.emit(e,t)})),s=n[0].toLowerCase(),"function"!=typeof a[s])throw new Error('unknown operation "'+s+'"');o=a[s](i,t);break;case"undefined":o="";break;default:throw new Error("unexpected type in AST: "+typeof n)}return o},concat:function(n){var t="";return e.each(n,(function(e,n){t+=n})),t},replace:function(e,n){var t=parseInt(e[0],10);return t{!function(e){"use strict";var n=function(n){this.options=e.extend({},e.i18n.parser.defaults,n),this.language=e.i18n.languages[String.locale]||e.i18n.languages.default,this.emitter=e.i18n.parser.emitter};n.prototype={constructor:n,simpleParse:function(e,n){return e.replace(/\$(\d+)/g,(function(e,t){var o=parseInt(t,10)-1;return void 0!==n[o]?n[o]:"$"+t}))},parse:function(n,t){return n.indexOf("{{")<0?this.simpleParse(n,t):(this.emitter.language=e.i18n.languages[e.i18n().locale]||e.i18n.languages.default,this.emitter.emit(this.ast(n),t))},ast:function(e){var n,t,o,i,s,a,r,d,l,u,c,f,p,m,g,h,v,y,b,w=0;function k(e){return function(){var n,t;for(n=0;n1?["CONCAT"].concat(e):e[0]}function T(){var e=C([f,t,E]);return null===e?null:[e[0],e[2]]}function L(){var e=C([f,t,h]);return null===e?null:[e[0],e[2]]}function I(){var e=C([p,c,m]);return null===e?null:e[1]}if(n=S("|"),t=S(":"),o=S("\\"),i=$(/^./),s=S("$"),a=$(/^\d+/),r=$(/^[^{}[\]$\\]/),d=$(/^[^{}[\]$\\|]/),k([_,$(/^[^{}[\]$\s]/)]),l=k([_,d]),u=k([_,r]),y=$(/^[ !"$&'()*,./0-9;=?@A-Z^_`a-z~\x80-\xFF+-]+/),b=function(e){return e.toString()},f=function(){var e=y();return null===e?null:b(e)},c=k([function(){var e=C([k([T,L]),x(0,B)]);return null===e?null:e[0].concat(e[1])},function(){var e=C([f,x(0,B)]);return null===e?null:[e[0]].concat(e[1])}]),p=S("{{"),m=S("}}"),g=k([I,E,function(){var e=x(1,u)();return null===e?null:e.join("")}]),h=k([I,E,function(){var e=x(1,l)();return null===e?null:e.join("")}]),null===(v=function(){var e=x(0,g)();return null===e?null:["CONCAT"].concat(e)}())||w!==e.length)throw new Error("Parse error at position "+w.toString()+" in input: "+e);return v}},e.extend(e.i18n.parser,new n)}(jQuery)},51399:()=>{!function(e){"use strict";var n=function(){this.messages={},this.sources={}};n.prototype={load:function(n,t){var o,i,s=null,a=[],r=this;if("string"==typeof n)return e.i18n.log("Loading messages from: "+n),(o=n,i=e.Deferred(),e.getJSON(o).done(i.resolve).fail((function(n,t,s){e.i18n.log("Error in loading messages from "+o+" Exception: "+s),i.resolve()})),i.promise()).done((function(e){r.set(t,e)})).promise();if(t)return r.set(t,n),e.Deferred().resolve();for(s in n)Object.prototype.hasOwnProperty.call(n,s)&&(t=s,a.push(r.load(n[s],t)));return e.when.apply(e,a)},set:function(n,t){this.messages[n]?this.messages[n]=e.extend(this.messages[n],t):this.messages[n]=t},get:function(e,n){return this.messages[e]&&this.messages[e][n]}},e.extend(e.i18n.messageStore,new n)}(jQuery)},52329:()=>{!function(e){"use strict";var n,t,o,i=Array.prototype.slice;(n=function(t){this.options=e.extend({},n.defaults,t),this.parser=this.options.parser,this.locale=this.options.locale,this.messageStore=this.options.messageStore,this.languages={}}).prototype={localize:function(n){var t,o,i,s,a,r;for(i=this.locale,s=0;i;){o=(t=i.split("-")).length;do{if(a=t.slice(0,o).join("-"),r=this.messageStore.get(a,n))return r;o--}while(o);if("en"===i)break;i=e.i18n.fallbacks[this.locale]&&e.i18n.fallbacks[this.locale][s]||this.options.fallbackLocale,e.i18n.log("Trying fallback locale for "+this.locale+": "+i+" ("+n+")"),s++}return""},destroy:function(){e.removeData(document,"i18n")},load:function(n,t){var o,i,s,a={};if(n||t||(n="i18n/"+e.i18n().locale+".json",t=e.i18n().locale),"string"==typeof n&&"json"!==n.split("?")[0].split(".").pop()){for(a[t]=n+"/"+t+".json",o=(e.i18n.fallbacks[t]||[]).concat(this.options.fallbackLocale),i=0;i{!function(e){e.idleTimer=function(n,t,o){o=e.extend({startImmediately:!0,idle:!1,enabled:!0,timeout:3e4,events:"mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove"},o),t=t||document;var i=function(n){"number"==typeof n&&(n=void 0);var s=e.data(n||t,"idleTimerObj");s.idle=!s.idle;var a=+new Date-s.olddate;if(s.olddate=+new Date,s.idle&&a{"use strict";function o(){return!!document.querySelector("body.pretext")}function i(e,n,t,i){var s=window.location.pathname;-1!==s.indexOf("?")&&(s=s.substring(0,s.lastIndexOf("?")));let a=o();var r={lastPageUrl:s,lastPageScrollLocation:Math.round($(window).scrollTop()),completionFlag:e,pageLoad:n,markingComplete:t,markingIncomplete:i,course:eBookConfig.course,isPtxBook:a};$(document).ajaxError((function(e,n,t,o){console.log("Request Failed for "+t.url),console.log(e)})),jQuery.ajax({url:`${eBookConfig.new_server_prefix}/logger/updatelastpage`,contentType:"application/json; charset=utf-8",dataType:"json",data:JSON.stringify(r),method:"POST",async:!0})}t.d(n,{w:()=>h}),t(67375),t(66495),t(52329),t(39161),t(46905),t(23836),t(51399),t(49276),t(35773),t(52754),t(3403),t(83057),$(document).on("runestone:login",(function(){var e;!function(){if(!window.location.href.match(/(\/index.html|toctree.html|genindex.html|navhelp.html|toc.html|assignments.html|Exercises.html)/)){var e=window.location.pathname;-1!==e.indexOf("?")&&(e=e.substring(0,e.lastIndexOf("?")));var n={lastPageUrl:e,isPtxBook:o()};jQuery.ajax({url:`${eBookConfig.new_server_prefix}/logger/getCompletionStatus`,data:n,async:!1}).done((function(e){if("None"!=e){var n,t;1==e.detail[0].completionStatus?(n="buttonConfirmCompletion",t=" Completed. Well Done!"):(n="buttonAskCompletion",t="Mark as Completed");let o=document.querySelector("#scprogresscontainer");o&&o.classList.add("ptx-runestone-container"),$("#scprogresscontainer").append('
    ")}}))}}(),void 0!==(e=$.getUrlVar("lastPosition"))&&($("body").append(''),$("html, body").animate({scrollTop:parseInt(e)},1e3)),function(){if(!window.location.href.match(/(index.html|genindex.html|navhelp.html|toc.html|assignments.html|Exercises.html|toctree.html)/)){var e,n=-$("#navLinkBgRight").outerWidth()-5;$("#completionButton").hasClass("buttonAskCompletion")?e=n+70:$("#completionButton").hasClass("buttonConfirmCompletion")&&(e=0);var t=$("#relations-next").css("right"),o=-(n+35);$("#navLinkBgRight").css("right",n).show();var s=!1;$(window).scroll((function(){$(window).scrollTop()+$(window).height()==$(document).height()?($("#navLinkBgRight").animate({right:e},200),$("#navLinkBgLeft").animate({left:"0px"},200),$("#completionButton").hasClass("buttonConfirmCompletion")&&$("#relations-next").animate({right:o},200),s=!0):s&&($("#navLinkBgRight").animate({right:n},200),$("#navLinkBgLeft").animate({left:"-65px"},200),$("#relations-next").animate({right:t}),s=!1)}));var a=0;i(a=$("#completionButton").hasClass("buttonAskCompletion")?0:1,!0,!1,!1),$("#completionButton").on("click",(function(){var s=!1,r=!1;$(this).hasClass("buttonAskCompletion")?($(this).removeClass("buttonAskCompletion").addClass("buttonConfirmCompletion").html(" Completed. Well Done!"),$("#navLinkBgRight").animate({right:0}),$("#relations-next").animate({right:o}),e=0,a=1,s=!0):$(this).hasClass("buttonConfirmCompletion")&&($(this).removeClass("buttonConfirmCompletion").addClass("buttonAskCompletion").html("Mark as Completed"),e=n+70,$("#navLinkBgRight").animate({right:e}),$("#relations-next").animate({right:t}),a=0,r=!0),i(a,!1,s,r)}))}}(),function(){if(-1!=window.location.href.toLowerCase().indexOf("toc.html")||-1!=window.location.href.toLowerCase().indexOf("index.html")||-1!=window.location.href.toLowerCase().indexOf("frontmatter")){o()||jQuery.get(`${eBookConfig.new_server_prefix}/logger/getAllCompletionStatus`,(function(e){var n;if("None"!=e){n=e.detail;var t=$("#main-content div li a");$.each(n,(function(e,n){for(var o=0;o- Completed this topic on '+n.endDate+"").children().first().hover((function(){$(this).next(".infoTextCompleted").show()}),(function(){$(this).next(".infoTextCompleted").hide()})):0==n.completionStatus&&$(t[o].parentElement).addClass("active").append('Last read this topic on '+n.endDate+"").children().first().hover((function(){$(this).next(".infoTextActive").show()}),(function(){$(this).next(".infoTextActive").hide()})))}))}}));var e={course:eBookConfig.course};jQuery.get(`${eBookConfig.new_server_prefix}/logger/getlastpage`,e,(function(e){var n;"None"!=e&&null!=(n=e.detail).lastPageChapter&&$("#continue-reading").show().html('
    ')}))}}()})),$.extend({getUrlVars:function(){for(var e,n=[],t=window.location.search.slice(window.location.search.indexOf("?")+1).split("&"),o=0;o{n.addEventListener("click",(function(){let t=n.getAttribute("data-knowl");e.logBookEvent({event:"knowl",act:"click",div_id:t})}))})),document.querySelectorAll("details.born-hidden-knowl").forEach((n=>{n.addEventListener("toggle",(function(){if(n.open){let t=n.id;e.logBookEvent({event:"knowl",act:"open",div_id:t})}}))})),document.querySelectorAll(".sagecell_evalButton").forEach((n=>{n.addEventListener("click",(function(){let t=n.closest(".ptx-sagecell"),o=t?t.querySelector(".sagecell_input"):null,i=(o&&o.textContent,t?t.id:null);i?e.logBookEvent({event:"sage",act:"run",div_id:i}):console.warn("Could not find container or div_id for sagecell button")}))})),"undefined"==typeof eBookConfig||eBookConfig.isInstructor||document.querySelectorAll(".commentary").forEach((e=>{e.style.display="none"}))}();let e=document.getElementById("primary-navbar-sticky-wrapper");e&&(e.style.overflow="visible")})),t(19695);var a=t(98098);class r extends s.A{constructor(){super(),this.initSplice()}initSplice(){window.addEventListener("message",(async e=>{var n,t,o=this.sendingIframe(e);if(console.log(`SpliceWrapper: received message subject: ${e.data.subject} from iframe: ${o?o.id:"unknown"}`),"SPLICE.reportScoreAndState"==e.data.subject)this.handleScoreAndState(e,o);else if("SPLICE.sendEvent"==e.data.subject)this.handleSpliceEvent(e,o);else if("SPLICE.getState"==e.data.subject)await this.handleGetState(e,o);else if("https://www.myopenmath.com"===e.origin&&"string"==typeof e.data&&-1!=e.data.indexOf("lti.ext.imathas.result")){let o=JSON.parse(e.data),i=(n=o.jwt.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),t=decodeURIComponent(window.atob(n).split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join("")),JSON.parse(t));console.log("Result received from frame "+o.frame_id+" with score "+i.score)}}))}getUniqueID(e,n){if(n){let e=n.closest("[data-component]");if(e)return e.id}let t=e.data.activity_id;return t||(n?t=n.src:(t="unknown",console.error("Could not find iframe that sent the SPLICE event"))),t}handleScoreAndState(e,n){console.log("Got SPLICE.reportScoreAndState"),console.log(e.data.activity_id),console.log(e.data.score),console.log(e.data.state);let t=this.getUniqueID(e,n);this.logBookEvent({event:e.data.subject,div_id:t,act:`score: ${e.data.score}`,score:e.data.score,percent:e.data.score,correct:1==e.data.score,answer:JSON.stringify(e.data.state)})}sendingIframe(e){for(const n of document.getElementsByTagName("iframe"))if(n.contentWindow===e.source)return n}async getSavedState(e){try{const n=await fetch("/ns/assessment/results",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({div_id:e,course:eBookConfig.course,event:"SPLICE.getState"})});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return await n.json()}catch(e){return console.error("Error fetching SPLICE state:",e),null}}async handleGetState(e,n){console.log("Got SPLICE.getState"),console.log(e.data.activity_id),console.log(e.data.state);let t=this.getUniqueID(e,n),o=(await this.getSavedState(t)).detail.answer;e.source.postMessage({message_id:e.data.message_id,subject:"SPLICE.getState.response",state:o},"*")}handleSpliceEvent(e,n){console.log("Got SPLICE.sendEvent"),console.log(e.data.activity_id),console.log(e.data.name);let t=this.getUniqueID(e,n);this.logBookEvent({event:e.data.subject,div_id:t,act:e.data.name||"unknown"})}checkLocalStorage(){}setLocalStorage(){}restoreAnswers(){}disableInteraction(){}}const d={activecode:()=>Promise.all([t.e(249),t.e(296),t.e(625),t.e(764),t.e(877)]).then(t.bind(t,73565)),ble:()=>t.e(817).then(t.bind(t,29817)),clickablearea:()=>Promise.all([t.e(529),t.e(198)]).then(t.bind(t,58529)),codelens:()=>Promise.all([t.e(764),t.e(412)]).then(t.bind(t,76412)),datafile:()=>t.e(580).then(t.bind(t,33580)),dragndrop:()=>Promise.all([t.e(759),t.e(621)]).then(t.bind(t,56759)),fillintheblank:()=>Promise.all([t.e(466),t.e(294)]).then(t.bind(t,64466)),groupsub:()=>Promise.all([t.e(28),t.e(616)]).then(t.bind(t,24616)),khanex:()=>t.e(340).then(t.bind(t,28340)),lp_build:()=>Promise.all([t.e(296),t.e(576)]).then(t.bind(t,77576)),matching:()=>Promise.all([t.e(566),t.e(737)]).then(t.bind(t,14566)),multiplechoice:()=>Promise.all([t.e(919),t.e(350)]).then(t.bind(t,9919)),hparsons:()=>Promise.all([t.e(249),t.e(207),t.e(486)]).then(t.bind(t,71182)),parsons:()=>t.e(39).then(t.bind(t,52420)),poll:()=>t.e(168).then(t.bind(t,11168)),quizly:()=>t.e(128).then(t.bind(t,34128)),reveal:()=>t.e(460).then(t.bind(t,67460)),selectquestion:()=>Promise.all([t.e(662),t.e(380)]).then(t.bind(t,10662)),shortanswer:()=>Promise.all([t.e(819),t.e(850)]).then(t.bind(t,48819)),showeval:()=>t.e(824).then(t.bind(t,8824)),simple_sensor:()=>t.e(126).then(t.bind(t,50126)),spreadsheet:()=>Promise.all([t.e(131),t.e(186)]).then(t.bind(t,97186)),tabbedStuff:()=>t.e(442).then(t.bind(t,76442)),timedAssessment:()=>Promise.all([t.e(249),t.e(296),t.e(625),t.e(764),t.e(877),t.e(466),t.e(759),t.e(919),t.e(566),t.e(662),t.e(529),t.e(819),t.e(420),t.e(268)]).then(t.bind(t,46424)),wavedrom:()=>Promise.all([t.e(770),t.e(640)]).then(t.bind(t,45640)),webwork:()=>t.e(680).then(t.bind(t,84680)),youtube:()=>t.e(915).then(t.bind(t,86915)),doenet:()=>Promise.resolve()},l={},u=10,c=[];let f=0;async function p(){if(0===c.length)return;if(Date.now()-fe.component_name)));const n=e.map((async e=>{try{return await d[e.component_name](),console.log(`Runestone component ${e.component_name} has been loaded`),e}catch(n){e.reject(n)}})),t=await Promise.all(n);try{t.forEach((function(e){e&&e.resolve()}))}catch(e){console.error(e)}}let m=new Promise((e=>$(document).on("runestone:pre-login-complete",e)));function g(){const e=new Set($("[data-component]").map(((e,n)=>$(n).attr("data-component"))).get());document.querySelector(".webwork-button")&&e.add("webwork");const n=[...e].map((e=>{let n;console.log(`Loading Runestone component: ${e}`);try{n=(d[e]||(()=>Promise.resolve()))()}catch(n){console.error(`Error loading ${e}:`,n)}return n.error=n=>console.error(`Error in ${e}:`,n),n}));Promise.all([m,...n]).then((function(){document.body.dataset.reactInUse||document.dispatchEvent(new CustomEvent("runestone:login-complete"))}))}async function h(e){if(l[e])return l[e];console.log(`Runestone component ${e} is being queued for import`);const n=function(e){let n=null,t=null;const o=new Promise(((e,o)=>{n=e,t=o})),i={component_name:e,resolve:n,reject:t};return c.push(i),window.setTimeout(p,u+1),o}(e);return l[e]=n,n}m.then((()=>{console.log("Runestone pre-login complete")})),$(document).ready(g);const v=document.currentScript.src;t.p=v.substring(0,v.lastIndexOf("/")+1),new r;const y={};y.runestone_import=h,y.runestone_auto_import=g,y.getSwitch=function(){const e=document.querySelector('.theme-switch input[type="checkbox"]'),n=localStorage.getItem("theme")?localStorage.getItem("theme"):null;n&&(document.documentElement.setAttribute("data-theme",n),"dark"===n&&(e.checked=!0))},y.switchTheme=function(){1==document.getElementById("checkbox").checked?(document.documentElement.setAttribute("data-theme","dark"),localStorage.setItem("theme","dark")):(document.documentElement.setAttribute("data-theme","light"),localStorage.setItem("theme","light"))},y.popupScratchAC=async function(){if(await h("activecode"),!eBookConfig.scratchDiv){window.ACFactory.createScratchActivecode();let e=eBookConfig.scratchDiv;window.componentMap[e]=ACFactory.createActiveCode($(`#${e}`)[0],eBookConfig.acDefaultLanguage),eBookConfig.isLoggedIn&&window.componentMap[e].enableSaveLoad()}setTimeout((()=>{window.ACFactory.toggleScratchActivecode()}),100)},y.renderOneComponent=a.yT,window.componentMap={},window.runestoneComponents=y},78673:(e,n,t)=>{"use strict";t.d(n,{A:()=>s});var o=t(83057),i=["parsonsMove","showeval","video","poll","view_toggle","dashboard","selectquestion","codelens","peer"];class s{constructor(e){this.component_ready_promise=new Promise((e=>this._component_ready_resolve_fn=e)),this.optional=!1,void 0===window.allComponents&&(window.allComponents=[]),window.allComponents.push(this),e&&(this.sid=e.sid,this.graderactive=e.graderactive,this.showfeedback=!0,e.timed&&(this.isTimed=!0),e.enforceDeadline&&(this.deadline=e.deadline),this.optional=this.parseBooleanAttribute(e.orig,"data-optional"),e.selector_id&&(this.selector_id=e.selector_id),void 0!==e.assessmentTaken?this.assessmentTaken=e.assessmentTaken:this.assessmentTaken=!0,void 0!==e.timedWrapper?this.timedWrapper=e.timedWrapper:location.href.indexOf("doAssignment")>=0?this.timedWrapper=$("h1#assignment_name").text():this.timedWrapper=null,$(e.orig).data("question_label")&&(this.question_label=$(e.orig).data("question_label")),this.is_toggle=e.is_toggle,this.is_select=e.is_select),this.mjelements=[];let n=this;if(this.mjReady=new Promise((function(e,t){n.mjresolver=e})),this.aQueue=new r,e&&void 0!==e.preamble){this.preamble=e.preamble;let n=document.createElement("div");n.classList.add("hidden-content"),n.classList.add("process-math"),n.innerHTML="\\("+this.preamble+"\\)",e.orig.appendChild(n),n.id="ltx_preamble",n.style.display="none",this.aQueue.preamble=n}this.jsonHeaders=new Headers({"Content-type":"application/json; charset=utf-8",Accept:"application/json"})}parseBooleanAttribute(e,n){const t=e.getAttribute(n);if(null===t)return!1;const o=t.toLowerCase();return"false"!==o&&"no"!==o}async logBookEvent(e){if(this.graderactive)return;let n;if(e.course_name=eBookConfig.course,e.clientLoginStatus=eBookConfig.isLoggedIn,e.timezoneoffset=(new Date).getTimezoneOffset()/60,this.selector_id&&(e.selector_id=this.selector_id),"number"==typeof this.percent&&(e.percent=this.percent),window.assignmentId&&(e.assignment_id=window.assignmentId),eBookConfig.isLoggedIn&&eBookConfig.useRunestoneServices&&eBookConfig.logLevel>0&&(n=this.postLogMessage(e)),!this.isTimed||eBookConfig.debug){let n=eBookConfig.isLoggedIn?"Save":"Not";console.log(`${n} logging event `+JSON.stringify(e))}return this.selector_id&&(e.div_id=this.selector_id.replace("-toggleSelectedQuestion",""),e.event="selectquestion",e.act="interaction",this.postLogMessage(e)),"function"==typeof o.X.updateProgress&&"edit"!=e.act&&0==this.optional&&o.X.updateProgress(e.div_id),-1===i.indexOf(e.event)&&this.decorateStatus(),n}async postLogMessage(e){var n;let t=new Request(`${eBookConfig.new_server_prefix}/logger/bookevent`,{method:"POST",headers:this.jsonHeaders,body:JSON.stringify(e)});try{var o=await fetch(t);if(!o.ok){if(422===o.status)throw n=await o.json(),console.log(JSON.stringify(n.detail,null,4)),new Error("Unprocessable Request");if(401==o.status)throw n=await o.json(),console.log(`Missing authentication token ${n.detail}`),new Error("Missing authentication token");throw new Error(`Failed to save the log entry\n Status: ${o.status}`)}let e=(n=await o.json()).detail,i=null;if(this.selector_id){let e=this.selector_id.replace("-toggleSelectedQuestion","");i=document.getElementById(`${e}_score`)}else i=document.getElementById(`${this.divid}_score`);i&&!this.isTimed&&e.score&&this.updateScores(i,e)}catch(e){let t="none";n&&n.detail&&(t=n.detail),eBookConfig.useRunestoneServices&&alert(`Error: Your action was not saved!\n The error was ${e}\n Status Code: ${o.status}\n Detail: ${JSON.stringify(t,null,4)}.\n Please report this error!`),console.log(`Error: ${e} Detail: ${t} Status Code: ${o.status}`)}return n}updateScores(e,n){if(!n.assigned||null===n.score)return void(document.getElementById(`${this.divid}_message`).innerHTML="Score not updated. Submissions are closed.");let t=e.getElementsByClassName("qscore")[0];t&&(t.innerHTML=n.score.toFixed(1));let o=document.getElementsByClassName("qscore"),i=document.getElementsByClassName("qmaxscore"),s=0,a=0;for(let e=0;e0){let t=new Request(`${eBookConfig.new_server_prefix}/logger/runlog`,{method:"POST",headers:this.jsonHeaders,body:JSON.stringify(e)}),o=await fetch(t);o.ok?n=await o.json():(n=await o.json(),eBookConfig.useRunestoneServices?alert(`Failed to save your code\n Status is ${o.status}\n Detail: ${JSON.stringify(n.detail,null,4)}`):console.log(`Did not save the code.\n Status: ${o.status}\n Detail: ${JSON.stringify(n.detail,null,4)}`))}return this.isTimed&&!eBookConfig.debug||console.log("running "+JSON.stringify(e)),"function"==typeof o.X.updateProgress&&0==this.optional&&o.X.updateProgress(e.div_id),n}}async checkServer(e,n=!1){let t=this;if(this.checkServerComplete=new Promise((function(e,n){t.csresolver=e})),eBookConfig.isLoggedIn&&(this.useRunestoneServices||this.graderactive)){let n={};if(n.div_id=this.divid,n.course=eBookConfig.course,n.event=e,this.graderactive&&this.deadline&&(n.deadline=this.deadline,n.rawdeadline=this.rawdeadline,n.tzoff=this.tzoff),this.sid&&(n.sid=this.sid),n.div_id&&n.course&&n.event||console.log(`A required field is missing data ${n.div_id}:${n.course}:${n.event}`),eBookConfig.practice_mode||eBookConfig.peer||!this.assessmentTaken)this.loadData({}),console.log("resolving checkServer no answer given"),this.csresolver("not taken");else{let e=new Request(`${eBookConfig.new_server_prefix}/assessment/results`,{method:"POST",body:JSON.stringify(n),headers:this.jsonHeaders});try{let t=await fetch(e);console.log(`Response from server: ${t.status}`),t.ok?(n=await t.json(),n=n.detail,console.log(`Data from server: ${JSON.stringify(n)} calling repopulateFromStorage`),this.repopulateFromStorage(n),this.attempted=!0,void 0!==n.correct?this.correct=n.correct:this.correct=null,console.log("resolving checkServer with server data"),this.csresolver("server")):(console.log(`HTTP Error getting results: ${t.statusText}`),this.checkLocalStorage(),console.log("resolving checkServer with local data"),this.csresolver("local"))}catch(e){console.log(`Error getting results: ${e}`);try{this.checkLocalStorage()}catch(e){console.log(e)}}}}else this.checkLocalStorage(),console.log("resolving checkServer with local data"),this.csresolver("local");n&&this.indicate_component_ready()}indicate_component_ready(){this.containerDiv.classList.add("runestone-component-ready"),this._component_ready_resolve_fn()}loadData(e){return null}repopulateFromStorage(e){null!==e&&"no data"!==e&&this.shouldUseServer(e)?(this.restoreAnswers(e),this.setLocalStorage(e)):this.checkLocalStorage(),this.decorateStatus()}shouldUseServer(e){if("T"===e.correct||!0===e.correct||0===localStorage.length||!0===this.graderactive||this.isTimed)return!0;let n,t=localStorage.getItem(this.localStorageKey());if(null===t)return!0;try{n=JSON.parse(t)}catch(e){return console.log(e.message),localStorage.removeItem(this.localStorageKey()),!0}if(e.answer==n.answer)return!0;let o=new Date(n.timestamp);return new Date(e.timestamp)>=o}localStorageKey(){return eBookConfig.email+":"+eBookConfig.course+":"+this.divid+"-given"}addCaption(e){if(!this.isTimed){var n=document.createElement("p");this.question_label?(this.caption=eBookConfig.useRunestoneServices?`Activity: ${this.question_label} ${this.caption} (${this.divid})`:`Activity: ${this.question_label} ${this.caption}`,$(n).html(this.caption),$(n).addClass(`${e}_caption`)):($(n).html(eBookConfig.useRunestoneServices?this.caption+" ("+this.divid+")":this.caption),$(n).addClass(`${e}_caption`),$(n).addClass(`${e}_caption_text`)),this.capDiv=n,this.containerDiv.appendChild(n)}}hasUserActivity(){return this.isAnswered}checkCurrentAnswer(){console.log("Each component should provide an implementation of checkCurrentAnswer")}async logCurrentAnswer(){console.log("Each component should provide an implementation of logCurrentAnswer")}renderFeedback(){console.log("Each component should provide an implementation of renderFeedback")}disableInteraction(){console.log("Each component should provide an implementation of disableInteraction")}toString(){return`${this.constructor.name}: ${this.divid}`}queueMathJax(e){return"undefined"==typeof MathJax?(console.log("Error -- MathJax is not loaded"),Promise.resolve(null)):MathJax.typesetPromise?void 0!==window.runestoneMathReady?window.runestoneMathReady.then((()=>this.mjresolver(this.aQueue.enqueue(e)))):this.mjresolver(this.aQueue.enqueue(e)):(console.log(`Waiting on MathJax!! ${MathJax.typesetPromise}`),setTimeout((()=>this.queueMathJax(e)),200),console.log(`Returning mjready promise: ${this.mjReady}`),this.mjReady)}decorateStatus(){if(this.isTimed||eBookConfig.peer)return;let e=$(this.containerDiv).closest("div.runestone")[0];if(!e)return;e.classList.remove("notAnswered"),e.classList.remove("isInCorrect"),e.classList.remove("isCorrect");let n=localStorage.getItem(`currentAssignmentInfo_${eBookConfig.course}`),t=[];n&&(t=JSON.parse(n).questions),t.indexOf(this.divid)>=0&&e.classList.add("isAssigned"),this.correct?e.classList.add("isCorrect"):null===this.correct||void 0===this.correct?e.classList.add("notAnswered"):e.classList.add("isInCorrect")}}class a{constructor(){this._items=[]}enqueue(e){this._items.push(e)}dequeue(){return this._items.shift()}get size(){return this._items.length}}class r extends a{constructor(){super(),this._pendingPromise=!1}enqueue(e){return new Promise(((n,t)=>{super.enqueue({component:e,resolve:n,reject:t}),this.dequeue()}))}async dequeue(){if(this._pendingPromise)return!1;let e=super.dequeue();if(!e)return!1;let n=this;try{this._pendingPromise=!0;let t=await window.runestoneMathReady.then((async function(){if(console.log(`MathJax Ready -- dequeing a typesetting run for ${e.component.id} ${n.preamble?.innerHTML}`),n.preamble){await MathJax.typesetPromise([n.preamble]);let t=document.createElement("div");return t.innerHTML=n.preamble.innerHTML,e.component.insertAdjacentElement("afterbegin",t),console.log(`MathJax typeset the preamble for ${e.component.id}`),await MathJax.typesetPromise([e.component])}return await MathJax.typesetPromise([e.component])}));this._pendingPromise=!1,e.resolve(t)}catch(n){this._pendingPromise=!1,e.reject(n)}finally{this.dequeue()}return!0}}window.RunestoneBase=s},83057:(e,n,t)=>{"use strict";t.d(n,{X:()=>s,u:()=>d});var o=new(t(78673).A);class i{constructor(e){if(this.possible=0,this.total=1,e&&"assignment_spec"in e&&(this.assignment_spec=e.assignment_spec,delete e.assignment_spec),e&&Object.keys(e).length>0)this.activities=e;else{let e={page:0};document.querySelectorAll(".runestone").forEach((function(n){e[n.firstElementChild.id]=0})),this.activities=e}if(this.calculateProgress(),window.location.pathname.match(/.*\/(index.html|toctree.html|Exercises.html|search.html)$/i)){const e=document.getElementById("scprogresscontainer");e&&(e.style.display="none")}this.renderProgress()}calculateProgress(){for(let e in this.activities)void 0!==e&&(this.possible++,this.activities[e]>0&&this.total++)}renderProgress(){let e=0;const n=document.getElementById("scprogresstotal");n&&(n.textContent=this.total);const t=document.getElementById("scprogressposs");t&&(t.textContent=this.possible);try{e=100*this.total/this.possible}catch(n){e=0}let o=document.getElementById("subchapterprogress");if(o&&"PROGRESS"!==o.tagName){const n=document.createElement("progress");n.id="subchapterprogress",n.max=100,n.value=e,n.className=o.className,o.replaceWith(n),o=n}else o&&(o.max=100,o.value=e);if(this.assignment_spec){let e=this.total,n=this.assignment_spec.activities_required||1;null===this.assignment_spec.activities_required&&(this.assignment_spec.activities_required=this.possible),e>=n&&this.sendCompletedReadingScore().then((()=>{console.log("Reading score sent for page"),setTimeout((()=>{let e=document.getElementById("completionButton");e&&"mark as completed"===e.textContent.toLowerCase()&&e.click()}),500)}))}if(!eBookConfig.isLoggedIn){const e=document.getElementById("subchapterprogress");e&&e.classList.add("loggedout")}}updateProgress(e){if(this.activities[e]++,1===this.activities[e]){this.total++;let e=100*this.total/this.possible;const n=document.getElementById("scprogresstotal");n&&(n.textContent=this.total);const t=document.getElementById("scprogressposs");t&&(t.textContent=this.possible);let o=document.getElementById("subchapterprogress");if(o&&"PROGRESS"===o.tagName&&(o.value=e),this.assignment_spec&&null!==this.assignment_spec.activities_required&&this.total>=this.assignment_spec.activities_required&&(console.log("Required activities completed"),this.sendCompletedReadingScore().then((()=>{console.log("Reading score sent")}))),100==e&&function(){const e=document.getElementById("completionButton");return e&&e.textContent&&"mark as completed"===e.textContent.toLowerCase()}()){const e=document.getElementById("completionButton");e&&"function"==typeof e.click&&e.click()}}}async sendCompletedReadingScore(){let e=new Headers({"Content-type":"application/json; charset=utf-8",Accept:"application/json"}),n={...this.assignment_spec},t=new Request(`${eBookConfig.new_server_prefix}/logger/update_reading_score`,{method:"POST",body:JSON.stringify(n),headers:e});try{let e=await fetch(t);e.ok||console.error(`Failed to send reading score! ${e.statusText}`),n=await e.json()}catch(e){console.error(`Error sending reading score ${e}`)}}}var s={};let a=-1;function r(e,n,t,o=!1){const i=document.createElement("div");i.className=`studyclues-message ${n}`,o?i.innerHTML=t:i.textContent=t,e.appendChild(i),e.scrollTop=e.scrollHeight}function d(e){return"string"==typeof e&&([/\$\$[\s\S]+?\$\$/,/\$[^$\n]+?\$/,/\\\[[\s\S]+?\\\]/,/\\\([\s\S]+?\\\)/].some((n=>n.test(e)))||/\\(frac|sqrt|sum|prod|int|lim|sin|cos|tan|log|ln|alpha|beta|gamma|pi|theta|sigma|Delta|cdot|times|leq|geq|neq)\b/.test(e)||/[a-zA-Z0-9]\s*[\^_]\s*\{?.+?\}?/.test(e))}document.addEventListener("runestone:login",(function(){const e=document.getElementById("profilelink");e&&e.style.removeProperty("display");const n=document.getElementById("passwordlink");n&&n.style.removeProperty("display");const t=document.getElementById("registerlink");t&&(t.style.display="none"),document.querySelectorAll("li.loginout").forEach((e=>{e.innerHTML='Log Out'}))})),document.addEventListener("runestone:logout",(function(){if(eBookConfig.useRunestoneServices){console.log("setup navbar for logged out");const e=document.getElementById("registerlink");e&&e.style.removeProperty("display");const n=document.getElementById("profilelink");n&&(n.style.display="none");const t=document.getElementById("passwordlink");t&&(t.style.display="none");const o=document.getElementById("ip_dropdown_link");o&&(o.style.display="none");const i=document.getElementById("inst_peer_link");i&&(i.style.display="none"),document.querySelectorAll("li.loginout").forEach((e=>{e.innerHTML='Login'})),document.querySelectorAll(".footer").forEach((e=>{e.innerHTML="user not logged in"}))}})),document.addEventListener("DOMContentLoaded",(function(){eBookConfig?(async function(){var e;if(eBookConfig.useRunestoneServices){let e=new Headers({"Content-type":"application/json; charset=utf-8",Accept:"application/json"}),t={timezoneoffset:(new Date).getTimezoneOffset()/60,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone},o=function(){const e=`; ${document.cookie}`.split("; RS_info=");if(2===e.length)return e.pop().split(";").shift()}();var n=!1;if(o)try{let e=o.replace(/\\054/g,","),i=JSON.parse(decodeURIComponent(e));i=JSON.parse(decodeURIComponent(i)),i.timezone===t.timezone&&i.tz_offset===t.timezoneoffset&&(console.log("Timezone cookie matches, not sending timezone to server"),n=!0)}catch(e){console.error("Error parsing RS_info cookie, sending timezone to server")}if(!1===n){let n=new Request(`${eBookConfig.new_server_prefix}/logger/set_tz_offset`,{method:"POST",body:JSON.stringify(t),headers:e});try{let e=await fetch(n);e.ok||console.error(`Failed to set timezone! ${e.statusText}`),t=await e.json()}catch(e){console.error(`Error setting timezone ${e}`)}}}if(console.log(`This page served by ${eBookConfig.served_by}`),eBookConfig.isLoggedIn){if(e=`username: ${eBookConfig.username}`,!eBookConfig.isInstructor){const e=document.getElementById("ip_dropdown_link");e&&"function"==typeof e.remove&&e.remove();const n=document.getElementById("inst_peer_link");n&&"function"==typeof n.remove&&n.remove()}document.dispatchEvent(new Event("runestone:login")),function(){let e=localStorage.getItem(`currentAssignmentInfo_${eBookConfig.course}`);if(e&&eBookConfig.readings){var n,t,o,i,s,a,r,d,l,u,c=JSON.parse(e);let m=c.id,g=c.name,h=c.readingNames;(o=document.createElement("div")).textContent="Active assignment: ",(i=document.createElement("a")).textContent=g,i.href=`/assignment/student/doAssignment?assignment_id=${m}`,o.append(i),(s=document.createElement("a")).textContent=" Exit Assignment",s.href=window.location.pathname,s.addEventListener("click",(function(e){localStorage.removeItem(`currentAssignmentInfo_${eBookConfig.course}`)}));let v=window.location.pathname.split("/"),y=v[v.length-2]+"/"+v[v.length-1],b=!1,w=2;document.getElementsByTagName("body")[0].classList.contains("pretext")&&(b=!0,eBookConfig.readings=eBookConfig.readings.map((e=>e.split("/").pop())),y=y.split("/").pop(),w=1);let k=eBookConfig.readings.indexOf(y),C=eBookConfig.readings.length;if(k>0){d=eBookConfig.readings[k-1],(l=v.slice(0,v.length-w)).push(d),u=l.join("/"),a=o.cloneNode(!0);let e=document.createElement("p");e.textContent=`Page ${k+1} of ${C}, `;var f=document.createElement("a");f.href=u,f.textContent=`Back to page ${k} of ${C}: ${h[k-1]}.`,e.append(f),a.append(e)}else if(0==k){a=o.cloneNode(!0);let e=document.createElement("p");e.textContent=`Page 1 of ${C}.`,a.append(e)}else{let e=!1,n=Object.keys(componentMap);0==n.length&&(n=document.querySelectorAll("[data-component]"),n=Array.from(n).map((function(e){return e.id})));for(let t of n)if(c.questions.includes(t)){e=!0;break}d=eBookConfig.readings[0],(l=v.slice(0,v.length-w)).push(d),u=l.join("/"),a=o.cloneNode(!0);let t=document.createElement("p");t.textContent=e?"This page has activities assigned to the current assignment.":"Notice: this page is not part of the assignment.",t.append(s),a.append(t)}if(k==eBookConfig.readings.length-1){r=o;let e=document.createElement("p");e.textContent=`Page ${C} of ${C}: ${h[k]}`,r.append(e)}else if(k>=0){d=eBookConfig.readings[k+1],(l=v.slice(0,v.length-w)).push(d),u=l.join("/"),r=o;var p=document.createElement("a");p.href=u,p.textContent=`Continue to page ${k+2} of ${C}: ${h[k+1]}`;let e=document.createElement("p");e.append(p),r.append(e)}else{r=o.cloneNode(!0);let e=document.createElement("p");e.textContent="Notice: this page is not part of the assignment. To remove this warning click ";let n=s.cloneNode(!0);n.addEventListener("click",(function(e){localStorage.removeItem(`currentAssignmentInfo_${eBookConfig.course}`)})),e.append(n),r.append(e)}if((n=document.createElement("div")).className="ptx-runestone-container",a.className="runestone assignment-nav top-assignment-nav",n.append(a),(t=document.createElement("div")).className="ptx-runestone-container",r.className="runestone assignment-nav bottom-assignment-nav",t.append(r),b){let e=document.getElementById("ptx-content");e&&e.insertBefore(n,e.firstChild);let o=document.getElementById("scprogresscontainer");return void(o&&(o.style.marginBottom="20px",o.appendChild(t)))}const x=document.getElementById("main-content");x&&r&&(x.insertBefore(n,x.firstChild),x.appendChild(t))}}(),function(){if(!location.pathname.includes("/ns/books/"))return!1;const e=window.location.hostname;return"localhost"===e?["csawesome2","py4e-int","thinkcspy","httlacs","PTXSB","cppds2"].includes(eBookConfig.basecourse):"runestone.academy"===e&&["SI201-W26-MW","SI201-W26-TTh","DukeCS101SP26","mcd-csa-schoology","mcd-csa-canvas","csawesome2-MOOC","test_py4e-int_api","bc_cppds_s26","Test-py4e-int","virginiatech_py4e-int_spring26"].includes(eBookConfig.course)}()&&function(){if(document.getElementById("studyclues-fab"))return;const e=document.createElement("style");e.textContent='\n #studyclues-fab {\n position: fixed;\n right: 24px;\n bottom: 24px;\n z-index: 9999;\n border: none;\n border-radius: 9999px;\n padding: 12px 18px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n color: #fff;\n background: #2563eb;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n }\n\n #studyclues-chat {\n position: fixed;\n right: 24px;\n bottom: 78px;\n z-index: 9999;\n width: min(420px, calc(100vw - 32px));\n height: min(520px, calc(100vh - 120px));\n background: #fff;\n border: 1px solid #d1d5db;\n border-radius: 12px;\n box-shadow: 0 14px 36px rgba(0, 0, 0, 0.25);\n display: none;\n flex-direction: column;\n overflow: hidden;\n }\n\n #studyclues-chat.open {\n display: flex;\n }\n\n .studyclues-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid #e5e7eb;\n font-weight: 600;\n background: #f9fafb;\n }\n\n .studyclues-close {\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n }\n\n .studyclues-coach-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n }\n\n .studyclues-coach-toggle input[type="checkbox"] {\n appearance: none;\n -webkit-appearance: none;\n width: 32px;\n height: 18px;\n border-radius: 9999px;\n background: #d1d5db;\n cursor: pointer;\n position: relative;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n\n .studyclues-coach-toggle input[type="checkbox"]::after {\n content: "";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: #fff;\n transition: transform 0.2s;\n }\n\n .studyclues-coach-toggle input[type="checkbox"]:checked {\n background: #2563eb;\n }\n\n .studyclues-coach-toggle input[type="checkbox"]:checked::after {\n transform: translateX(14px);\n }\n\n .studyclues-messages {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n background: #f8fafc;\n }\n\n .studyclues-message {\n max-width: 85%;\n padding: 10px 12px;\n border-radius: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 14px;\n line-height: 1.4;\n }\n\n .studyclues-message.user {\n margin-left: auto;\n background: #dbeafe;\n border: 1px solid #bfdbfe;\n }\n\n .studyclues-message.assistant {\n margin-right: auto;\n background: #fff;\n border: 1px solid #e5e7eb;\n }\n\n .studyclues-message.studyclues-loading {\n color: #6b7280;\n font-style: italic;\n }\n\n .studyclues-spinner {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n\n .studyclues-spinner-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6b7280;\n opacity: 0.35;\n animation: studyclues-dot-pulse 1s infinite ease-in-out;\n }\n\n .studyclues-spinner-dot:nth-child(2) {\n animation-delay: 0.15s;\n }\n\n .studyclues-spinner-dot:nth-child(3) {\n animation-delay: 0.3s;\n }\n\n @keyframes studyclues-dot-pulse {\n 0%,\n 80%,\n 100% {\n opacity: 0.35;\n transform: scale(1);\n }\n 40% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n\n .studyclues-inputbar {\n display: flex;\n gap: 8px;\n padding: 10px;\n border-top: 1px solid #e5e7eb;\n background: #fff;\n }\n\n .studyclues-inputbar input {\n flex: 1;\n min-width: 0;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 14px;\n }\n\n .studyclues-inputbar button {\n border: none;\n border-radius: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: #fff;\n background: #2563eb;\n font-weight: 600;\n }\n ',document.head.appendChild(e);const n=document.createElement("button");n.id="studyclues-fab",n.textContent="StudyClues Chat";const t=document.createElement("div");t.id="studyclues-chat",t.innerHTML='\n
    \n StudyClues\n \n \n
    \n
    \n
    \n \n \n
    \n ',document.body.appendChild(n),document.body.appendChild(t);const i=t.querySelector(".studyclues-close"),s=t.querySelector(".studyclues-messages"),d=t.querySelector(".studyclues-inputbar input"),l=t.querySelector(".studyclues-inputbar button"),u=t.querySelector("#studyclues-coach-mode");let c=u.checked;u.addEventListener("change",(()=>{c=u.checked}));const f=()=>{t.classList.toggle("open"),t.classList.contains("open")&&d.focus()},p=async()=>{let e=d.value.trim();if(!e)return;var n="this page";if(document.querySelector("body.pretext")){let e=document.querySelector("section.section"),t=e.querySelector("span.title").innerText;n=`${e.querySelector("span.codenumber").innerText} ${t}`}else{let e=document.querySelector("span.section-number");e&&(n=e.parentElement.innerText.trim())}-1===a&&(e=`Regarding section "${n}": ${e}`),o.logBookEvent({event:"studyclues_query",act:`query: ${e}`,div_id:`${n}`}),r(s,"user",e),d.value="",l.disabled=!0;const t=document.createElement("div");t.className="studyclues-message assistant studyclues-loading",t.innerHTML='Thinking ',s.appendChild(t),s.scrollTop=s.scrollHeight;try{const n=await fetch("/assignment/student/studyclues_query",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({query:e,conversation_id:a,coachMode:c})});if(!n.ok)throw new Error(`Request failed with status ${n.status}`);const t=await n.json(),o=t?.detail||{},i=o?.response||{},d=i?.llm_response,l=i?.references||{};"number"==typeof o.conversation_id&&(a=o.conversation_id);const u=(d||"No response available from StudyClues.").replace(/\[([^\]]+)\]\(([^)]+)\)/g,((e,n,t)=>{const o=l[t]?.content_url;return o?`(${n})`:e}));r(s,"assistant",u,!0)}catch(e){r(s,"assistant","Sorry, StudyClues is unavailable right now. Please try again."),console.error("StudyClues chat error:",e)}finally{t.remove(),l.disabled=!1,d.focus()}};n.addEventListener("click",f),i.addEventListener("click",f),l.addEventListener("click",p),d.addEventListener("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),p())}))}(),-1==window.location.pathname.indexOf("/admin/grading")&&-1==window.location.pathname.indexOf("/peer/")&&function(){let e;function n(){location.href.indexOf("index.html")<0&&(console.log("Idle timer - "+location.pathname),location.href=eBookConfig.app+"/default/user/login?_next="+location.pathname+location.search)}function t(){e&&clearTimeout(e),e=setTimeout(n,9e5)}["mousemove","keydown","scroll","click","touchstart","wheel"].forEach((e=>{window.addEventListener(e,t,{passive:!0})})),t()}()}else{e="Not logged in",document.dispatchEvent(new Event("runestone:logout"));let n=document.getElementById("browsing_warning");n&&(n.innerHTML="");let t=document.getElementById("ad_warning");t&&(t.innerHTML="")}document.querySelectorAll(".loggedinuser").forEach((n=>{n.innerHTML=e})),s=new i(eBookConfig.activities),console.log("triggering runestone:pre-login-complete"),document.dispatchEvent(new Event("runestone:pre-login-complete"))}(),function(){if("undefined"!=typeof showAd&&showAd){let e=Math.floor(2*Math.random())+1,n=document.getElementById(`adcopy_${e}`),t=document.querySelectorAll(".runestone");t.length>0&&(t[Math.floor(Math.random()*t.length)].after(n),n.style.display="block")}}()):"undefined"==typeof eBookConfig&&console.log("eBookConfig is not defined. This page must not be set up for Runestone")})),window.addEventListener("load",(function(){if(document.querySelectorAll(".video-play-overlay").forEach((function(e){e.style.backgroundImage="url('{{pathto('_static/play_overlay_icon.png', 1)}}')"})),document.querySelectorAll(".dropdown input, .dropdown label").forEach((function(e){e.addEventListener("click",(function(e){e.stopPropagation()}))})),location.href.includes("mode=browsing")){let e="?mode=browsing";document.querySelectorAll("a").forEach((n=>{let t="";if(n.href.includes("books/published")&&!n.href.includes("?mode=browsing")){if(n.href.includes("#")){let e=n.href.indexOf("#");t=n.href.substring(e),n.href=n.href.substring(0,e)}n.href=n.href.includes("?")?n.href+e.replace("?","&")+t:n.href+e+t}}))}}))},98098:(e,n,t)=>{"use strict";t.d(n,{$y:()=>s,JK:()=>i,yT:()=>a});var o=t(77394);async function i(e,n,t){if(!e)return void jQuery(`#${n}`).html("

    Sorry, no source is available for preview.

    ");e=e.replace(/..\/_images/g,`${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`),jQuery(`#${n}`).html(e),void 0===window.componentMap&&(window.componentMap={});let i=$($(`#${n} [data-component]`)[0]).data("component");await(0,o.w)(i);let s={};if(s.orig=jQuery(`#${n} [data-component]`)[0],s.orig&&(s.lang=$(s.orig).data("lang"),s.useRunestoneServices=!0,s.graderactive=!1,s.python3=!0,void 0!==t))for(let e in t)s[e]=t[e];if("undefined"==typeof component_factory)alert("Error: Missing the component factory!");else if(window.component_factory[i]||jQuery(`#${n}`).html()){let e=window.component_factory[i](s);"activecode"===i&&(t.multiGrader?window.componentMap[`${t.gradingContainer} ${e.divid}`]=e:window.componentMap[e.divid]=e)}else jQuery(`#${n}`).html(`

    Preview not available for ${i}

    `)}function s(e,n){e=e.replace(/..\/_images/g,`${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`);let t,o,i=$($(e).find("[data-component]")[0]).data("component"),s=$(e).find("[data-component]").first().attr("id");document.getElementById(s)||(t=$("
    ",{css:{display:"none"}}).appendTo("body"),t.html(e));let a={orig:document.getElementById(s),timed:!0};if(void 0!==n)for(let e in n)a[e]=n[e];i in window.component_factory&&(o=window.component_factory[i](a));let r={};return r.question=o,r}async function a(e){let n=e.querySelector("[data-component]");if(null==n)return void console.log("Render was called for a component, but now [data-component] attribute is present. This may mean the component has already been rendered.");let t=n.dataset.component;if(await(0,o.w)(t),0==$(this).closest("[data-component=timedAssessment]").length)try{let e=n.id;window.componentMap[e]=window.component_factory[t]({orig:n,useRunestoneServices:eBookConfig.useRunestoneServices})}catch(e){console.log(`Error rendering ${t} Problem ${this.id}\n Details: ${e}`)}}}},e=>{e.O(0,[723],(()=>e(e.s=77394))),e.O()}]); +//# sourceMappingURL=prefix-runestone.bbf2283c5c1d4f99.bundle.js.map \ No newline at end of file diff --git a/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt new file mode 100755 index 0000000..59c1156 --- /dev/null +++ b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt @@ -0,0 +1,83 @@ +/*! + * BIDI embedding support for jQuery.i18n + * + * Copyright (C) 2015, David Chan + * + * This code is dual licensed GPLv2 or later and MIT. You don't have to do + * anything special to choose one license or the other and you don't have to + * notify anyone which license you are using. You are free to use this code + * in commercial projects as long as the copyright header is left intact. + * See files GPL-LICENSE and MIT-LICENSE for details. + * + * @licence GNU General Public Licence 2.0 or later + * @licence MIT License + */ + +/*! + * jQuery Internationalization library + * + * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar + * + * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do + * anything special to choose one license or the other and you don't have to + * notify anyone which license you are using. You are free to use + * UniversalLanguageSelector in commercial projects as long as the copyright + * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details. + * + * @licence GNU General Public Licence 2.0 or later + * @licence MIT License + */ + +/*! + * jQuery Internationalization library + * + * Copyright (C) 2012 Santhosh Thottingal + * + * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do + * anything special to choose one license or the other and you don't have to + * notify anyone which license you are using. You are free to use + * UniversalLanguageSelector in commercial projects as long as the copyright + * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details. + * + * @licence GNU General Public Licence 2.0 or later + * @licence MIT License + */ + +/*! + * jQuery Internationalization library + * + * Copyright (C) 2012 Santhosh Thottingal + * + * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to + * choose one license or the other and you don't have to notify anyone which license you are using. + * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright + * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details. + * + * @licence GNU General Public Licence 2.0 or later + * @licence MIT License + */ + +/*! + * jQuery Internationalization library - Message Store + * + * Copyright (C) 2012 Santhosh Thottingal + * + * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to + * choose one license or the other and you don't have to notify anyone which license you are using. + * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright + * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details. + * + * @licence GNU General Public Licence 2.0 or later + * @licence MIT License + */ + +/*! + * jQuery idleTimer plugin + * version 0.9.100511 + * by Paul Irish. + * http://github.com/paulirish/yui-misc/tree/ + * MIT license + + * adapted from YUI idle timer by nzakas: + * http://github.com/nzakas/yui-misc/ +*/ diff --git a/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt.gz new file mode 100755 index 0000000000000000000000000000000000000000..1cba0ad86ee6a2a5f0a83fa7909952deab32a060 GIT binary patch literal 594 zcmV-Y0(n-gCEG=SHd9e2FoZfr0^38zvvd~e z(4WMa2zV@NG+=a2Hc$bR z`{`~3ENw872ebv;Ws3wJT@8h^?;|MO5k$u`kwV)<)!M2k*Q~@VxpFQLI7cHJPKQdi=YTeXa5)a1`Ep7RByCvVcs=V7! z9s^(i*`?e)@*hVGR^W_g3fsGUWl zpW7SGYUR;4FQG8(^W_uF(MIKhVhmi2oF@s)2i~4P;&i z)dmTmVyv#ywA4}6tAuk(D=yJekv6sNZ*|Di$T_D{FIM)irPqE}3alc7v-WNakISqz g1F?0(-Rv_yVYq&&Q@8xPO^*-v3quY3QlSd~02y!^00000 literal 0 HcmV?d00001 diff --git a/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.gz b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.gz new file mode 100755 index 0000000000000000000000000000000000000000..ed91549042630aedb66073858238d66a30d415f4 GIT binary patch literal 25114 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 ST(h@_;5o?4RM)ZfRNVAL(#& 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 li > a.internal, > ul, > li > ul\");\n\n // Iterate everything in order.\n $items.each(function (index, item) {\n var $item = $(item),\n tag = item.tagName.toLowerCase(),\n $childrenLi = $item.children('li'),\n $parentLi = $($item.parent('li'), $item.parent().parent('li'));\n\n // Add dropdowns if more children and above minimum level.\n if (tag === 'ul' && level >= minLevel && $childrenLi.length > 0) {\n $parentLi\n .addClass('dropdown-submenu')\n .children('a').first().attr('tabindex', -1);\n\n $item.addClass('dropdown-menu');\n }\n\n findA($item, level + 1);\n });\n };\n\n findA($ul);\n };\n\n /**\n * Patch all tables to remove ``docutils`` class and add Bootstrap base\n * ``table`` class.\n */\n patchTables = function () {\n $(\"table.docutils\")\n .removeClass(\"docutils\")\n .addClass(\"table\")\n .attr(\"border\", 0);\n };\n\n$(function () {\n\n /*\n * Scroll the window to avoid the topnav bar\n * https://github.com/twitter/bootstrap/issues/1768\n */\n if ($(\"#navbar.navbar-fixed-top\").length > 0) {\n var navHeight = $(\"#navbar\").height(),\n shiftWindow = function() { scrollBy(0, -navHeight - 10); };\n\n if (location.hash) {\n shiftWindow();\n }\n\n window.addEventListener(\"hashchange\", shiftWindow);\n }\n\n // Add styling, structure to TOC's.\n $(\".dropdown-menu\").each(function () {\n $(this).find(\"ul\").each(function (index, item){\n var $item = $(item);\n $item.addClass('unstyled');\n });\n });\n\n // Global TOC.\n if ($(\"ul.globaltoc li\").length) {\n patchToc($(\"ul.globaltoc\"), 1);\n } else {\n // Remove Global TOC.\n $(\".globaltoc-container\").remove();\n }\n\n // Local TOC.\n patchToc($(\"ul.localtoc\"), 2);\n\n // Mutate sub-lists (for bs-2.3.0).\n $(\".dropdown-menu ul\").not(\".dropdown-menu\").each(function () {\n var $ul = $(this),\n $parent = $ul.parent(),\n tag = $parent[0].tagName.toLowerCase(),\n $kids = $ul.children().detach();\n\n // Replace list with items if submenu header.\n if (tag === \"ul\") {\n $ul.replaceWith($kids);\n } else if (tag === \"li\") {\n // Insert into previous list.\n $parent.after($kids);\n $ul.remove();\n }\n });\n\n // Add divider in page TOC.\n $localLi = $(\"ul.localtoc li\");\n if ($localLi.length > 2) {\n $localLi.first().after('
  • ');\n }\n\n // Enable dropdown.\n $('.dropdown-toggle').dropdown();\n\n // Patch tables.\n patchTables();\n\n // Add Note, Warning styles.\n $('div.note').addClass('alert').addClass('alert-info');\n $('div.warning').addClass('alert').addClass('alert-warning');\n\n // Inline code styles to Bootstrap style.\n $('tt.docutils.literal').not(\".xref\").each(function (i, e) {\n // ignore references\n if (!$(e).parent().hasClass(\"reference\")) {\n $(e).replaceWith(function () {\n return $(\"\").text($(this).text());\n });\n }});\n });\n}(window.jQuery));\n","var codeExercises;\nvar presenterCssLink;\nvar presentModeInitialized = false;\n\nfunction presentToggle() {\n if (!presentModeInitialized) {\n presentModeSetup();\n presentModeInitialized = true;\n }\n let bod = $(\"body\");\n let presentClass = \"present\";\n let fullHeightClass = \"full-height\";\n let bottomClass = \"bottom\";\n if (bod.hasClass(presentClass)) {\n $(\"section *\")\n .not(\n \"h1, .presentation-title, .btn-presenter, .runestone, .runestone *, section, .pre, code\"\n )\n .removeClass(\"hidden\"); //show everything\n $(\"#completionButton\").removeClass(\"hidden\");\n bod.removeClass(presentClass);\n $(\".\" + fullHeightClass).removeClass(fullHeightClass);\n $(\".\" + bottomClass).removeClass(bottomClass);\n localStorage.setItem(\"presentMode\", \"text\");\n codeExercises.removeClass(\"hidden\");\n presenterCssLink.disabled = true; // disable present_mode.css\n } else {\n $(\"section *\")\n .not(\n \"h1, .presentation-title, .btn-presenter, .runestone, .runestone *, section, .pre, code\"\n )\n .addClass(\"hidden\"); // hide extraneous stuff\n $(\"#completionButton\").addClass(\"hidden\");\n bod.addClass(presentClass);\n bod.addClass(fullHeightClass);\n $(\"html\").addClass(fullHeightClass);\n $(\"section .runestone\").addClass(fullHeightClass);\n $(\".ac-caption\").addClass(bottomClass);\n localStorage.setItem(\"presentMode\", presentClass);\n // presenter_mode.css is loaded by webpack\n //loadPresenterCss(); // present_mode.css should only apply when in presenter mode.\n activateExercise();\n }\n}\n\nfunction loadPresenterCss() {\n presenterCssLink = document.createElement(\"link\");\n presenterCssLink.type = \"text/css\";\n presenterCssLink.href = \"../_static/presenter_mode.less\";\n presenterCssLink.rel = \"stylesheet\";\n document.getElementsByTagName(\"head\")[0].appendChild(presenterCssLink);\n}\n\nfunction presentModeSetup() {\n // moved this out of configure\n let dataComponent = $(\"[data-childcomponent]\");\n\n // this still leaves some things semi-messed up when you exit presenter mode.\n // but instructors will probably just learn to refresh the page.\n dataComponent.addClass(\"runestone\");\n dataComponent.parent().closest(\"div\").not(\"section\").addClass(\"runestone\");\n dataComponent.parent().closest(\"div\").css(\"max-width\", \"none\");\n\n dataComponent.each(function (index) {\n let me = $(this);\n $(this)\n .find(\".ac_code_div, .ac_output\")\n .wrapAll(\"
    \");\n });\n\n codelensListener(500);\n $(\"section img\").wrap('
    ');\n codeExercises = $(\".runestone\").not(\".runestone .runestone\");\n // codeExercises.each(function(){\n $(\"h1\").before(\n \"
    \\\n \\\n \\\n
    \"\n );\n}\nfunction getActiveExercise() {\n return (active = codeExercises.filter(\".active\"));\n}\n\nfunction activateExercise(index) {\n if (typeof index == \"undefined\") {\n index = 0;\n }\n\n let active = getActiveExercise();\n\n if (codeExercises.length) {\n active.removeClass(\"active\");\n active = $(codeExercises[index]).addClass(\"active\");\n active.removeClass(\"hidden\");\n codeExercises.not(codeExercises.filter(\".active\")).addClass(\"hidden\");\n }\n}\n\nwindow.nextExercise = function() {\n let active = getActiveExercise();\n let nextIndex = codeExercises.index(active) + 1;\n if (nextIndex < codeExercises.length) {\n activateExercise(nextIndex);\n }\n}\n\nwindow.prevExercise = function() {\n let active = getActiveExercise();\n let prevIndex = codeExercises.index(active) - 1;\n if (prevIndex >= 0) {\n activateExercise(prevIndex);\n }\n}\n\nfunction configure() {\n let rightNav = $(\".navbar-right\");\n rightNav.prepend(\n \"\"\n );\n\n let modeSelect = $(\".mode-select\").change(presentToggle);\n}\n\nfunction codelensListener(duration) {\n // $(\".ExecutionVisualizer\").length ? configureCodelens() : setTimeout(codelensListener, duration);\n // configureCodelens();\n}\n\nfunction configureCodelens() {\n let acCodeTitle = document.createElement(\"h4\");\n acCodeTitle.textContent = \"Active Code Window\";\n let acCode = $(\".ac_code_div\");\n $(\".ac_code_div\").addClass(\"col-md-6\");\n acCode.prepend(acCodeTitle);\n\n acOutTitle = document.createElement(\"h4\");\n acOutTitle.textContent = \"Output Window\";\n let acOut = $(\".ac_output\").addClass(\"col-md-6\");\n $(\".ac_output\").prepend(acOutTitle);\n\n let sketchpadTitle = document.createElement(\"h4\");\n sketchpadTitle.textContent = \"Sketchpad\";\n let sketchpad = document.createElement(\"span\");\n $(sketchpad).addClass(\"sketchpad\");\n let sketchpadContainer = document.createElement(\"div\");\n $(sketchpadContainer).addClass(\"sketchpad-container\");\n sketchpadContainer.appendChild(sketchpadTitle);\n sketchpadContainer.appendChild(sketchpad);\n //$('.ac_output').append(sketchpadContainer);\n\n let visualizers = $(\".ExecutionVisualizer\");\n\n console.log(\"Econtainer: \", this.eContainer);\n\n $(\"[data-childcomponent]\").on(\"click\", \"button.row-mode\", function () {\n $(this).closest(\"[data-childcomponent]\").removeClass(\"card-mode\");\n $(this).closest(\"[data-childcomponent]\").addClass(\"row-mode\");\n $(this).next(\".card-mode\").removeClass(\"active-layout\");\n $(this).addClass(\"active-layout\");\n });\n\n $(\"[data-childcomponent]\").on(\"click\", \"button.card-mode\", function () {\n $(this).closest(\"[data-childcomponent]\").removeClass(\"row-mode\");\n $(this).closest(\"[data-childcomponent]\").addClass(\"card-mode\");\n $(this).prev(\".row-mode\").removeClass(\"active-layout\");\n $(this).addClass(\"active-layout\");\n });\n\n $(\"[data-childcomponent] .ac_section\").each(function () {\n $(this).prepend(\n '
    '\n );\n });\n\n visualizers.each(function (index) {\n let me = $(this);\n let col1 = me.find(\"#vizLayoutTdFirst\");\n let col2 = me.find(\"#vizLayoutTdSecond\");\n let dataVis = me.find(\"#dataViz\");\n let stackHeapTable = me.find(\"#stackHeapTable\");\n let output = me.find(\"#progOutputs\");\n output.css(\"display\", \"block\");\n me.parent().prepend(\n \"
    Example \" +\n (Number(index) + 1) +\n \"
    \"\n );\n });\n\n acCode.each(function () {\n let section = $(this).closest(\".ac-block\").parent();\n console.log(section, section.length);\n section.append(sketchpadContainer);\n });\n\n $(\"button.card-mode\").click();\n\n let modeSelect = $(\".mode-select\");\n let mode = localStorage.getItem(\"presentMode\");\n if (mode == \"present\") {\n modeSelect.val(\"present\");\n modeSelect.change();\n }\n}\n\n$(document).on(\"runestone:login-complete\", function () {\n // if user is instructor, enable presenter mode\n if (eBookConfig.isInstructor) {\n configure();\n }\n});\n","/*!\n * jQuery Internationalization library\n *\n * Copyright (C) 2012 Santhosh Thottingal\n *\n * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to\n * choose one license or the other and you don't have to notify anyone which license you are using.\n * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright\n * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n( function ( $ ) {\n\t'use strict';\n\n\t$.i18n = $.i18n || {};\n\t$.extend( $.i18n.fallbacks, {\n\t\tab: [ 'ru' ],\n\t\tace: [ 'id' ],\n\t\taln: [ 'sq' ],\n\t\t// Not so standard - als is supposed to be Tosk Albanian,\n\t\t// but in Wikipedia it's used for a Germanic language.\n\t\tals: [ 'gsw', 'de' ],\n\t\tan: [ 'es' ],\n\t\tanp: [ 'hi' ],\n\t\tarn: [ 'es' ],\n\t\tarz: [ 'ar' ],\n\t\tav: [ 'ru' ],\n\t\tay: [ 'es' ],\n\t\tba: [ 'ru' ],\n\t\tbar: [ 'de' ],\n\t\t'bat-smg': [ 'sgs', 'lt' ],\n\t\tbcc: [ 'fa' ],\n\t\t'be-x-old': [ 'be-tarask' ],\n\t\tbh: [ 'bho' ],\n\t\tbjn: [ 'id' ],\n\t\tbm: [ 'fr' ],\n\t\tbpy: [ 'bn' ],\n\t\tbqi: [ 'fa' ],\n\t\tbug: [ 'id' ],\n\t\t'cbk-zam': [ 'es' ],\n\t\tce: [ 'ru' ],\n\t\tcrh: [ 'crh-latn' ],\n\t\t'crh-cyrl': [ 'ru' ],\n\t\tcsb: [ 'pl' ],\n\t\tcv: [ 'ru' ],\n\t\t'de-at': [ 'de' ],\n\t\t'de-ch': [ 'de' ],\n\t\t'de-formal': [ 'de' ],\n\t\tdsb: [ 'de' ],\n\t\tdtp: [ 'ms' ],\n\t\tegl: [ 'it' ],\n\t\teml: [ 'it' ],\n\t\tff: [ 'fr' ],\n\t\tfit: [ 'fi' ],\n\t\t'fiu-vro': [ 'vro', 'et' ],\n\t\tfrc: [ 'fr' ],\n\t\tfrp: [ 'fr' ],\n\t\tfrr: [ 'de' ],\n\t\tfur: [ 'it' ],\n\t\tgag: [ 'tr' ],\n\t\tgan: [ 'gan-hant', 'zh-hant', 'zh-hans' ],\n\t\t'gan-hans': [ 'zh-hans' ],\n\t\t'gan-hant': [ 'zh-hant', 'zh-hans' ],\n\t\tgl: [ 'pt' ],\n\t\tglk: [ 'fa' ],\n\t\tgn: [ 'es' ],\n\t\tgsw: [ 'de' ],\n\t\thif: [ 'hif-latn' ],\n\t\thsb: [ 'de' ],\n\t\tht: [ 'fr' ],\n\t\tii: [ 'zh-cn', 'zh-hans' ],\n\t\tinh: [ 'ru' ],\n\t\tiu: [ 'ike-cans' ],\n\t\tjut: [ 'da' ],\n\t\tjv: [ 'id' ],\n\t\tkaa: [ 'kk-latn', 'kk-cyrl' ],\n\t\tkbd: [ 'kbd-cyrl' ],\n\t\tkhw: [ 'ur' ],\n\t\tkiu: [ 'tr' ],\n\t\tkk: [ 'kk-cyrl' ],\n\t\t'kk-arab': [ 'kk-cyrl' ],\n\t\t'kk-latn': [ 'kk-cyrl' ],\n\t\t'kk-cn': [ 'kk-arab', 'kk-cyrl' ],\n\t\t'kk-kz': [ 'kk-cyrl' ],\n\t\t'kk-tr': [ 'kk-latn', 'kk-cyrl' ],\n\t\tkl: [ 'da' ],\n\t\t'ko-kp': [ 'ko' ],\n\t\tkoi: [ 'ru' ],\n\t\tkrc: [ 'ru' ],\n\t\tks: [ 'ks-arab' ],\n\t\tksh: [ 'de' ],\n\t\tku: [ 'ku-latn' ],\n\t\t'ku-arab': [ 'ckb' ],\n\t\tkv: [ 'ru' ],\n\t\tlad: [ 'es' ],\n\t\tlb: [ 'de' ],\n\t\tlbe: [ 'ru' ],\n\t\tlez: [ 'ru' ],\n\t\tli: [ 'nl' ],\n\t\tlij: [ 'it' ],\n\t\tliv: [ 'et' ],\n\t\tlmo: [ 'it' ],\n\t\tln: [ 'fr' ],\n\t\tltg: [ 'lv' ],\n\t\tlzz: [ 'tr' ],\n\t\tmai: [ 'hi' ],\n\t\t'map-bms': [ 'jv', 'id' ],\n\t\tmg: [ 'fr' ],\n\t\tmhr: [ 'ru' ],\n\t\tmin: [ 'id' ],\n\t\tmo: [ 'ro' ],\n\t\tmrj: [ 'ru' ],\n\t\tmwl: [ 'pt' ],\n\t\tmyv: [ 'ru' ],\n\t\tmzn: [ 'fa' ],\n\t\tnah: [ 'es' ],\n\t\tnap: [ 'it' ],\n\t\tnds: [ 'de' ],\n\t\t'nds-nl': [ 'nl' ],\n\t\t'nl-informal': [ 'nl' ],\n\t\tno: [ 'nb' ],\n\t\tos: [ 'ru' ],\n\t\tpcd: [ 'fr' ],\n\t\tpdc: [ 'de' ],\n\t\tpdt: [ 'de' ],\n\t\tpfl: [ 'de' ],\n\t\tpms: [ 'it' ],\n\t\tpt: [ 'pt-br' ],\n\t\t'pt-br': [ 'pt' ],\n\t\tqu: [ 'es' ],\n\t\tqug: [ 'qu', 'es' ],\n\t\trgn: [ 'it' ],\n\t\trmy: [ 'ro' ],\n\t\t'roa-rup': [ 'rup' ],\n\t\true: [ 'uk', 'ru' ],\n\t\truq: [ 'ruq-latn', 'ro' ],\n\t\t'ruq-cyrl': [ 'mk' ],\n\t\t'ruq-latn': [ 'ro' ],\n\t\tsa: [ 'hi' ],\n\t\tsah: [ 'ru' ],\n\t\tscn: [ 'it' ],\n\t\tsg: [ 'fr' ],\n\t\tsgs: [ 'lt' ],\n\t\tsli: [ 'de' ],\n\t\tsr: [ 'sr-ec' ],\n\t\tsrn: [ 'nl' ],\n\t\tstq: [ 'de' ],\n\t\tsu: [ 'id' ],\n\t\tszl: [ 'pl' ],\n\t\ttcy: [ 'kn' ],\n\t\ttg: [ 'tg-cyrl' ],\n\t\ttt: [ 'tt-cyrl', 'ru' ],\n\t\t'tt-cyrl': [ 'ru' ],\n\t\tty: [ 'fr' ],\n\t\tudm: [ 'ru' ],\n\t\tug: [ 'ug-arab' ],\n\t\tuk: [ 'ru' ],\n\t\tvec: [ 'it' ],\n\t\tvep: [ 'et' ],\n\t\tvls: [ 'nl' ],\n\t\tvmf: [ 'de' ],\n\t\tvot: [ 'fi' ],\n\t\tvro: [ 'et' ],\n\t\twa: [ 'fr' ],\n\t\two: [ 'fr' ],\n\t\twuu: [ 'zh-hans' ],\n\t\txal: [ 'ru' ],\n\t\txmf: [ 'ka' ],\n\t\tyi: [ 'he' ],\n\t\tza: [ 'zh-hans' ],\n\t\tzea: [ 'nl' ],\n\t\tzh: [ 'zh-hans' ],\n\t\t'zh-classical': [ 'lzh' ],\n\t\t'zh-cn': [ 'zh-hans' ],\n\t\t'zh-hant': [ 'zh-hans' ],\n\t\t'zh-hk': [ 'zh-hant', 'zh-hans' ],\n\t\t'zh-min-nan': [ 'nan' ],\n\t\t'zh-mo': [ 'zh-hk', 'zh-hant', 'zh-hans' ],\n\t\t'zh-my': [ 'zh-sg', 'zh-hans' ],\n\t\t'zh-sg': [ 'zh-hans' ],\n\t\t'zh-tw': [ 'zh-hant', 'zh-hans' ],\n\t\t'zh-yue': [ 'yue' ]\n\t} );\n}( jQuery ) );\n","/* global pluralRuleParser */\n( function ( $ ) {\n\t'use strict';\n\n\t// jscs:disable\n\tvar language = {\n\t\t// CLDR plural rules generated using\n\t\t// libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html\n\t\tpluralRules: {\n\t\t\tak: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tam: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tar: {\n\t\t\t\tzero: 'n = 0',\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2',\n\t\t\t\tfew: 'n % 100 = 3..10',\n\t\t\t\tmany: 'n % 100 = 11..99'\n\t\t\t},\n\t\t\tars: {\n\t\t\t\tzero: 'n = 0',\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2',\n\t\t\t\tfew: 'n % 100 = 3..10',\n\t\t\t\tmany: 'n % 100 = 11..99'\n\t\t\t},\n\t\t\tas: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tbe: {\n\t\t\t\tone: 'n % 10 = 1 and n % 100 != 11',\n\t\t\t\tfew: 'n % 10 = 2..4 and n % 100 != 12..14',\n\t\t\t\tmany: 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14'\n\t\t\t},\n\t\t\tbh: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tbn: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tbr: {\n\t\t\t\tone: 'n % 10 = 1 and n % 100 != 11,71,91',\n\t\t\t\ttwo: 'n % 10 = 2 and n % 100 != 12,72,92',\n\t\t\t\tfew: 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',\n\t\t\t\tmany: 'n != 0 and n % 1000000 = 0'\n\t\t\t},\n\t\t\tbs: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'\n\t\t\t},\n\t\t\tcs: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\tfew: 'i = 2..4 and v = 0',\n\t\t\t\tmany: 'v != 0'\n\t\t\t},\n\t\t\tcy: {\n\t\t\t\tzero: 'n = 0',\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2',\n\t\t\t\tfew: 'n = 3',\n\t\t\t\tmany: 'n = 6'\n\t\t\t},\n\t\t\tda: {\n\t\t\t\tone: 'n = 1 or t != 0 and i = 0,1'\n\t\t\t},\n\t\t\tdsb: {\n\t\t\t\tone: 'v = 0 and i % 100 = 1 or f % 100 = 1',\n\t\t\t\ttwo: 'v = 0 and i % 100 = 2 or f % 100 = 2',\n\t\t\t\tfew: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4'\n\t\t\t},\n\t\t\tfa: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tff: {\n\t\t\t\tone: 'i = 0,1'\n\t\t\t},\n\t\t\tfil: {\n\t\t\t\tone: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9'\n\t\t\t},\n\t\t\tfr: {\n\t\t\t\tone: 'i = 0,1'\n\t\t\t},\n\t\t\tga: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2',\n\t\t\t\tfew: 'n = 3..6',\n\t\t\t\tmany: 'n = 7..10'\n\t\t\t},\n\t\t\tgd: {\n\t\t\t\tone: 'n = 1,11',\n\t\t\t\ttwo: 'n = 2,12',\n\t\t\t\tfew: 'n = 3..10,13..19'\n\t\t\t},\n\t\t\tgu: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tguw: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tgv: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1',\n\t\t\t\ttwo: 'v = 0 and i % 10 = 2',\n\t\t\t\tfew: 'v = 0 and i % 100 = 0,20,40,60,80',\n\t\t\t\tmany: 'v != 0'\n\t\t\t},\n\t\t\the: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\ttwo: 'i = 2 and v = 0',\n\t\t\t\tmany: 'v = 0 and n != 0..10 and n % 10 = 0'\n\t\t\t},\n\t\t\thi: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\thr: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'\n\t\t\t},\n\t\t\thsb: {\n\t\t\t\tone: 'v = 0 and i % 100 = 1 or f % 100 = 1',\n\t\t\t\ttwo: 'v = 0 and i % 100 = 2 or f % 100 = 2',\n\t\t\t\tfew: 'v = 0 and i % 100 = 3..4 or f % 100 = 3..4'\n\t\t\t},\n\t\t\thy: {\n\t\t\t\tone: 'i = 0,1'\n\t\t\t},\n\t\t\tis: {\n\t\t\t\tone: 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'\n\t\t\t},\n\t\t\tiu: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tiw: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\ttwo: 'i = 2 and v = 0',\n\t\t\t\tmany: 'v = 0 and n != 0..10 and n % 10 = 0'\n\t\t\t},\n\t\t\tkab: {\n\t\t\t\tone: 'i = 0,1'\n\t\t\t},\n\t\t\tkn: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tkw: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tlag: {\n\t\t\t\tzero: 'n = 0',\n\t\t\t\tone: 'i = 0,1 and n != 0'\n\t\t\t},\n\t\t\tln: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tlt: {\n\t\t\t\tone: 'n % 10 = 1 and n % 100 != 11..19',\n\t\t\t\tfew: 'n % 10 = 2..9 and n % 100 != 11..19',\n\t\t\t\tmany: 'f != 0'\n\t\t\t},\n\t\t\tlv: {\n\t\t\t\tzero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',\n\t\t\t\tone: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'\n\t\t\t},\n\t\t\tmg: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tmk: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 or f % 10 = 1'\n\t\t\t},\n\t\t\tmo: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\tfew: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'\n\t\t\t},\n\t\t\tmr: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t},\n\t\t\tmt: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\tfew: 'n = 0 or n % 100 = 2..10',\n\t\t\t\tmany: 'n % 100 = 11..19'\n\t\t\t},\n\t\t\tnaq: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tnso: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tpa: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tpl: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',\n\t\t\t\tmany: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14'\n\t\t\t},\n\t\t\tprg: {\n\t\t\t\tzero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',\n\t\t\t\tone: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'\n\t\t\t},\n\t\t\tpt: {\n\t\t\t\tone: 'i = 0..1'\n\t\t\t},\n\t\t\tro: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\tfew: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'\n\t\t\t},\n\t\t\tru: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',\n\t\t\t\tmany: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'\n\t\t\t},\n\t\t\tse: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsh: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'\n\t\t\t},\n\t\t\tshi: {\n\t\t\t\tone: 'i = 0 or n = 1',\n\t\t\t\tfew: 'n = 2..10'\n\t\t\t},\n\t\t\tsi: {\n\t\t\t\tone: 'n = 0,1 or i = 0 and f = 1'\n\t\t\t},\n\t\t\tsk: {\n\t\t\t\tone: 'i = 1 and v = 0',\n\t\t\t\tfew: 'i = 2..4 and v = 0',\n\t\t\t\tmany: 'v != 0'\n\t\t\t},\n\t\t\tsl: {\n\t\t\t\tone: 'v = 0 and i % 100 = 1',\n\t\t\t\ttwo: 'v = 0 and i % 100 = 2',\n\t\t\t\tfew: 'v = 0 and i % 100 = 3..4 or v != 0'\n\t\t\t},\n\t\t\tsma: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsmi: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsmj: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsmn: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsms: {\n\t\t\t\tone: 'n = 1',\n\t\t\t\ttwo: 'n = 2'\n\t\t\t},\n\t\t\tsr: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'\n\t\t\t},\n\t\t\tti: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\ttl: {\n\t\t\t\tone: 'v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9'\n\t\t\t},\n\t\t\ttzm: {\n\t\t\t\tone: 'n = 0..1 or n = 11..99'\n\t\t\t},\n\t\t\tuk: {\n\t\t\t\tone: 'v = 0 and i % 10 = 1 and i % 100 != 11',\n\t\t\t\tfew: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',\n\t\t\t\tmany: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'\n\t\t\t},\n\t\t\twa: {\n\t\t\t\tone: 'n = 0..1'\n\t\t\t},\n\t\t\tzu: {\n\t\t\t\tone: 'i = 0 or n = 1'\n\t\t\t}\n\t\t},\n\t\t// jscs:enable\n\n\t\t/**\n\t\t * Plural form transformations, needed for some languages.\n\t\t *\n\t\t * @param {integer} count\n\t\t * Non-localized quantifier\n\t\t * @param {Array} forms\n\t\t * List of plural forms\n\t\t * @return {string} Correct form for quantifier in this language\n\t\t */\n\t\tconvertPlural: function ( count, forms ) {\n\t\t\tvar pluralRules,\n\t\t\t\tpluralFormIndex,\n\t\t\t\tindex,\n\t\t\t\texplicitPluralPattern = new RegExp( '\\\\d+=', 'i' ),\n\t\t\t\tformCount,\n\t\t\t\tform;\n\n\t\t\tif ( !forms || forms.length === 0 ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// Handle for Explicit 0= & 1= values\n\t\t\tfor ( index = 0; index < forms.length; index++ ) {\n\t\t\t\tform = forms[ index ];\n\t\t\t\tif ( explicitPluralPattern.test( form ) ) {\n\t\t\t\t\tformCount = parseInt( form.slice( 0, form.indexOf( '=' ) ), 10 );\n\t\t\t\t\tif ( formCount === count ) {\n\t\t\t\t\t\treturn ( form.slice( form.indexOf( '=' ) + 1 ) );\n\t\t\t\t\t}\n\t\t\t\t\tforms[ index ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforms = $.map( forms, function ( form ) {\n\t\t\t\tif ( form !== undefined ) {\n\t\t\t\t\treturn form;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tpluralRules = this.pluralRules[ $.i18n().locale ];\n\n\t\t\tif ( !pluralRules ) {\n\t\t\t\t// default fallback.\n\t\t\t\treturn ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];\n\t\t\t}\n\n\t\t\tpluralFormIndex = this.getPluralForm( count, pluralRules );\n\t\t\tpluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );\n\n\t\t\treturn forms[ pluralFormIndex ];\n\t\t},\n\n\t\t/**\n\t\t * For the number, get the plural for index\n\t\t *\n\t\t * @param {integer} number\n\t\t * @param {Object} pluralRules\n\t\t * @return {integer} plural form index\n\t\t */\n\t\tgetPluralForm: function ( number, pluralRules ) {\n\t\t\tvar i,\n\t\t\t\tpluralForms = [ 'zero', 'one', 'two', 'few', 'many', 'other' ],\n\t\t\t\tpluralFormIndex = 0;\n\n\t\t\tfor ( i = 0; i < pluralForms.length; i++ ) {\n\t\t\t\tif ( pluralRules[ pluralForms[ i ] ] ) {\n\t\t\t\t\tif ( pluralRuleParser( pluralRules[ pluralForms[ i ] ], number ) ) {\n\t\t\t\t\t\treturn pluralFormIndex;\n\t\t\t\t\t}\n\n\t\t\t\t\tpluralFormIndex++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pluralFormIndex;\n\t\t},\n\n\t\t/**\n\t\t * Converts a number using digitTransformTable.\n\t\t *\n\t\t * @param {number} num Value to be converted\n\t\t * @param {boolean} integer Convert the return value to an integer\n\t\t * @return {string} The number converted into a String.\n\t\t */\n\t\tconvertNumber: function ( num, integer ) {\n\t\t\tvar tmp, item, i,\n\t\t\t\ttransformTable, numberString, convertedNumber;\n\n\t\t\t// Set the target Transform table:\n\t\t\ttransformTable = this.digitTransformTable( $.i18n().locale );\n\t\t\tnumberString = String( num );\n\t\t\tconvertedNumber = '';\n\n\t\t\tif ( !transformTable ) {\n\t\t\t\treturn num;\n\t\t\t}\n\n\t\t\t// Check if the restore to Latin number flag is set:\n\t\t\tif ( integer ) {\n\t\t\t\tif ( parseFloat( num, 10 ) === num ) {\n\t\t\t\t\treturn num;\n\t\t\t\t}\n\n\t\t\t\ttmp = [];\n\n\t\t\t\tfor ( item in transformTable ) {\n\t\t\t\t\ttmp[ transformTable[ item ] ] = item;\n\t\t\t\t}\n\n\t\t\t\ttransformTable = tmp;\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < numberString.length; i++ ) {\n\t\t\t\tif ( transformTable[ numberString[ i ] ] ) {\n\t\t\t\t\tconvertedNumber += transformTable[ numberString[ i ] ];\n\t\t\t\t} else {\n\t\t\t\t\tconvertedNumber += numberString[ i ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn integer ? parseFloat( convertedNumber, 10 ) : convertedNumber;\n\t\t},\n\n\t\t/**\n\t\t * Grammatical transformations, needed for inflected languages.\n\t\t * Invoked by putting {{grammar:form|word}} in a message.\n\t\t * Override this method for languages that need special grammar rules\n\t\t * applied dynamically.\n\t\t *\n\t\t * @param {string} word\n\t\t * @param {string} form\n\t\t * @return {string}\n\t\t */\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tconvertGrammar: function ( word, form ) {\n\t\t\treturn word;\n\t\t},\n\n\t\t/**\n\t\t * Provides an alternative text depending on specified gender. Usage\n\t\t * {{gender:[gender|user object]|masculine|feminine|neutral}}. If second\n\t\t * or third parameter are not specified, masculine is used.\n\t\t *\n\t\t * These details may be overriden per language.\n\t\t *\n\t\t * @param {string} gender\n\t\t * male, female, or anything else for neutral.\n\t\t * @param {Array} forms\n\t\t * List of gender forms\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tgender: function ( gender, forms ) {\n\t\t\tif ( !forms || forms.length === 0 ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\twhile ( forms.length < 2 ) {\n\t\t\t\tforms.push( forms[ forms.length - 1 ] );\n\t\t\t}\n\n\t\t\tif ( gender === 'male' ) {\n\t\t\t\treturn forms[ 0 ];\n\t\t\t}\n\n\t\t\tif ( gender === 'female' ) {\n\t\t\t\treturn forms[ 1 ];\n\t\t\t}\n\n\t\t\treturn ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];\n\t\t},\n\n\t\t/**\n\t\t * Get the digit transform table for the given language\n\t\t * See http://cldr.unicode.org/translation/numbering-systems\n\t\t *\n\t\t * @param {string} language\n\t\t * @return {Array|boolean} List of digits in the passed language or false\n\t\t * representation, or boolean false if there is no information.\n\t\t */\n\t\tdigitTransformTable: function ( language ) {\n\t\t\tvar tables = {\n\t\t\t\tar: '٠١٢٣٤٥٦٧٨٩',\n\t\t\t\tfa: '۰۱۲۳۴۵۶۷۸۹',\n\t\t\t\tml: '൦൧൨൩൪൫൬൭൮൯',\n\t\t\t\tkn: '೦೧೨೩೪೫೬೭೮೯',\n\t\t\t\tlo: '໐໑໒໓໔໕໖໗໘໙',\n\t\t\t\tor: '୦୧୨୩୪୫୬୭୮୯',\n\t\t\t\tkh: '០១២៣៤៥៦៧៨៩',\n\t\t\t\tpa: '੦੧੨੩੪੫੬੭੮੯',\n\t\t\t\tgu: '૦૧૨૩૪૫૬૭૮૯',\n\t\t\t\thi: '०१२३४५६७८९',\n\t\t\t\tmy: '၀၁၂၃၄၅၆၇၈၉',\n\t\t\t\tta: '௦௧௨௩௪௫௬௭௮௯',\n\t\t\t\tte: '౦౧౨౩౪౫౬౭౮౯',\n\t\t\t\tth: '๐๑๒๓๔๕๖๗๘๙', // FIXME use iso 639 codes\n\t\t\t\tbo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes\n\t\t\t};\n\n\t\t\tif ( !tables[ language ] ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn tables[ language ].split( '' );\n\t\t}\n\t};\n\n\t$.extend( $.i18n.languages, {\n\t\t'default': language\n\t} );\n}( jQuery ) );\n","/*!\n * BIDI embedding support for jQuery.i18n\n *\n * Copyright (C) 2015, David Chan\n *\n * This code is dual licensed GPLv2 or later and MIT. You don't have to do\n * anything special to choose one license or the other and you don't have to\n * notify anyone which license you are using. You are free to use this code\n * in commercial projects as long as the copyright header is left intact.\n * See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n\n( function ( $ ) {\n\t'use strict';\n\tvar strongDirRegExp;\n\n\t/**\n\t * Matches the first strong directionality codepoint:\n\t * - in group 1 if it is LTR\n\t * - in group 2 if it is RTL\n\t * Does not match if there is no strong directionality codepoint.\n\t *\n\t * Generated by UnicodeJS (see tools/strongDir) from the UCD; see\n\t * https://phabricator.wikimedia.org/diffusion/GUJS/ .\n\t */\n\tstrongDirRegExp = new RegExp(\n\t\t'(?:' +\n\t\t\t'(' +\n\t\t\t\t'[\\u0041-\\u005a\\u0061-\\u007a\\u00aa\\u00b5\\u00ba\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02b8\\u02bb-\\u02c1\\u02d0\\u02d1\\u02e0-\\u02e4\\u02ee\\u0370-\\u0373\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0482\\u048a-\\u052f\\u0531-\\u0556\\u0559-\\u055f\\u0561-\\u0587\\u0589\\u0903-\\u0939\\u093b\\u093d-\\u0940\\u0949-\\u094c\\u094e-\\u0950\\u0958-\\u0961\\u0964-\\u0980\\u0982\\u0983\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd-\\u09c0\\u09c7\\u09c8\\u09cb\\u09cc\\u09ce\\u09d7\\u09dc\\u09dd\\u09df-\\u09e1\\u09e6-\\u09f1\\u09f4-\\u09fa\\u0a03\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a3e-\\u0a40\\u0a59-\\u0a5c\\u0a5e\\u0a66-\\u0a6f\\u0a72-\\u0a74\\u0a83\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd-\\u0ac0\\u0ac9\\u0acb\\u0acc\\u0ad0\\u0ae0\\u0ae1\\u0ae6-\\u0af0\\u0af9\\u0b02\\u0b03\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b3e\\u0b40\\u0b47\\u0b48\\u0b4b\\u0b4c\\u0b57\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b66-\\u0b77\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bbe\\u0bbf\\u0bc1\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcc\\u0bd0\\u0bd7\\u0be6-\\u0bf2\\u0c01-\\u0c03\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c41-\\u0c44\\u0c58-\\u0c5a\\u0c60\\u0c61\\u0c66-\\u0c6f\\u0c7f\\u0c82\\u0c83\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd-\\u0cc4\\u0cc6-\\u0cc8\\u0cca\\u0ccb\\u0cd5\\u0cd6\\u0cde\\u0ce0\\u0ce1\\u0ce6-\\u0cef\\u0cf1\\u0cf2\\u0d02\\u0d03\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d-\\u0d40\\u0d46-\\u0d48\\u0d4a-\\u0d4c\\u0d4e\\u0d57\\u0d5f-\\u0d61\\u0d66-\\u0d75\\u0d79-\\u0d7f\\u0d82\\u0d83\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0dcf-\\u0dd1\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2-\\u0df4\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e4f-\\u0e5b\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0ed0-\\u0ed9\\u0edc-\\u0edf\\u0f00-\\u0f17\\u0f1a-\\u0f34\\u0f36\\u0f38\\u0f3e-\\u0f47\\u0f49-\\u0f6c\\u0f7f\\u0f85\\u0f88-\\u0f8c\\u0fbe-\\u0fc5\\u0fc7-\\u0fcc\\u0fce-\\u0fda\\u1000-\\u102c\\u1031\\u1038\\u103b\\u103c\\u103f-\\u1057\\u105a-\\u105d\\u1061-\\u1070\\u1075-\\u1081\\u1083\\u1084\\u1087-\\u108c\\u108e-\\u109c\\u109e-\\u10c5\\u10c7\\u10cd\\u10d0-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1360-\\u137c\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u167f\\u1681-\\u169a\\u16a0-\\u16f8\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1735\\u1736\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17b6\\u17be-\\u17c5\\u17c7\\u17c8\\u17d4-\\u17da\\u17dc\\u17e0-\\u17e9\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1923-\\u1926\\u1929-\\u192b\\u1930\\u1931\\u1933-\\u1938\\u1946-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u19d0-\\u19da\\u1a00-\\u1a16\\u1a19\\u1a1a\\u1a1e-\\u1a55\\u1a57\\u1a61\\u1a63\\u1a64\\u1a6d-\\u1a72\\u1a80-\\u1a89\\u1a90-\\u1a99\\u1aa0-\\u1aad\\u1b04-\\u1b33\\u1b35\\u1b3b\\u1b3d-\\u1b41\\u1b43-\\u1b4b\\u1b50-\\u1b6a\\u1b74-\\u1b7c\\u1b82-\\u1ba1\\u1ba6\\u1ba7\\u1baa\\u1bae-\\u1be5\\u1be7\\u1bea-\\u1bec\\u1bee\\u1bf2\\u1bf3\\u1bfc-\\u1c2b\\u1c34\\u1c35\\u1c3b-\\u1c49\\u1c4d-\\u1c7f\\u1cc0-\\u1cc7\\u1cd3\\u1ce1\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u200e\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u214f\\u2160-\\u2188\\u2336-\\u237a\\u2395\\u249c-\\u24e9\\u26ac\\u2800-\\u28ff\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d70\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u302e\\u302f\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u3190-\\u31ba\\u31f0-\\u321c\\u3220-\\u324f\\u3260-\\u327b\\u327f-\\u32b0\\u32c0-\\u32cb\\u32d0-\\u32fe\\u3300-\\u3376\\u337b-\\u33dd\\u33e0-\\u33fe\\u3400-\\u4db5\\u4e00-\\u9fd5\\ua000-\\ua48c\\ua4d0-\\ua60c\\ua610-\\ua62b\\ua640-\\ua66e\\ua680-\\ua69d\\ua6a0-\\ua6ef\\ua6f2-\\ua6f7\\ua722-\\ua787\\ua789-\\ua7ad\\ua7b0-\\ua7b7\\ua7f7-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua824\\ua827\\ua830-\\ua837\\ua840-\\ua873\\ua880-\\ua8c3\\ua8ce-\\ua8d9\\ua8f2-\\ua8fd\\ua900-\\ua925\\ua92e-\\ua946\\ua952\\ua953\\ua95f-\\ua97c\\ua983-\\ua9b2\\ua9b4\\ua9b5\\ua9ba\\ua9bb\\ua9bd-\\ua9cd\\ua9cf-\\ua9d9\\ua9de-\\ua9e4\\ua9e6-\\ua9fe\\uaa00-\\uaa28\\uaa2f\\uaa30\\uaa33\\uaa34\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa4d\\uaa50-\\uaa59\\uaa5c-\\uaa7b\\uaa7d-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaaeb\\uaaee-\\uaaf5\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab65\\uab70-\\uabe4\\uabe6\\uabe7\\uabe9-\\uabec\\uabf0-\\uabf9\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\ue000-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc]|\\ud800[\\udc00-\\udc0b]|\\ud800[\\udc0d-\\udc26]|\\ud800[\\udc28-\\udc3a]|\\ud800\\udc3c|\\ud800\\udc3d|\\ud800[\\udc3f-\\udc4d]|\\ud800[\\udc50-\\udc5d]|\\ud800[\\udc80-\\udcfa]|\\ud800\\udd00|\\ud800\\udd02|\\ud800[\\udd07-\\udd33]|\\ud800[\\udd37-\\udd3f]|\\ud800[\\uddd0-\\uddfc]|\\ud800[\\ude80-\\ude9c]|\\ud800[\\udea0-\\uded0]|\\ud800[\\udf00-\\udf23]|\\ud800[\\udf30-\\udf4a]|\\ud800[\\udf50-\\udf75]|\\ud800[\\udf80-\\udf9d]|\\ud800[\\udf9f-\\udfc3]|\\ud800[\\udfc8-\\udfd5]|\\ud801[\\udc00-\\udc9d]|\\ud801[\\udca0-\\udca9]|\\ud801[\\udd00-\\udd27]|\\ud801[\\udd30-\\udd63]|\\ud801\\udd6f|\\ud801[\\ude00-\\udf36]|\\ud801[\\udf40-\\udf55]|\\ud801[\\udf60-\\udf67]|\\ud804\\udc00|\\ud804[\\udc02-\\udc37]|\\ud804[\\udc47-\\udc4d]|\\ud804[\\udc66-\\udc6f]|\\ud804[\\udc82-\\udcb2]|\\ud804\\udcb7|\\ud804\\udcb8|\\ud804[\\udcbb-\\udcc1]|\\ud804[\\udcd0-\\udce8]|\\ud804[\\udcf0-\\udcf9]|\\ud804[\\udd03-\\udd26]|\\ud804\\udd2c|\\ud804[\\udd36-\\udd43]|\\ud804[\\udd50-\\udd72]|\\ud804[\\udd74-\\udd76]|\\ud804[\\udd82-\\uddb5]|\\ud804[\\uddbf-\\uddc9]|\\ud804\\uddcd|\\ud804[\\uddd0-\\udddf]|\\ud804[\\udde1-\\uddf4]|\\ud804[\\ude00-\\ude11]|\\ud804[\\ude13-\\ude2e]|\\ud804\\ude32|\\ud804\\ude33|\\ud804\\ude35|\\ud804[\\ude38-\\ude3d]|\\ud804[\\ude80-\\ude86]|\\ud804\\ude88|\\ud804[\\ude8a-\\ude8d]|\\ud804[\\ude8f-\\ude9d]|\\ud804[\\ude9f-\\udea9]|\\ud804[\\udeb0-\\udede]|\\ud804[\\udee0-\\udee2]|\\ud804[\\udef0-\\udef9]|\\ud804\\udf02|\\ud804\\udf03|\\ud804[\\udf05-\\udf0c]|\\ud804\\udf0f|\\ud804\\udf10|\\ud804[\\udf13-\\udf28]|\\ud804[\\udf2a-\\udf30]|\\ud804\\udf32|\\ud804\\udf33|\\ud804[\\udf35-\\udf39]|\\ud804[\\udf3d-\\udf3f]|\\ud804[\\udf41-\\udf44]|\\ud804\\udf47|\\ud804\\udf48|\\ud804[\\udf4b-\\udf4d]|\\ud804\\udf50|\\ud804\\udf57|\\ud804[\\udf5d-\\udf63]|\\ud805[\\udc80-\\udcb2]|\\ud805\\udcb9|\\ud805[\\udcbb-\\udcbe]|\\ud805\\udcc1|\\ud805[\\udcc4-\\udcc7]|\\ud805[\\udcd0-\\udcd9]|\\ud805[\\udd80-\\uddb1]|\\ud805[\\uddb8-\\uddbb]|\\ud805\\uddbe|\\ud805[\\uddc1-\\udddb]|\\ud805[\\ude00-\\ude32]|\\ud805\\ude3b|\\ud805\\ude3c|\\ud805\\ude3e|\\ud805[\\ude41-\\ude44]|\\ud805[\\ude50-\\ude59]|\\ud805[\\ude80-\\udeaa]|\\ud805\\udeac|\\ud805\\udeae|\\ud805\\udeaf|\\ud805\\udeb6|\\ud805[\\udec0-\\udec9]|\\ud805[\\udf00-\\udf19]|\\ud805\\udf20|\\ud805\\udf21|\\ud805\\udf26|\\ud805[\\udf30-\\udf3f]|\\ud806[\\udca0-\\udcf2]|\\ud806\\udcff|\\ud806[\\udec0-\\udef8]|\\ud808[\\udc00-\\udf99]|\\ud809[\\udc00-\\udc6e]|\\ud809[\\udc70-\\udc74]|\\ud809[\\udc80-\\udd43]|\\ud80c[\\udc00-\\udfff]|\\ud80d[\\udc00-\\udc2e]|\\ud811[\\udc00-\\ude46]|\\ud81a[\\udc00-\\ude38]|\\ud81a[\\ude40-\\ude5e]|\\ud81a[\\ude60-\\ude69]|\\ud81a\\ude6e|\\ud81a\\ude6f|\\ud81a[\\uded0-\\udeed]|\\ud81a\\udef5|\\ud81a[\\udf00-\\udf2f]|\\ud81a[\\udf37-\\udf45]|\\ud81a[\\udf50-\\udf59]|\\ud81a[\\udf5b-\\udf61]|\\ud81a[\\udf63-\\udf77]|\\ud81a[\\udf7d-\\udf8f]|\\ud81b[\\udf00-\\udf44]|\\ud81b[\\udf50-\\udf7e]|\\ud81b[\\udf93-\\udf9f]|\\ud82c\\udc00|\\ud82c\\udc01|\\ud82f[\\udc00-\\udc6a]|\\ud82f[\\udc70-\\udc7c]|\\ud82f[\\udc80-\\udc88]|\\ud82f[\\udc90-\\udc99]|\\ud82f\\udc9c|\\ud82f\\udc9f|\\ud834[\\udc00-\\udcf5]|\\ud834[\\udd00-\\udd26]|\\ud834[\\udd29-\\udd66]|\\ud834[\\udd6a-\\udd72]|\\ud834\\udd83|\\ud834\\udd84|\\ud834[\\udd8c-\\udda9]|\\ud834[\\uddae-\\udde8]|\\ud834[\\udf60-\\udf71]|\\ud835[\\udc00-\\udc54]|\\ud835[\\udc56-\\udc9c]|\\ud835\\udc9e|\\ud835\\udc9f|\\ud835\\udca2|\\ud835\\udca5|\\ud835\\udca6|\\ud835[\\udca9-\\udcac]|\\ud835[\\udcae-\\udcb9]|\\ud835\\udcbb|\\ud835[\\udcbd-\\udcc3]|\\ud835[\\udcc5-\\udd05]|\\ud835[\\udd07-\\udd0a]|\\ud835[\\udd0d-\\udd14]|\\ud835[\\udd16-\\udd1c]|\\ud835[\\udd1e-\\udd39]|\\ud835[\\udd3b-\\udd3e]|\\ud835[\\udd40-\\udd44]|\\ud835\\udd46|\\ud835[\\udd4a-\\udd50]|\\ud835[\\udd52-\\udea5]|\\ud835[\\udea8-\\udeda]|\\ud835[\\udedc-\\udf14]|\\ud835[\\udf16-\\udf4e]|\\ud835[\\udf50-\\udf88]|\\ud835[\\udf8a-\\udfc2]|\\ud835[\\udfc4-\\udfcb]|\\ud836[\\udc00-\\uddff]|\\ud836[\\ude37-\\ude3a]|\\ud836[\\ude6d-\\ude74]|\\ud836[\\ude76-\\ude83]|\\ud836[\\ude85-\\ude8b]|\\ud83c[\\udd10-\\udd2e]|\\ud83c[\\udd30-\\udd69]|\\ud83c[\\udd70-\\udd9a]|\\ud83c[\\udde6-\\ude02]|\\ud83c[\\ude10-\\ude3a]|\\ud83c[\\ude40-\\ude48]|\\ud83c\\ude50|\\ud83c\\ude51|[\\ud840-\\ud868][\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6]|\\ud869[\\udf00-\\udfff]|[\\ud86a-\\ud86c][\\udc00-\\udfff]|\\ud86d[\\udc00-\\udf34]|\\ud86d[\\udf40-\\udfff]|\\ud86e[\\udc00-\\udc1d]|\\ud86e[\\udc20-\\udfff]|[\\ud86f-\\ud872][\\udc00-\\udfff]|\\ud873[\\udc00-\\udea1]|\\ud87e[\\udc00-\\ude1d]|[\\udb80-\\udbbe][\\udc00-\\udfff]|\\udbbf[\\udc00-\\udffd]|[\\udbc0-\\udbfe][\\udc00-\\udfff]|\\udbff[\\udc00-\\udffd]' +\n\t\t\t')|(' +\n\t\t\t\t'[\\u0590\\u05be\\u05c0\\u05c3\\u05c6\\u05c8-\\u05ff\\u07c0-\\u07ea\\u07f4\\u07f5\\u07fa-\\u0815\\u081a\\u0824\\u0828\\u082e-\\u0858\\u085c-\\u089f\\u200f\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb4f\\u0608\\u060b\\u060d\\u061b-\\u064a\\u066d-\\u066f\\u0671-\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u0710\\u0712-\\u072f\\u074b-\\u07a5\\u07b1-\\u07bf\\u08a0-\\u08e2\\ufb50-\\ufd3d\\ufd40-\\ufdcf\\ufdf0-\\ufdfc\\ufdfe\\ufdff\\ufe70-\\ufefe]|\\ud802[\\udc00-\\udd1e]|\\ud802[\\udd20-\\ude00]|\\ud802\\ude04|\\ud802[\\ude07-\\ude0b]|\\ud802[\\ude10-\\ude37]|\\ud802[\\ude3b-\\ude3e]|\\ud802[\\ude40-\\udee4]|\\ud802[\\udee7-\\udf38]|\\ud802[\\udf40-\\udfff]|\\ud803[\\udc00-\\ude5f]|\\ud803[\\ude7f-\\udfff]|\\ud83a[\\udc00-\\udccf]|\\ud83a[\\udcd7-\\udfff]|\\ud83b[\\udc00-\\uddff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\udf00-\\udfff]|\\ud83b[\\ude00-\\udeef]|\\ud83b[\\udef2-\\udeff]' +\n\t\t\t')' +\n\t\t')'\n\t);\n\n\t/**\n\t * Gets directionality of the first strongly directional codepoint\n\t *\n\t * This is the rule the BIDI algorithm uses to determine the directionality of\n\t * paragraphs ( http://unicode.org/reports/tr9/#The_Paragraph_Level ) and\n\t * FSI isolates ( http://unicode.org/reports/tr9/#Explicit_Directional_Isolates ).\n\t *\n\t * TODO: Does not handle BIDI control characters inside the text.\n\t * TODO: Does not handle unallocated characters.\n\t *\n\t * @param {string} text The text from which to extract initial directionality.\n\t * @return {string} Directionality (either 'ltr' or 'rtl')\n\t */\n\tfunction strongDirFromContent( text ) {\n\t\tvar m = text.match( strongDirRegExp );\n\t\tif ( !m ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( m[ 2 ] === undefined ) {\n\t\t\treturn 'ltr';\n\t\t}\n\t\treturn 'rtl';\n\t}\n\n\t$.extend( $.i18n.parser.emitter, {\n\t\t/**\n\t\t * Wraps argument with unicode control characters for directionality safety\n\t\t *\n\t\t * This solves the problem where directionality-neutral characters at the edge of\n\t\t * the argument string get interpreted with the wrong directionality from the\n\t\t * enclosing context, giving renderings that look corrupted like \"(Ben_(WMF\".\n\t\t *\n\t\t * The wrapping is LRE...PDF or RLE...PDF, depending on the detected\n\t\t * directionality of the argument string, using the BIDI algorithm's own \"First\n\t\t * strong directional codepoint\" rule. Essentially, this works round the fact that\n\t\t * there is no embedding equivalent of U+2068 FSI (isolation with heuristic\n\t\t * direction inference). The latter is cleaner but still not widely supported.\n\t\t *\n\t\t * @param {string[]} nodes The text nodes from which to take the first item.\n\t\t * @return {string} Wrapped String of content as needed.\n\t\t */\n\t\tbidi: function ( nodes ) {\n\t\t\tvar dir = strongDirFromContent( nodes[ 0 ] );\n\t\t\tif ( dir === 'ltr' ) {\n\t\t\t\t// Wrap in LEFT-TO-RIGHT EMBEDDING ... POP DIRECTIONAL FORMATTING\n\t\t\t\treturn '\\u202A' + nodes[ 0 ] + '\\u202C';\n\t\t\t}\n\t\t\tif ( dir === 'rtl' ) {\n\t\t\t\t// Wrap in RIGHT-TO-LEFT EMBEDDING ... POP DIRECTIONAL FORMATTING\n\t\t\t\treturn '\\u202B' + nodes[ 0 ] + '\\u202C';\n\t\t\t}\n\t\t\t// No strong directionality: do not wrap\n\t\t\treturn nodes[ 0 ];\n\t\t}\n\t} );\n}( jQuery ) );\n","module.exports = jQuery;","/*!\n * jQuery Internationalization library\n *\n * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar\n *\n * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do\n * anything special to choose one license or the other and you don't have to\n * notify anyone which license you are using. You are free to use\n * UniversalLanguageSelector in commercial projects as long as the copyright\n * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n\n( function ( $ ) {\n\t'use strict';\n\n\tvar MessageParserEmitter = function () {\n\t\tthis.language = $.i18n.languages[ String.locale ] || $.i18n.languages[ 'default' ];\n\t};\n\n\tMessageParserEmitter.prototype = {\n\t\tconstructor: MessageParserEmitter,\n\n\t\t/**\n\t\t * (We put this method definition here, and not in prototype, to make\n\t\t * sure it's not overwritten by any magic.) Walk entire node structure,\n\t\t * applying replacements and template functions when appropriate\n\t\t *\n\t\t * @param {Mixed} node abstract syntax tree (top node or subnode)\n\t\t * @param {Array} replacements for $1, $2, ... $n\n\t\t * @return {Mixed} single-string node or array of nodes suitable for\n\t\t * jQuery appending.\n\t\t */\n\t\temit: function ( node, replacements ) {\n\t\t\tvar ret, subnodes, operation,\n\t\t\t\tmessageParserEmitter = this;\n\n\t\t\tswitch ( typeof node ) {\n\t\t\t\tcase 'string':\n\t\t\t\tcase 'number':\n\t\t\t\t\tret = node;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'object':\n\t\t\t\t// node is an array of nodes\n\t\t\t\t\tsubnodes = $.map( node.slice( 1 ), function ( n ) {\n\t\t\t\t\t\treturn messageParserEmitter.emit( n, replacements );\n\t\t\t\t\t} );\n\n\t\t\t\t\toperation = node[ 0 ].toLowerCase();\n\n\t\t\t\t\tif ( typeof messageParserEmitter[ operation ] === 'function' ) {\n\t\t\t\t\t\tret = messageParserEmitter[ operation ]( subnodes, replacements );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error( 'unknown operation \"' + operation + '\"' );\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'undefined':\n\t\t\t\t// Parsing the empty string (as an entire expression, or as a\n\t\t\t\t// paramExpression in a template) results in undefined\n\t\t\t\t// Perhaps a more clever parser can detect this, and return the\n\t\t\t\t// empty string? Or is that useful information?\n\t\t\t\t// The logical thing is probably to return the empty string here\n\t\t\t\t// when we encounter undefined.\n\t\t\t\t\tret = '';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'unexpected type in AST: ' + typeof node );\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t},\n\n\t\t/**\n\t\t * Parsing has been applied depth-first we can assume that all nodes\n\t\t * here are single nodes Must return a single node to parents -- a\n\t\t * jQuery with synthetic span However, unwrap any other synthetic spans\n\t\t * in our children and pass them upwards\n\t\t *\n\t\t * @param {Array} nodes Mixed, some single nodes, some arrays of nodes.\n\t\t * @return {string}\n\t\t */\n\t\tconcat: function ( nodes ) {\n\t\t\tvar result = '';\n\n\t\t\t$.each( nodes, function ( i, node ) {\n\t\t\t\t// strings, integers, anything else\n\t\t\t\tresult += node;\n\t\t\t} );\n\n\t\t\treturn result;\n\t\t},\n\n\t\t/**\n\t\t * Return escaped replacement of correct index, or string if\n\t\t * unavailable. Note that we expect the parsed parameter to be\n\t\t * zero-based. i.e. $1 should have become [ 0 ]. if the specified\n\t\t * parameter is not found return the same string (e.g. \"$99\" ->\n\t\t * parameter 98 -> not found -> return \"$99\" ) TODO throw error if\n\t\t * nodes.length > 1 ?\n\t\t *\n\t\t * @param {Array} nodes One element, integer, n >= 0\n\t\t * @param {Array} replacements for $1, $2, ... $n\n\t\t * @return {string} replacement\n\t\t */\n\t\treplace: function ( nodes, replacements ) {\n\t\t\tvar index = parseInt( nodes[ 0 ], 10 );\n\n\t\t\tif ( index < replacements.length ) {\n\t\t\t\t// replacement is not a string, don't touch!\n\t\t\t\treturn replacements[ index ];\n\t\t\t} else {\n\t\t\t\t// index not found, fallback to displaying variable\n\t\t\t\treturn '$' + ( index + 1 );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Transform parsed structure into pluralization n.b. The first node may\n\t\t * be a non-integer (for instance, a string representing an Arabic\n\t\t * number). So convert it back with the current language's\n\t\t * convertNumber.\n\t\t *\n\t\t * @param {Array} nodes List [ {String|Number}, {String}, {String} ... ]\n\t\t * @return {string} selected pluralized form according to current\n\t\t * language.\n\t\t */\n\t\tplural: function ( nodes ) {\n\t\t\tvar count = parseFloat( this.language.convertNumber( nodes[ 0 ], 10 ) ),\n\t\t\t\tforms = nodes.slice( 1 );\n\n\t\t\treturn forms.length ? this.language.convertPlural( count, forms ) : '';\n\t\t},\n\n\t\t/**\n\t\t * Transform parsed structure into gender Usage\n\t\t * {{gender:gender|masculine|feminine|neutral}}.\n\t\t *\n\t\t * @param {Array} nodes List [ {String}, {String}, {String} , {String} ]\n\t\t * @return {string} selected gender form according to current language\n\t\t */\n\t\tgender: function ( nodes ) {\n\t\t\tvar gender = nodes[ 0 ],\n\t\t\t\tforms = nodes.slice( 1 );\n\n\t\t\treturn this.language.gender( gender, forms );\n\t\t},\n\n\t\t/**\n\t\t * Transform parsed structure into grammar conversion. Invoked by\n\t\t * putting {{grammar:form|word}} in a message\n\t\t *\n\t\t * @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]\n\t\t * @return {string} selected grammatical form according to current\n\t\t * language.\n\t\t */\n\t\tgrammar: function ( nodes ) {\n\t\t\tvar form = nodes[ 0 ],\n\t\t\t\tword = nodes[ 1 ];\n\n\t\t\treturn word && form && this.language.convertGrammar( word, form );\n\t\t}\n\t};\n\n\t$.extend( $.i18n.parser.emitter, new MessageParserEmitter() );\n}( jQuery ) );\n","/*!\n * jQuery Internationalization library\n *\n * Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar\n *\n * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do\n * anything special to choose one license or the other and you don't have to\n * notify anyone which license you are using. You are free to use\n * UniversalLanguageSelector in commercial projects as long as the copyright\n * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n\n( function ( $ ) {\n\t'use strict';\n\n\tvar MessageParser = function ( options ) {\n\t\tthis.options = $.extend( {}, $.i18n.parser.defaults, options );\n\t\tthis.language = $.i18n.languages[ String.locale ] || $.i18n.languages[ 'default' ];\n\t\tthis.emitter = $.i18n.parser.emitter;\n\t};\n\n\tMessageParser.prototype = {\n\n\t\tconstructor: MessageParser,\n\n\t\tsimpleParse: function ( message, parameters ) {\n\t\t\treturn message.replace( /\\$(\\d+)/g, function ( str, match ) {\n\t\t\t\tvar index = parseInt( match, 10 ) - 1;\n\n\t\t\t\treturn parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;\n\t\t\t} );\n\t\t},\n\n\t\tparse: function ( message, replacements ) {\n\t\t\tif ( message.indexOf( '{{' ) < 0 ) {\n\t\t\t\treturn this.simpleParse( message, replacements );\n\t\t\t}\n\n\t\t\tthis.emitter.language = $.i18n.languages[ $.i18n().locale ] ||\n\t\t\t\t$.i18n.languages[ 'default' ];\n\n\t\t\treturn this.emitter.emit( this.ast( message ), replacements );\n\t\t},\n\n\t\tast: function ( message ) {\n\t\t\tvar pipe, colon, backslash, anyCharacter, dollar, digits, regularLiteral,\n\t\t\t\tregularLiteralWithoutBar, regularLiteralWithoutSpace, escapedOrLiteralWithoutBar,\n\t\t\t\tescapedOrRegularLiteral, templateContents, templateName, openTemplate,\n\t\t\t\tcloseTemplate, expression, paramExpression, result,\n\t\t\t\tpos = 0;\n\n\t\t\t// Try parsers until one works, if none work return null\n\t\t\tfunction choice( parserSyntax ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar i, result;\n\n\t\t\t\t\tfor ( i = 0; i < parserSyntax.length; i++ ) {\n\t\t\t\t\t\tresult = parserSyntax[ i ]();\n\n\t\t\t\t\t\tif ( result !== null ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Try several parserSyntax-es in a row.\n\t\t\t// All must succeed; otherwise, return null.\n\t\t\t// This is the only eager one.\n\t\t\tfunction sequence( parserSyntax ) {\n\t\t\t\tvar i, res,\n\t\t\t\t\toriginalPos = pos,\n\t\t\t\t\tresult = [];\n\n\t\t\t\tfor ( i = 0; i < parserSyntax.length; i++ ) {\n\t\t\t\t\tres = parserSyntax[ i ]();\n\n\t\t\t\t\tif ( res === null ) {\n\t\t\t\t\t\tpos = originalPos;\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tresult.push( res );\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Run the same parser over and over until it fails.\n\t\t\t// Must succeed a minimum of n times; otherwise, return null.\n\t\t\tfunction nOrMore( n, p ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar originalPos = pos,\n\t\t\t\t\t\tresult = [],\n\t\t\t\t\t\tparsed = p();\n\n\t\t\t\t\twhile ( parsed !== null ) {\n\t\t\t\t\t\tresult.push( parsed );\n\t\t\t\t\t\tparsed = p();\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( result.length < n ) {\n\t\t\t\t\t\tpos = originalPos;\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Helpers -- just make parserSyntax out of simpler JS builtin types\n\n\t\t\tfunction makeStringParser( s ) {\n\t\t\t\tvar len = s.length;\n\n\t\t\t\treturn function () {\n\t\t\t\t\tvar result = null;\n\n\t\t\t\t\tif ( message.slice( pos, pos + len ) === s ) {\n\t\t\t\t\t\tresult = s;\n\t\t\t\t\t\tpos += len;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction makeRegexParser( regex ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar matches = message.slice( pos ).match( regex );\n\n\t\t\t\t\tif ( matches === null ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tpos += matches[ 0 ].length;\n\n\t\t\t\t\treturn matches[ 0 ];\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tpipe = makeStringParser( '|' );\n\t\t\tcolon = makeStringParser( ':' );\n\t\t\tbackslash = makeStringParser( '\\\\' );\n\t\t\tanyCharacter = makeRegexParser( /^./ );\n\t\t\tdollar = makeStringParser( '$' );\n\t\t\tdigits = makeRegexParser( /^\\d+/ );\n\t\t\tregularLiteral = makeRegexParser( /^[^{}[\\]$\\\\]/ );\n\t\t\tregularLiteralWithoutBar = makeRegexParser( /^[^{}[\\]$\\\\|]/ );\n\t\t\tregularLiteralWithoutSpace = makeRegexParser( /^[^{}[\\]$\\s]/ );\n\n\t\t\t// There is a general pattern:\n\t\t\t// parse a thing;\n\t\t\t// if it worked, apply transform,\n\t\t\t// otherwise return null.\n\t\t\t// But using this as a combinator seems to cause problems\n\t\t\t// when combined with nOrMore().\n\t\t\t// May be some scoping issue.\n\t\t\tfunction transform( p, fn ) {\n\t\t\t\treturn function () {\n\t\t\t\t\tvar result = p();\n\n\t\t\t\t\treturn result === null ? null : fn( result );\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Used to define \"literals\" within template parameters. The pipe\n\t\t\t// character is the parameter delimeter, so by default\n\t\t\t// it is not a literal in the parameter\n\t\t\tfunction literalWithoutBar() {\n\t\t\t\tvar result = nOrMore( 1, escapedOrLiteralWithoutBar )();\n\n\t\t\t\treturn result === null ? null : result.join( '' );\n\t\t\t}\n\n\t\t\tfunction literal() {\n\t\t\t\tvar result = nOrMore( 1, escapedOrRegularLiteral )();\n\n\t\t\t\treturn result === null ? null : result.join( '' );\n\t\t\t}\n\n\t\t\tfunction escapedLiteral() {\n\t\t\t\tvar result = sequence( [ backslash, anyCharacter ] );\n\n\t\t\t\treturn result === null ? null : result[ 1 ];\n\t\t\t}\n\n\t\t\tchoice( [ escapedLiteral, regularLiteralWithoutSpace ] );\n\t\t\tescapedOrLiteralWithoutBar = choice( [ escapedLiteral, regularLiteralWithoutBar ] );\n\t\t\tescapedOrRegularLiteral = choice( [ escapedLiteral, regularLiteral ] );\n\n\t\t\tfunction replacement() {\n\t\t\t\tvar result = sequence( [ dollar, digits ] );\n\n\t\t\t\tif ( result === null ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ 'REPLACE', parseInt( result[ 1 ], 10 ) - 1 ];\n\t\t\t}\n\n\t\t\ttemplateName = transform(\n\t\t\t\t// see $wgLegalTitleChars\n\t\t\t\t// not allowing : due to the need to catch \"PLURAL:$1\"\n\t\t\t\tmakeRegexParser( /^[ !\"$&'()*,./0-9;=?@A-Z^_`a-z~\\x80-\\xFF+-]+/ ),\n\n\t\t\t\tfunction ( result ) {\n\t\t\t\t\treturn result.toString();\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tfunction templateParam() {\n\t\t\t\tvar expr,\n\t\t\t\t\tresult = sequence( [ pipe, nOrMore( 0, paramExpression ) ] );\n\n\t\t\t\tif ( result === null ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\texpr = result[ 1 ];\n\n\t\t\t\t// use a \"CONCAT\" operator if there are multiple nodes,\n\t\t\t\t// otherwise return the first node, raw.\n\t\t\t\treturn expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[ 0 ];\n\t\t\t}\n\n\t\t\tfunction templateWithReplacement() {\n\t\t\t\tvar result = sequence( [ templateName, colon, replacement ] );\n\n\t\t\t\treturn result === null ? null : [ result[ 0 ], result[ 2 ] ];\n\t\t\t}\n\n\t\t\tfunction templateWithOutReplacement() {\n\t\t\t\tvar result = sequence( [ templateName, colon, paramExpression ] );\n\n\t\t\t\treturn result === null ? null : [ result[ 0 ], result[ 2 ] ];\n\t\t\t}\n\n\t\t\ttemplateContents = choice( [\n\t\t\t\tfunction () {\n\t\t\t\t\tvar res = sequence( [\n\t\t\t\t\t\t// templates can have placeholders for dynamic\n\t\t\t\t\t\t// replacement eg: {{PLURAL:$1|one car|$1 cars}}\n\t\t\t\t\t\t// or no placeholders eg:\n\t\t\t\t\t\t// {{GRAMMAR:genitive|{{SITENAME}}}\n\t\t\t\t\t\tchoice( [ templateWithReplacement, templateWithOutReplacement ] ),\n\t\t\t\t\t\tnOrMore( 0, templateParam )\n\t\t\t\t\t] );\n\n\t\t\t\t\treturn res === null ? null : res[ 0 ].concat( res[ 1 ] );\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tvar res = sequence( [ templateName, nOrMore( 0, templateParam ) ] );\n\n\t\t\t\t\tif ( res === null ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [ res[ 0 ] ].concat( res[ 1 ] );\n\t\t\t\t}\n\t\t\t] );\n\n\t\t\topenTemplate = makeStringParser( '{{' );\n\t\t\tcloseTemplate = makeStringParser( '}}' );\n\n\t\t\tfunction template() {\n\t\t\t\tvar result = sequence( [ openTemplate, templateContents, closeTemplate ] );\n\n\t\t\t\treturn result === null ? null : result[ 1 ];\n\t\t\t}\n\n\t\t\texpression = choice( [ template, replacement, literal ] );\n\t\t\tparamExpression = choice( [ template, replacement, literalWithoutBar ] );\n\n\t\t\tfunction start() {\n\t\t\t\tvar result = nOrMore( 0, expression )();\n\n\t\t\t\tif ( result === null ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn [ 'CONCAT' ].concat( result );\n\t\t\t}\n\n\t\t\tresult = start();\n\n\t\t\t/*\n\t\t\t * For success, the pos must have gotten to the end of the input\n\t\t\t * and returned a non-null.\n\t\t\t * n.b. This is part of language infrastructure, so we do not throw an\n\t\t\t * internationalizable message.\n\t\t\t */\n\t\t\tif ( result === null || pos !== message.length ) {\n\t\t\t\tthrow new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + message );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t};\n\n\t$.extend( $.i18n.parser, new MessageParser() );\n}( jQuery ) );","/*!\n * jQuery Internationalization library - Message Store\n *\n * Copyright (C) 2012 Santhosh Thottingal\n *\n * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to\n * choose one license or the other and you don't have to notify anyone which license you are using.\n * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright\n * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n\n( function ( $ ) {\n\t'use strict';\n\n\tvar MessageStore = function () {\n\t\tthis.messages = {};\n\t\tthis.sources = {};\n\t};\n\n\tfunction jsonMessageLoader( url ) {\n\t\tvar deferred = $.Deferred();\n\n\t\t$.getJSON( url )\n\t\t\t.done( deferred.resolve )\n\t\t\t.fail( function ( jqxhr, settings, exception ) {\n\t\t\t\t$.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );\n\t\t\t\t// Ignore 404 exception, because we are handling fallabacks explicitly\n\t\t\t\tdeferred.resolve();\n\t\t\t} );\n\n\t\treturn deferred.promise();\n\t}\n\n\t/**\n\t * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading\n\t */\n\tMessageStore.prototype = {\n\n\t\t/**\n\t\t * General message loading API This can take a URL string for\n\t\t * the json formatted messages.\n\t\t * load('path/to/all_localizations.json');\n\t\t *\n\t\t * This can also load a localization file for a locale \n\t\t * load( 'path/to/de-messages.json', 'de' );\n\t\t * \n\t\t * A data object containing message key- message translation mappings\n\t\t * can also be passed Eg:\n\t\t * \n\t\t * load( { 'hello' : 'Hello' }, optionalLocale );\n\t\t * If the data argument is\n\t\t * null/undefined/false,\n\t\t * all cached messages for the i18n instance will get reset.\n\t\t *\n\t\t * @param {string|Object} source\n\t\t * @param {string} locale Language tag\n\t\t * @return {jQuery.Promise}\n\t\t */\n\t\tload: function ( source, locale ) {\n\t\t\tvar key = null,\n\t\t\t\tdeferred = null,\n\t\t\t\tdeferreds = [],\n\t\t\t\tmessageStore = this;\n\n\t\t\tif ( typeof source === 'string' ) {\n\t\t\t\t// This is a URL to the messages file.\n\t\t\t\t$.i18n.log( 'Loading messages from: ' + source );\n\t\t\t\tdeferred = jsonMessageLoader( source )\n\t\t\t\t\t.done( function ( localization ) {\n\t\t\t\t\t\tmessageStore.set( locale, localization );\n\t\t\t\t\t} );\n\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\n\t\t\tif ( locale ) {\n\t\t\t\t// source is an key-value pair of messages for given locale\n\t\t\t\tmessageStore.set( locale, source );\n\n\t\t\t\treturn $.Deferred().resolve();\n\t\t\t} else {\n\t\t\t\t// source is a key-value pair of locales and their source\n\t\t\t\tfor ( key in source ) {\n\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, key ) ) {\n\t\t\t\t\t\tlocale = key;\n\t\t\t\t\t\t// No {locale} given, assume data is a group of languages,\n\t\t\t\t\t\t// call this function again for each language.\n\t\t\t\t\t\tdeferreds.push( messageStore.load( source[ key ], locale ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $.when.apply( $, deferreds );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Set messages to the given locale.\n\t\t * If locale exists, add messages to the locale.\n\t\t *\n\t\t * @param {string} locale\n\t\t * @param {Object} messages\n\t\t */\n\t\tset: function ( locale, messages ) {\n\t\t\tif ( !this.messages[ locale ] ) {\n\t\t\t\tthis.messages[ locale ] = messages;\n\t\t\t} else {\n\t\t\t\tthis.messages[ locale ] = $.extend( this.messages[ locale ], messages );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t * @param {string} locale\n\t\t * @param {string} messageKey\n\t\t * @return {boolean}\n\t\t */\n\t\tget: function ( locale, messageKey ) {\n\t\t\treturn this.messages[ locale ] && this.messages[ locale ][ messageKey ];\n\t\t}\n\t};\n\n\t$.extend( $.i18n.messageStore, new MessageStore() );\n}( jQuery ) );\n","/*!\n * jQuery Internationalization library\n *\n * Copyright (C) 2012 Santhosh Thottingal\n *\n * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do\n * anything special to choose one license or the other and you don't have to\n * notify anyone which license you are using. You are free to use\n * UniversalLanguageSelector in commercial projects as long as the copyright\n * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.\n *\n * @licence GNU General Public Licence 2.0 or later\n * @licence MIT License\n */\n\n( function ( $ ) {\n\t'use strict';\n\n\tvar I18N,\n\t\tslice = Array.prototype.slice;\n\t/**\n\t * @constructor\n\t * @param {Object} options\n\t */\n\tI18N = function ( options ) {\n\t\t// Load defaults\n\t\tthis.options = $.extend( {}, I18N.defaults, options );\n\n\t\tthis.parser = this.options.parser;\n\t\tthis.locale = this.options.locale;\n\t\tthis.messageStore = this.options.messageStore;\n\t\tthis.languages = {};\n\t};\n\n\tI18N.prototype = {\n\t\t/**\n\t\t * Localize a given messageKey to a locale.\n\t\t * @param {String} messageKey\n\t\t * @return {String} Localized message\n\t\t */\n\t\tlocalize: function ( messageKey ) {\n\t\t\tvar localeParts, localePartIndex, locale, fallbackIndex,\n\t\t\t\ttryingLocale, message;\n\n\t\t\tlocale = this.locale;\n\t\t\tfallbackIndex = 0;\n\n\t\t\twhile ( locale ) {\n\t\t\t\t// Iterate through locales starting at most-specific until\n\t\t\t\t// localization is found. As in fi-Latn-FI, fi-Latn and fi.\n\t\t\t\tlocaleParts = locale.split( '-' );\n\t\t\t\tlocalePartIndex = localeParts.length;\n\n\t\t\t\tdo {\n\t\t\t\t\ttryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );\n\t\t\t\t\tmessage = this.messageStore.get( tryingLocale, messageKey );\n\n\t\t\t\t\tif ( message ) {\n\t\t\t\t\t\treturn message;\n\t\t\t\t\t}\n\n\t\t\t\t\tlocalePartIndex--;\n\t\t\t\t} while ( localePartIndex );\n\n\t\t\t\tif ( locale === 'en' ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tlocale = ( $.i18n.fallbacks[ this.locale ] &&\n\t\t\t\t\t\t$.i18n.fallbacks[ this.locale ][ fallbackIndex ] ) ||\n\t\t\t\t\t\tthis.options.fallbackLocale;\n\t\t\t\t$.i18n.log( 'Trying fallback locale for ' + this.locale + ': ' + locale + ' (' + messageKey + ')' );\n\n\t\t\t\tfallbackIndex++;\n\t\t\t}\n\n\t\t\t// key not found\n\t\t\treturn '';\n\t\t},\n\n\t\t/*\n\t\t * Destroy the i18n instance.\n\t\t */\n\t\tdestroy: function () {\n\t\t\t$.removeData( document, 'i18n' );\n\t\t},\n\n\t\t/**\n\t\t * General message loading API This can take a URL string for\n\t\t * the json formatted messages. Example:\n\t\t * load('path/to/all_localizations.json');\n\t\t *\n\t\t * To load a localization file for a locale:\n\t\t * \n\t\t * load('path/to/de-messages.json', 'de' );\n\t\t * \n\t\t *\n\t\t * To load a localization file from a directory:\n\t\t * \n\t\t * load('path/to/i18n/directory', 'de' );\n\t\t * \n\t\t * The above method has the advantage of fallback resolution.\n\t\t * ie, it will automatically load the fallback locales for de.\n\t\t * For most usecases, this is the recommended method.\n\t\t * It is optional to have trailing slash at end.\n\t\t *\n\t\t * A data object containing message key- message translation mappings\n\t\t * can also be passed. Example:\n\t\t * \n\t\t * load( { 'hello' : 'Hello' }, optionalLocale );\n\t\t * \n\t\t *\n\t\t * A source map containing key-value pair of languagename and locations\n\t\t * can also be passed. Example:\n\t\t * \n\t\t * load( {\n\t\t * bn: 'i18n/bn.json',\n\t\t * he: 'i18n/he.json',\n\t\t * en: 'i18n/en.json'\n\t\t * } )\n\t\t * \n\t\t *\n\t\t * If the data argument is null/undefined/false,\n\t\t * all cached messages for the i18n instance will get reset.\n\t\t *\n\t\t * @param {string|Object} source\n\t\t * @param {string} locale Language tag\n\t\t * @return {jQuery.Promise}\n\t\t */\n\t\tload: function ( source, locale ) {\n\t\t\tvar fallbackLocales, locIndex, fallbackLocale, sourceMap = {};\n\t\t\tif ( !source && !locale ) {\n\t\t\t\tsource = 'i18n/' + $.i18n().locale + '.json';\n\t\t\t\tlocale = $.i18n().locale;\n\t\t\t}\n\t\t\tif ( typeof source === 'string' &&\n\t\t\t\t// source extension should be json, but can have query params after that.\n\t\t\t\tsource.split( '?' )[ 0 ].split( '.' ).pop() !== 'json'\n\t\t\t) {\n\t\t\t\t// Load specified locale then check for fallbacks when directory is\n\t\t\t\t// specified in load()\n\t\t\t\tsourceMap[ locale ] = source + '/' + locale + '.json';\n\t\t\t\tfallbackLocales = ( $.i18n.fallbacks[ locale ] || [] )\n\t\t\t\t\t.concat( this.options.fallbackLocale );\n\t\t\t\tfor ( locIndex = 0; locIndex < fallbackLocales.length; locIndex++ ) {\n\t\t\t\t\tfallbackLocale = fallbackLocales[ locIndex ];\n\t\t\t\t\tsourceMap[ fallbackLocale ] = source + '/' + fallbackLocale + '.json';\n\t\t\t\t}\n\t\t\t\treturn this.load( sourceMap );\n\t\t\t} else {\n\t\t\t\treturn this.messageStore.load( source, locale );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Does parameter and magic word substitution.\n\t\t *\n\t\t * @param {string} key Message key\n\t\t * @param {Array} parameters Message parameters\n\t\t * @return {string}\n\t\t */\n\t\tparse: function ( key, parameters ) {\n\t\t\tvar message = this.localize( key );\n\t\t\t// FIXME: This changes the state of the I18N object,\n\t\t\t// should probably not change the 'this.parser' but just\n\t\t\t// pass it to the parser.\n\t\t\tthis.parser.language = $.i18n.languages[ $.i18n().locale ] || $.i18n.languages[ 'default' ];\n\t\t\tif ( message === '' ) {\n\t\t\t\tmessage = key;\n\t\t\t}\n\t\t\treturn this.parser.parse( message, parameters );\n\t\t}\n\t};\n\n\t/**\n\t * Process a message from the $.I18N instance\n\t * for the current document, stored in jQuery.data(document).\n\t *\n\t * @param {string} key Key of the message.\n\t * @param {string} param1 [param...] Variadic list of parameters for {key}.\n\t * @return {string|$.I18N} Parsed message, or if no key was given\n\t * the instance of $.I18N is returned.\n\t */\n\t$.i18n = function ( key, param1 ) {\n\t\tvar parameters,\n\t\t\ti18n = $.data( document, 'i18n' ),\n\t\t\toptions = typeof key === 'object' && key;\n\n\t\t// If the locale option for this call is different then the setup so far,\n\t\t// update it automatically. This doesn't just change the context for this\n\t\t// call but for all future call as well.\n\t\t// If there is no i18n setup yet, don't do this. It will be taken care of\n\t\t// by the `new I18N` construction below.\n\t\t// NOTE: It should only change language for this one call.\n\t\t// Then cache instances of I18N somewhere.\n\t\tif ( options && options.locale && i18n && i18n.locale !== options.locale ) {\n\t\t\ti18n.locale = options.locale;\n\t\t}\n\n\t\tif ( !i18n ) {\n\t\t\ti18n = new I18N( options );\n\t\t\t$.data( document, 'i18n', i18n );\n\t\t}\n\n\t\tif ( typeof key === 'string' ) {\n\t\t\tif ( param1 !== undefined ) {\n\t\t\t\tparameters = slice.call( arguments, 1 );\n\t\t\t} else {\n\t\t\t\tparameters = [];\n\t\t\t}\n\n\t\t\treturn i18n.parse( key, parameters );\n\t\t} else {\n\t\t\t// FIXME: remove this feature/bug.\n\t\t\treturn i18n;\n\t\t}\n\t};\n\n\t$.fn.i18n = function () {\n\t\tvar i18n = $.data( document, 'i18n' );\n\n\t\tif ( !i18n ) {\n\t\t\ti18n = new I18N();\n\t\t\t$.data( document, 'i18n', i18n );\n\t\t}\n\n\t\treturn this.each( function () {\n\t\t\tvar $this = $( this ),\n\t\t\t\tmessageKey = $this.data( 'i18n' ),\n\t\t\t\tlBracket, rBracket, type, key;\n\n\t\t\tif ( messageKey ) {\n\t\t\t\tlBracket = messageKey.indexOf( '[' );\n\t\t\t\trBracket = messageKey.indexOf( ']' );\n\t\t\t\tif ( lBracket !== -1 && rBracket !== -1 && lBracket < rBracket ) {\n\t\t\t\t\ttype = messageKey.slice( lBracket + 1, rBracket );\n\t\t\t\t\tkey = messageKey.slice( rBracket + 1 );\n\t\t\t\t\tif ( type === 'html' ) {\n\t\t\t\t\t\t$this.html( i18n.parse( key ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.attr( type, i18n.parse( key ) );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$this.text( i18n.parse( messageKey ) );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$this.find( '[data-i18n]' ).i18n();\n\t\t\t}\n\t\t} );\n\t};\n\n\tfunction getDefaultLocale() {\n\t\tvar nav, locale = $( 'html' ).attr( 'lang' );\n\n\t\tif ( !locale ) {\n\t\t\tif ( typeof window.navigator !== undefined ) {\n\t\t\t\tnav = window.navigator;\n\t\t\t\tlocale = nav.language || nav.userLanguage || '';\n\t\t\t} else {\n\t\t\t\tlocale = '';\n\t\t\t}\n\t\t}\n\t\treturn locale;\n\t}\n\n\t$.i18n.languages = {};\n\t$.i18n.messageStore = $.i18n.messageStore || {};\n\t$.i18n.parser = {\n\t\t// The default parser only handles variable substitution\n\t\tparse: function ( message, parameters ) {\n\t\t\treturn message.replace( /\\$(\\d+)/g, function ( str, match ) {\n\t\t\t\tvar index = parseInt( match, 10 ) - 1;\n\t\t\t\treturn parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;\n\t\t\t} );\n\t\t},\n\t\temitter: {}\n\t};\n\t$.i18n.fallbacks = {};\n\t$.i18n.debug = false;\n\t$.i18n.log = function ( /* arguments */ ) {\n\t\tif ( window.console && $.i18n.debug ) {\n\t\t\twindow.console.log.apply( window.console, arguments );\n\t\t}\n\t};\n\t/* Static members */\n\tI18N.defaults = {\n\t\tlocale: getDefaultLocale(),\n\t\tfallbackLocale: 'en',\n\t\tparser: $.i18n.parser,\n\t\tmessageStore: $.i18n.messageStore\n\t};\n\n\t// Expose constructor\n\t$.i18n.constructor = I18N;\n}( jQuery ) );","/*!\n * jQuery idleTimer plugin\n * version 0.9.100511\n * by Paul Irish.\n * http://github.com/paulirish/yui-misc/tree/\n * MIT license\n\n * adapted from YUI idle timer by nzakas:\n * http://github.com/nzakas/yui-misc/\n*/\n/*\n * Copyright (c) 2009 Nicholas C. Zakas\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* updated to fix Chrome setTimeout issue by Zaid Zawaideh */\n\n // API available in <= v0.8\n /*******************************\n\n // idleTimer() takes an optional argument that defines the idle timeout\n // timeout is in milliseconds; defaults to 30000\n $.idleTimer(10000);\n\n\n $(document).bind(\"idle.idleTimer\", function(){\n // function you want to fire when the user goes idle\n });\n\n\n $(document).bind(\"active.idleTimer\", function(){\n // function you want to fire when the user becomes active again\n });\n\n // pass the string 'destroy' to stop the timer\n $.idleTimer('destroy');\n\n // you can query if the user is idle or not with data()\n $.data(document,'idleTimer'); // 'idle' or 'active'\n\n // you can get time elapsed since user when idle/active\n $.idleTimer('getElapsedTime'); // time since state change in ms\n\n ********/\n\n\n\n // API available in >= v0.9\n /*************************\n\n // bind to specific elements, allows for multiple timer instances\n $(elem).idleTimer(timeout|'destroy'|'getElapsedTime');\n $.data(elem,'idleTimer'); // 'idle' or 'active'\n\n // if you're using the old $.idleTimer api, you should not do $(document).idleTimer(...)\n\n // element bound timers will only watch for events inside of them.\n // you may just want page-level activity, in which case you may set up\n // your timers on document, document.documentElement, and document.body\n\n // You can optionally provide a second argument to override certain options.\n // Here are the defaults, so you can omit any or all of them.\n $(elem).idleTimer(timeout, {\n startImmediately: true, //starts a timeout as soon as the timer is set up; otherwise it waits for the first event.\n idle: false, //indicates if the user is idle\n enabled: true, //indicates if the idle timer is enabled\n events: 'mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove' // activity is one of these events\n });\n\n ********/\n\n(function($){\n\n$.idleTimer = function(newTimeout, elem, opts){\n\n // defaults that are to be stored as instance props on the elem\n\n\topts = $.extend({\n\t\tstartImmediately: true, //starts a timeout as soon as the timer is set up\n\t\tidle: false, //indicates if the user is idle\n\t\tenabled: true, //indicates if the idle timer is enabled\n\t\ttimeout: 30000, //the amount of time (ms) before the user is considered idle\n\t\tevents: 'mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove' // activity is one of these events\n\t}, opts);\n\n\n elem = elem || document;\n\n /* (intentionally not documented)\n * Toggles the idle state and fires an appropriate event.\n * @return {void}\n */\n var toggleIdleState = function(myelem){\n\n // curse you, mozilla setTimeout lateness bug!\n if (typeof myelem === 'number'){\n myelem = undefined;\n }\n\n var obj = $.data(myelem || elem,'idleTimerObj');\n\n //toggle the state\n obj.idle = !obj.idle;\n\n // reset timeout \n var elapsed = (+new Date()) - obj.olddate;\n obj.olddate = +new Date();\n\n // handle Chrome always triggering idle after js alert or comfirm popup\n if (obj.idle && (elapsed < opts.timeout)) {\n obj.idle = false;\n clearTimeout($.idleTimer.tId);\n if (opts.enabled)\n $.idleTimer.tId = setTimeout(toggleIdleState, opts.timeout);\n return;\n }\n \n //fire appropriate event\n\n // create a custom event, but first, store the new state on the element\n // and then append that string to a namespace\n var event = jQuery.Event( $.data(elem,'idleTimer', obj.idle ? \"idle\" : \"active\" ) + '.idleTimer' );\n\n // we do want this to bubble, at least as a temporary fix for jQuery 1.7\n // event.stopPropagation();\n $(elem).trigger(event);\n },\n\n /**\n * Stops the idle timer. This removes appropriate event handlers\n * and cancels any pending timeouts.\n * @return {void}\n * @method stop\n * @static\n */\n stop = function(elem){\n\n var obj = $.data(elem,'idleTimerObj') || {};\n\n //set to disabled\n obj.enabled = false;\n\n //clear any pending timeouts\n clearTimeout(obj.tId);\n\n //detach the event handlers\n $(elem).off('.idleTimer');\n },\n\n\n /* (intentionally not documented)\n * Handles a user event indicating that the user isn't idle.\n * @param {Event} event A DOM2-normalized event object.\n * @return {void}\n */\n handleUserEvent = function(){\n\n var obj = $.data(this,'idleTimerObj');\n\n //clear any existing timeout\n clearTimeout(obj.tId);\n\n\n\n //if the idle timer is enabled\n if (obj.enabled){\n\n\n //if it's idle, that means the user is no longer idle\n if (obj.idle){\n toggleIdleState(this);\n }\n\n //set a new timeout\n obj.tId = setTimeout(toggleIdleState, obj.timeout);\n\n }\n };\n\n\n /**\n * Starts the idle timer. This adds appropriate event handlers\n * and starts the first timeout.\n * @param {int} newTimeout (Optional) A new value for the timeout period in ms.\n * @return {void}\n * @method $.idleTimer\n * @static\n */\n\n\n var obj = $.data(elem,'idleTimerObj') || {};\n\n obj.olddate = obj.olddate || +new Date();\n\n //assign a new timeout if necessary\n if (typeof newTimeout === \"number\"){\n opts.timeout = newTimeout;\n } else if (newTimeout === 'destroy') {\n stop(elem);\n return this;\n } else if (newTimeout === 'getElapsedTime'){\n return (+new Date()) - obj.olddate;\n }\n\n //assign appropriate event handlers\n $(elem).on($.trim((opts.events+' ').split(' ').join('.idleTimer ')),handleUserEvent);\n\n\n obj.idle = opts.idle;\n obj.enabled = opts.enabled;\n obj.timeout = opts.timeout;\n\n\n //set a timeout to toggle state. May wish to omit this in some situations\n\tif (opts.startImmediately) {\n\t obj.tId = setTimeout(toggleIdleState, obj.timeout);\n\t}\n\n // assume the user is active for the first x seconds.\n $.data(elem,'idleTimer',\"active\");\n\n // store our instance on the object\n $.data(elem,'idleTimerObj',obj);\n\n\n\n}; // end of $.idleTimer()\n\n\n// v0.9 API for defining multiple timers.\n$.fn.idleTimer = function(newTimeout,opts){\n\t// Allow omission of opts for backward compatibility\n\tif (!opts) {\n\t\topts = {};\n\t}\n\n if(this[0]){\n $.idleTimer(newTimeout,this[0],opts);\n }\n\n return this;\n};\n\n\n})(jQuery);\n","/*global variable declarations*/\n\n\"use strict\";\n\nimport \"../css/user-highlights.css\";\n\nfunction getCompletions() {\n // Get the completion status\n if (\n window.location.href.match(\n /(\\/index.html|toctree.html|genindex.html|navhelp.html|toc.html|assignments.html|Exercises.html)/\n )\n ) {\n return;\n }\n\n var currentPathname = window.location.pathname;\n if (currentPathname.indexOf(\"?\") !== -1) {\n currentPathname = currentPathname.substring(\n 0,\n currentPathname.lastIndexOf(\"?\")\n );\n }\n var data = {\n lastPageUrl: currentPathname,\n isPtxBook: isPreTeXt(),\n };\n jQuery\n .ajax({\n url: `${eBookConfig.new_server_prefix}/logger/getCompletionStatus`,\n data: data,\n async: false,\n })\n .done(function (data) {\n if (data != \"None\") {\n var completionData = data.detail;\n var completionClass, completionMsg;\n if (completionData[0].completionStatus == 1) {\n completionClass = \"buttonConfirmCompletion\";\n completionMsg =\n \" Completed. Well Done!\";\n } else {\n completionClass = \"buttonAskCompletion\";\n completionMsg = \"Mark as Completed\";\n }\n let scp = document.querySelector(\"#scprogresscontainer\");\n if (scp) {\n scp.classList.add(\"ptx-runestone-container\");\n }\n $(\"#scprogresscontainer\").append(\n '
    \"\n );\n }\n });\n}\n\nfunction showLastPositionBanner() {\n var lastPositionVal = $.getUrlVar(\"lastPosition\");\n if (typeof lastPositionVal !== \"undefined\") {\n $(\"body\").append(\n ''\n );\n $(\"html, body\").animate({ scrollTop: parseInt(lastPositionVal) }, 1000);\n }\n}\n\nfunction addNavigationAndCompletionButtons() {\n if (\n window.location.href.match(\n /(index.html|genindex.html|navhelp.html|toc.html|assignments.html|Exercises.html|toctree.html)/\n )\n ) {\n return;\n }\n var navLinkBgRightHiddenPosition = -$(\"#navLinkBgRight\").outerWidth() - 5;\n var navLinkBgRightHalfOpen;\n var navLinkBgRightFullOpen = 0;\n\n if ($(\"#completionButton\").hasClass(\"buttonAskCompletion\")) {\n navLinkBgRightHalfOpen = navLinkBgRightHiddenPosition + 70;\n } else if ($(\"#completionButton\").hasClass(\"buttonConfirmCompletion\")) {\n navLinkBgRightHalfOpen = 0;\n }\n var relationsNextIconInitialPosition = $(\"#relations-next\").css(\"right\");\n var relationsNextIconNewPosition = -(navLinkBgRightHiddenPosition + 35);\n\n $(\"#navLinkBgRight\").css(\"right\", navLinkBgRightHiddenPosition).show();\n var navBgShown = false;\n $(window).scroll(function () {\n if (\n $(window).scrollTop() + $(window).height() ==\n $(document).height()\n ) {\n $(\"#navLinkBgRight\").animate(\n { right: navLinkBgRightHalfOpen },\n 200\n );\n $(\"#navLinkBgLeft\").animate({ left: \"0px\" }, 200);\n if ($(\"#completionButton\").hasClass(\"buttonConfirmCompletion\")) {\n $(\"#relations-next\").animate(\n { right: relationsNextIconNewPosition },\n 200\n );\n }\n navBgShown = true;\n } else if (navBgShown) {\n $(\"#navLinkBgRight\").animate(\n { right: navLinkBgRightHiddenPosition },\n 200\n );\n $(\"#navLinkBgLeft\").animate({ left: \"-65px\" }, 200);\n $(\"#relations-next\").animate({\n right: relationsNextIconInitialPosition,\n });\n navBgShown = false;\n }\n });\n\n var completionFlag = 0;\n if ($(\"#completionButton\").hasClass(\"buttonAskCompletion\")) {\n completionFlag = 0;\n } else {\n completionFlag = 1;\n }\n // Make sure we mark this page as visited regardless of how flakey\n // the onunload handlers become.\n processPageState(completionFlag, true, false, false);\n $(\"#completionButton\").on(\"click\", function () {\n var markingComplete = false;\n var markingIncomplete = false;\n if ($(this).hasClass(\"buttonAskCompletion\")) {\n $(this)\n .removeClass(\"buttonAskCompletion\")\n .addClass(\"buttonConfirmCompletion\")\n .html(\n \" Completed. Well Done!\"\n );\n $(\"#navLinkBgRight\").animate({ right: navLinkBgRightFullOpen });\n $(\"#relations-next\").animate({\n right: relationsNextIconNewPosition,\n });\n navLinkBgRightHalfOpen = 0;\n completionFlag = 1;\n markingComplete = true;\n } else if ($(this).hasClass(\"buttonConfirmCompletion\")) {\n $(this)\n .removeClass(\"buttonConfirmCompletion\")\n .addClass(\"buttonAskCompletion\")\n .html(\"Mark as Completed\");\n navLinkBgRightHalfOpen = navLinkBgRightHiddenPosition + 70;\n $(\"#navLinkBgRight\").animate({ right: navLinkBgRightHalfOpen });\n $(\"#relations-next\").animate({\n right: relationsNextIconInitialPosition,\n });\n completionFlag = 0;\n markingIncomplete = true;\n }\n processPageState(\n completionFlag,\n false,\n markingComplete,\n markingIncomplete\n );\n });\n\n // we cannot afford to do this at both load and unload especially as users\n // go from page to page. This just doubles the load. So, try without this one.\n // $(window).on(\"beforeunload\", function (e) {\n // if (completionFlag == 0) {\n // processPageState(completionFlag, false, false, false);\n // }\n // });\n}\n\n// _ decorateTableOfContents\n// -------------------------\nfunction decorateTableOfContents() {\n if (\n window.location.href.toLowerCase().indexOf(\"toc.html\") != -1 ||\n window.location.href.toLowerCase().indexOf(\"index.html\") != -1 ||\n window.location.href.toLowerCase().indexOf(\"frontmatter\") != -1\n ) {\n if (!isPreTeXt()) {\n jQuery.get(\n `${eBookConfig.new_server_prefix}/logger/getAllCompletionStatus`,\n function (data) {\n var subChapterList;\n if (data != \"None\") {\n subChapterList = data.detail;\n\n var allSubChapterURLs = $(\"#main-content div li a\");\n $.each(subChapterList, function (index, item) {\n for (var s = 0; s < allSubChapterURLs.length; s++) {\n if (\n allSubChapterURLs[s].href.indexOf(\n item.chapterName +\n \"/\" +\n item.subChapterName\n ) != -1\n ) {\n if (item.completionStatus == 1) {\n $(allSubChapterURLs[s].parentElement)\n .addClass(\"completed\")\n .append(\n '- Completed this topic on ' +\n item.endDate +\n \"\"\n )\n .children()\n .first()\n .hover(\n function () {\n $(this)\n .next(\n \".infoTextCompleted\"\n )\n .show();\n },\n function () {\n $(this)\n .next(\n \".infoTextCompleted\"\n )\n .hide();\n }\n );\n } else if (item.completionStatus == 0) {\n $(allSubChapterURLs[s].parentElement)\n .addClass(\"active\")\n .append(\n 'Last read this topic on ' +\n item.endDate +\n \"\"\n )\n .children()\n .first()\n .hover(\n function () {\n $(this)\n .next(\".infoTextActive\")\n .show();\n },\n function () {\n $(this)\n .next(\".infoTextActive\")\n .hide();\n }\n );\n }\n }\n }\n });\n }\n }\n );\n }\n var data = { course: eBookConfig.course };\n jQuery.get(\n `${eBookConfig.new_server_prefix}/logger/getlastpage`,\n data,\n function (data) {\n var lastPageData;\n if (data != \"None\") {\n lastPageData = data.detail;\n if (lastPageData.lastPageChapter != null) {\n $(\"#continue-reading\")\n .show()\n .html(\n '
    You were Last Reading: ' +\n lastPageData.lastPageChapter +\n (lastPageData.lastPageSubchapter\n ? \" > \" +\n lastPageData.lastPageSubchapter\n : \"\") +\n ' Continue Reading
    '\n );\n }\n }\n }\n );\n }\n}\n\nfunction enableCompletions() {\n getCompletions();\n showLastPositionBanner();\n addNavigationAndCompletionButtons();\n decorateTableOfContents();\n}\n\n// call enable user highlights after login\n$(document).on(\"runestone:login\", enableCompletions);\n\nfunction isPreTeXt() {\n let ptxMarker = document.querySelector(\"body.pretext\");\n if (ptxMarker) {\n return true;\n } else {\n return false;\n }\n}\n// _ processPageState\n// -------------------------\nfunction processPageState(\n completionFlag,\n pageLoad,\n markingComplete,\n markingIncomplete\n) {\n /*Log last page visited*/\n var currentPathname = window.location.pathname;\n if (currentPathname.indexOf(\"?\") !== -1) {\n currentPathname = currentPathname.substring(\n 0,\n currentPathname.lastIndexOf(\"?\")\n );\n }\n // Is this a ptx book?\n let isPtxBook = isPreTeXt();\n var data = {\n lastPageUrl: currentPathname,\n lastPageScrollLocation: Math.round($(window).scrollTop()),\n completionFlag: completionFlag,\n pageLoad: pageLoad,\n markingComplete: markingComplete,\n markingIncomplete: markingIncomplete,\n course: eBookConfig.course,\n isPtxBook: isPtxBook,\n };\n $(document).ajaxError(function (e, jqhxr, settings, exception) {\n console.log(\"Request Failed for \" + settings.url);\n console.log(e);\n });\n jQuery.ajax({\n url: `${eBookConfig.new_server_prefix}/logger/updatelastpage`,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n data: JSON.stringify(data),\n method: \"POST\",\n async: true,\n });\n}\n\n$.extend({\n getUrlVars: function () {\n var vars = [],\n hash;\n var hashes = window.location.search\n .slice(window.location.search.indexOf(\"?\") + 1)\n .split(\"&\");\n for (var i = 0; i < hashes.length; i++) {\n hash = hashes[i].split(\"=\");\n vars.push(hash[0]);\n vars[hash[0]] = hash[1];\n }\n return vars;\n },\n getUrlVar: function (name) {\n return $.getUrlVars()[name];\n },\n});\n","/*\n Support functions for PreTeXt books running on Runestone\n\n*/\n\nimport RunestoneBase from \"./runestonebase.js\";\n\nfunction setupPTXEvents() {\n let rb = new RunestoneBase();\n // log an event when a knowl is opened.\n document.querySelectorAll(\"[data-knowl]\").forEach((el) => {\n el.addEventListener(\"click\", function () {\n let div_id = el.getAttribute(\"data-knowl\");\n rb.logBookEvent({ event: \"knowl\", act: \"click\", div_id: div_id });\n });\n });\n let born_hidden = document.querySelectorAll(\"details.born-hidden-knowl\");\n born_hidden.forEach((el) => {\n // log an event when a knowl is opened that was born hidden\n el.addEventListener(\"toggle\", function () {\n if (el.open) {\n let div_id = el.id;\n rb.logBookEvent({ event: \"knowl\", act: \"open\", div_id: div_id });\n }\n });\n });\n // log an event when a sage cell is evaluated\n document.querySelectorAll(\".sagecell_evalButton\").forEach((btn) => {\n btn.addEventListener(\"click\", function () {\n let container = btn.closest(\".ptx-sagecell\");\n let codeInput = container ? container.querySelector(\".sagecell_input\") : null;\n let code = codeInput ? codeInput.textContent : \"\";\n let div_id = container ? container.id : null;\n if (! div_id) {\n console.warn(\"Could not find container or div_id for sagecell button\");\n return;\n }\n\n rb.logBookEvent({ event: \"sage\", act: \"run\", div_id: div_id });\n });\n });\n if (typeof eBookConfig !== \"undefined\" && !eBookConfig.isInstructor) {\n document.querySelectorAll(\".commentary\").forEach((el) => {\n el.style.display = \"none\";\n });\n }\n}\n\nwindow.addEventListener(\"load\", function () {\n console.log(\"setting up pretext\");\n setupPTXEvents();\n let wrap = document.getElementById(\"primary-navbar-sticky-wrapper\");\n if (wrap) {\n wrap.style.overflow = \"visible\";\n }\n});\n","import RunestoneBase from \"../../common/js/runestonebase.js\";\n\nexport class SpliceWrapper extends RunestoneBase {\n constructor() {\n super();\n this.initSplice();\n }\n\n initSplice() {\n // SPLICE Events\n window.addEventListener(\"message\", async (event) => {\n \n var sourceIframe = this.sendingIframe(event);\n console.log(`SpliceWrapper: received message subject: ${event.data.subject} from iframe: ${sourceIframe ? sourceIframe.id : \"unknown\"}`);\n if (event.data.subject == \"SPLICE.reportScoreAndState\") {\n this.handleScoreAndState(event, sourceIframe);\n } else if (event.data.subject == \"SPLICE.sendEvent\") {\n this.handleSpliceEvent(event, sourceIframe);\n } else if (event.data.subject == \"SPLICE.getState\") {\n await this.handleGetState(event, sourceIframe);\n } else if (\n event.origin === \"https://www.myopenmath.com\" &&\n typeof event.data === \"string\" &&\n event.data.indexOf(\"lti.ext.imathas.result\") != -1\n ) {\n // proof of concept for My Open Math\n let msgdata = JSON.parse(event.data);\n let jwt = basicParseJwt(msgdata.jwt);\n console.log(\n \"Result received from frame \" +\n msgdata.frame_id +\n \" with score \" +\n jwt.score\n );\n // todo send score to server\n // does MOM have a way to get the state?\n // todo send state to server\n }\n });\n }\n\n getUniqueID(event, frame) {\n // Determine the unique identifier for this activity\n // The SPLICE protocol allows for two possibilities\n // 1. activity_id is the unique id as assigned by the provider\n // 2. activity_id is the iframe src url\n // if the activity_id is set there may also be another attribute called domain\n // On Runestone we will try to map the activity to the div_id of the enclosing RS component\n // if possible, otherwise we will use the activity_id or iframe src\n // If an interactive is included in an exercises this allows us to map the score\n // to the id the instructor used to assign the problem.\n if (frame) {\n let rsDiv = frame.closest(\"[data-component]\");\n if (rsDiv) {\n return rsDiv.id;\n }\n }\n let location = event.data.activity_id;\n if (!location) {\n if (frame) {\n location = frame.src;\n } else {\n location = \"unknown\";\n console.error(\n \"Could not find iframe that sent the SPLICE event\"\n );\n }\n }\n return location;\n }\n\n handleScoreAndState(event, frame) {\n console.log(\"Got SPLICE.reportScoreAndState\");\n console.log(event.data.activity_id);\n console.log(event.data.score);\n console.log(event.data.state);\n let location = this.getUniqueID(event, frame);\n this.logBookEvent({\n event: event.data.subject,\n div_id: location,\n act: `score: ${event.data.score}`,\n score: event.data.score,\n percent: event.data.score,\n correct: event.data.score == 1.0 ? true : false,\n answer: JSON.stringify(event.data.state),\n });\n }\n\n sendingIframe(event) {\n // determine the iframe that sent the event\n // you would think that event.source would be the iframe\n // but it is not and getting the location out of event.source\n // creates CORS issues.\n for (const f of document.getElementsByTagName(\"iframe\")) {\n if (f.contentWindow === event.source) return f;\n }\n return undefined;\n }\n\n async getSavedState(location) {\n // fetch the state from the server\n try {\n const response = await fetch(\"/ns/assessment/results\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n div_id: location,\n course: eBookConfig.course,\n event: \"SPLICE.getState\",\n }),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (error) {\n console.error(\"Error fetching SPLICE state:\", error);\n return null;\n }\n }\n\n async handleGetState(event, frame) {\n console.log(\"Got SPLICE.getState\");\n console.log(event.data.activity_id);\n console.log(event.data.state);\n // subject is SPLICE.getState.response\n let location = this.getUniqueID(event, frame);\n let res = await this.getSavedState(location);\n let state = res.detail.answer;\n event.source.postMessage(\n {\n message_id: event.data.message_id,\n subject: \"SPLICE.getState.response\",\n state: state,\n },\n \"*\"\n );\n }\n\n handleSpliceEvent(event, frame) {\n // handle generic SPLICE events, such as logged clicks\n // or other events. SPLICE does not require that we do\n // anything with them, but in keeping with our tradition\n // we will save them to the useinfo table in the database\n // in case they prove to be useful for research later\n console.log(\"Got SPLICE.sendEvent\");\n console.log(event.data.activity_id);\n console.log(event.data.name);\n //console.log(event.data.data);\n let location = this.getUniqueID(event, frame);\n this.logBookEvent({\n event: event.data.subject,\n div_id: location,\n act: event.data.name || \"unknown\",\n });\n }\n // these stubs are not implemented, but are required by the RunestoneBase class\n checkLocalStorage() {}\n setLocalStorage() {}\n restoreAnswers() {}\n disableInteraction() {}\n}\n\nfunction basicParseJwt(token) {\n var base64Url = token.split(\".\")[1];\n var base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n var jsonPayload = decodeURIComponent(\n window\n .atob(base64)\n .split(\"\")\n .map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n return JSON.parse(jsonPayload);\n}\n","// ***********************************************************************************\n// |docname| - A framework allowing a Runestone component to load only the JS it needs\n// ***********************************************************************************\n// The JavaScript required by all Runestone components is quite large and results in slow page loads. This approach enables a Runestone component to load only the JavaScript it needs, rather than loading JavaScript for all the components regardless of which are actually used.\n//\n// To accomplish this, webpack's split-chunks ability analyzes all JS, starting from this file. The dynamic imports below are transformed by webpack into the dynamic fetches of just the JS required by each file and all its dependencies. (If using static imports, webpack will assume that all files are already statically loaded via script tags, defeating the purpose of this framework.)\n//\n// However, this approach leads to complexity:\n//\n// - The ``data-component`` attribute of each component must be kept in sync with the keys of the ``module_map`` below.\n// - The values in the ``module_map`` must be kept in sync with the JavaScript files which implement each of the components.\n\n// Static imports\n// ==============\n// These imports are (we assume) needed by all pages. However, it would be much better to load these in the modules that actually use them.\n//\n// These are static imports; code in `dynamically loaded components`_ deals with dynamic imports.\n//\n// jQuery-related imports.\nimport \"jquery-ui/jquery-ui.js\";\nimport \"jquery-ui/themes/base/jquery.ui.all.css\";\nimport \"./runestone/common/js/jquery.idle-timer.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.emitter.bidi.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.emitter.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.fallbacks.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.messagestore.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.parser.js\";\nimport \"./runestone/common/js/jquery_i18n/jquery.i18n.language.js\";\n\n// Bootstrap - not needed for pxx development\nimport \"bootstrap/dist/js/bootstrap.js\";\n\n// common styles come from here\nimport \"./ptxrs-bootstrap.less\";\nimport \"./runestone/common/project_template/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-sphinx.js\";\n\n// Misc\nimport \"./runestone/common/js/bookfuncs.js\";\nimport \"./runestone/common/js/user-highlights.js\";\nimport \"./runestone/common/js/pretext.js\";\n\n// These belong in dynamic imports for the obvious component; however, these components don't include a ``data-component`` attribute.\nimport \"./runestone/matrixeq/css/matrixeq.css\";\nimport \"./runestone/webgldemo/css/webglinteractive.css\";\n\n// These are only needed for the Runestone book, but not in a library mode (such as pretext). I would prefer to dynamically load them. However, these scripts are so small I haven't bothered to do so.\nimport { getSwitch, switchTheme } from \"./runestone/common/js/theme.js\";\nimport \"./runestone/common/js/presenter_mode.js\";\nimport \"./runestone/common/css/presenter_mode.less\";\nimport { renderOneComponent } from \"./runestone/common/js/renderComponent.js\";\nimport RunestoneBase from \"./runestone/common/js/runestonebase.js\";\nimport { SpliceWrapper } from \"./runestone/splice/js/spliceWrapper.js\";\n\n// Dynamically loaded components\n// =============================\n// This provides a list of modules that components can dynamically import. Webpack will create a list of imports for each based on its analysis.\nconst module_map = {\n // Wrap each import in a function, so that it won't occur until the function is called. While something cleaner would be nice, webpack can't analyze things like ``import(expression)``.\n //\n // The keys must match the value of each component's ``data-component`` attribute -- the ``runestone_import`` and ``runestone_auto_import`` functions assume this.\n activecode: () => import(\"./runestone/activecode/js/acfactory.js\"),\n ble: () => import(\"./runestone/cellbotics/js/ble.js\"),\n // Always import the timed version of a component if available, since the timed components also define the component's factory and include the component as well. Note that ``acfactory`` imports the timed components of ActiveCode, so it follows this pattern.\n clickablearea: () =>\n import(\"./runestone/clickableArea/js/timedclickable.js\"),\n codelens: () => import(\"./runestone/codelens/js/codelens.js\"),\n datafile: () => import(\"./runestone/datafile/js/datafile.js\"),\n dragndrop: () => import(\"./runestone/dragndrop/js/timeddnd.js\"),\n fillintheblank: () => import(\"./runestone/fitb/js/timedfitb.js\"),\n groupsub: () => import(\"./runestone/groupsub/js/groupsub.js\"),\n khanex: () => import(\"./runestone/khanex/js/khanex.js\"),\n lp_build: () => import(\"./runestone/lp/js/lp.js\"),\n matching: () => import(\"./runestone/matching/js/matching.js\"),\n multiplechoice: () => import(\"./runestone/mchoice/js/timedmc.js\"),\n hparsons: () => import(\"./runestone/hparsons/js/hparsons.js\"),\n parsons: () => import(\"./runestone/parsons/js/timedparsons.js\"),\n poll: () => import(\"./runestone/poll/js/poll.js\"),\n quizly: () => import(\"./runestone/quizly/js/quizly.js\"),\n reveal: () => import(\"./runestone/reveal/js/reveal.js\"),\n selectquestion: () => import(\"./runestone/selectquestion/js/selectone.js\"),\n shortanswer: () =>\n import(\"./runestone/shortanswer/js/timed_shortanswer.js\"),\n showeval: () => import(\"./runestone/showeval/js/showEval.js\"),\n simple_sensor: () => import(\"./runestone/cellbotics/js/simple_sensor.js\"),\n spreadsheet: () => import(\"./runestone/spreadsheet/js/spreadsheet.js\"),\n tabbedStuff: () => import(\"./runestone/tabbedStuff/js/tabbedstuff.js\"),\n timedAssessment: () => import(\"./runestone/timed/js/timed.js\"),\n wavedrom: () => import(\"./runestone/wavedrom/js/wavedrom.js\"),\n // TODO: since this isn't in a ``data-component``, need to trigger an import of this code manually.\n webwork: () => import(\"./runestone/webwork/js/webwork.js\"),\n youtube: () => import(\"./runestone/video/js/runestonevideo.js\"),\n doenet: () => Promise.resolve(), // Doenet is loaded separately\n};\n\nconst module_map_cache = {};\nconst QUEUE_FLUSH_TIME_MS = 10;\nconst queue = [];\nlet queueLastFlush = 0;\n/**\n * Queue imports that are requested within `QUEUE_FLUSH_TIME_MS` of each other.\n * All such imports are imported at once, and then a promise is fired after all\n * the imports in the queue window have completed.\n */\nfunction queueImport(component_name) {\n let resolve = null;\n let reject = null;\n const retPromise = new Promise((r, rej) => {\n resolve = r;\n reject = rej;\n });\n const item = { component_name, resolve, reject };\n queue.push(item);\n window.setTimeout(flushQueue, QUEUE_FLUSH_TIME_MS + 1);\n\n return retPromise;\n}\nasync function flushQueue() {\n if (queue.length === 0) {\n return;\n }\n if (Date.now() - queueLastFlush < QUEUE_FLUSH_TIME_MS) {\n window.setTimeout(flushQueue, QUEUE_FLUSH_TIME_MS + 1);\n return;\n }\n // If we made it here, it has been at least QUEUE_FLUSH_TIME_MS since\n // the last time we flushed the queue. Therefore, we should start flushing.\n // We copy everything we flush and empty the array first.\n queueLastFlush = Date.now();\n const toFlush = [...queue];\n queue.length = 0;\n console.log(\n \"Webpack is starting the loading process for the following Runestone modules\",\n toFlush.map((item) => item.component_name)\n );\n const flushedPromise = toFlush.map(async (item) => {\n try {\n await module_map[item.component_name]();\n console.log(\n `Runestone component ${item.component_name} has been loaded`\n );\n return item;\n } catch (e) {\n item.reject(e);\n }\n });\n const flushed = await Promise.all(flushedPromise);\n try {\n flushed.forEach(function (item) {\n if (item) {\n item.resolve();\n }\n });\n } catch (e) {\n console.error(e);\n }\n}\n\n// .. _dynamic import machinery:\n//\n// Dynamic import machinery\n// ========================\n// Fulfill a promise when the Runestone pre-login complete event occurs.\nlet pre_login_complete_promise = new Promise((resolve) =>\n $(document).on(\"runestone:pre-login-complete\", resolve)\n);\nlet loadedComponents;\n// Provide a simple function to import the JS for all components on the page.\nexport function runestone_auto_import() {\n // Create a set of ``data-component`` values, to avoid duplication.\n const s = new Set(\n // All Runestone components have a ``data-component`` attribute.\n $(\"[data-component]\")\n .map(\n // Extract the value of the data-component attribute.\n (index, element) => $(element).attr(\"data-component\")\n // Switch from a jQuery object back to an array, passing that to the Set constructor.\n )\n .get()\n );\n // webwork questions are not wrapped in div with a data-component so we have to check a different way\n if (document.querySelector(\".webwork-button\")) {\n s.add(\"webwork\");\n }\n\n // Load JS for each of the components found.\n const a = [...s].map((value) => {\n let z;\n console.log(`Loading Runestone component: ${value}`);\n try {\n z = (module_map[value] || (() => Promise.resolve()))();\n } catch (e) {\n console.error(`Error loading ${value}:`, e);\n }\n z.error = (msg) => console.error(`Error in ${value}:`, msg);\n return z;\n });\n\n // Send the Runestone login complete event when all JS is loaded and the pre-login is also complete.\n Promise.all([pre_login_complete_promise, ...a]).then(function () {\n if (!document.body.dataset.reactInUse) {\n document.dispatchEvent(new CustomEvent(\"runestone:login-complete\"));\n }\n });\n}\n\npre_login_complete_promise.then(() => {\n console.log(\"Runestone pre-login complete\");\n});\n\n// Load component JS when the document is ready.\n$(document).ready(runestone_auto_import);\n\n// Provide a function to import one specific `Runestone` component.\n// the import function inside module_map is async -- runestone_import\n// should be awaited when necessary to ensure the import completes\nexport async function runestone_import(component_name) {\n if (module_map_cache[component_name]) {\n return module_map_cache[component_name];\n }\n console.log(\n `Runestone component ${component_name} is being queued for import`\n );\n const promise = queueImport(component_name);\n module_map_cache[component_name] = promise;\n return promise;\n}\n\nasync function popupScratchAC() {\n // load the activecode bundle\n await runestone_import(\"activecode\");\n // scratchDiv will be defined if we have already created a scratch\n // activecode. If its not defined then we need to get it ready to toggle\n if (!eBookConfig.scratchDiv) {\n window.ACFactory.createScratchActivecode();\n let divid = eBookConfig.scratchDiv;\n window.componentMap[divid] = ACFactory.createActiveCode(\n $(`#${divid}`)[0],\n eBookConfig.acDefaultLanguage\n );\n if (eBookConfig.isLoggedIn) {\n window.componentMap[divid].enableSaveLoad();\n }\n }\n setTimeout(() => {\n window.ACFactory.toggleScratchActivecode();\n }, 100);\n}\n\n// Set the directory containing this script as the `path `_ for all webpacked scripts.\nconst script_src = document.currentScript.src;\n__webpack_public_path__ = script_src.substring(\n 0,\n script_src.lastIndexOf(\"/\") + 1\n);\n\nvar splice = new SpliceWrapper();\n\n// Manual exports\n// ==============\n// Webpack's ``output.library`` setting doesn't seem to work with the split chunks plugin; do all exports manually through the ``window`` object instead.\n\nconst rc = {};\nrc.runestone_import = runestone_import;\nrc.runestone_auto_import = runestone_auto_import;\nrc.getSwitch = getSwitch;\nrc.switchTheme = switchTheme;\nrc.popupScratchAC = popupScratchAC;\nrc.renderOneComponent = renderOneComponent;\nwindow.componentMap = {};\nwindow.runestoneComponents = rc;\n","export function getSwitch() {\n const toggleSwitch = document.querySelector('.theme-switch input[type=\"checkbox\"]');\n const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;\n\n if (currentTheme) {\n document.documentElement.setAttribute('data-theme', currentTheme);\n\n if (currentTheme === 'dark') {\n toggleSwitch.checked = true;\n }\n }\n}\n\nexport function switchTheme() {\n\n\tvar checkBox = document.getElementById(\"checkbox\");\n if (checkBox.checked == true) {\n document.documentElement.setAttribute('data-theme', 'dark');\n localStorage.setItem('theme', 'dark'); //add this\n }\n else {\n document.documentElement.setAttribute('data-theme', 'light');\n localStorage.setItem('theme', 'light'); //add this\n }\n}\n","/* ********************************\n * |docname| - Runestone Base Class\n * ********************************\n * All runestone components should inherit from RunestoneBase. In addition all runestone components should do the following things:\n *\n * 1. Ensure that they are wrapped in a div with the class runestone\n * 2. Write their source AND their generated html to the database if the database is configured\n * 3. Properly save and restore their answers using the checkServer mechanism in this base class. Each component must provide an implementation of:\n *\n * - checkLocalStorage\n * - setLocalStorage\n * - restoreAnswers\n * - disableInteraction\n *\n * 4. provide a Selenium based unit test\n */\n\nimport { pageProgressTracker } from \"./bookfuncs.js\";\n//import \"./../styles/runestone-custom-sphinx-bootstrap.css\";\n\nvar NO_DECORATE = [\"parsonsMove\", \"showeval\", \"video\", \"poll\", \"view_toggle\",\n \"dashboard\", \"selectquestion\", \"codelens\", \"peer\"]\nexport default class RunestoneBase {\n constructor(opts) {\n this.component_ready_promise = new Promise(\n (resolve) => (this._component_ready_resolve_fn = resolve)\n );\n this.optional = false;\n if (typeof window.allComponents === \"undefined\") {\n window.allComponents = [];\n }\n window.allComponents.push(this);\n if (opts) {\n this.sid = opts.sid;\n this.graderactive = opts.graderactive;\n this.showfeedback = true;\n if (opts.timed) {\n this.isTimed = true;\n }\n if (opts.enforceDeadline) {\n this.deadline = opts.deadline;\n }\n this.optional = this.parseBooleanAttribute(opts.orig, \"data-optional\");\n if (opts.selector_id) {\n this.selector_id = opts.selector_id;\n }\n if (typeof opts.assessmentTaken !== \"undefined\") {\n this.assessmentTaken = opts.assessmentTaken;\n } else {\n // default to true as this opt is only provided from a timedAssessment\n this.assessmentTaken = true;\n }\n // This is for the selectquestion points\n // If a selectquestion is part of a timed exam it will get\n // the timedWrapper options.\n if (typeof opts.timedWrapper !== \"undefined\") {\n this.timedWrapper = opts.timedWrapper;\n } else {\n // However sometimes selectquestions\n // are used in regular assignments. The hacky way to detect this\n // is to look for doAssignment in the URL and then grab\n // the assignment name from the heading.\n if (location.href.indexOf(\"doAssignment\") >= 0) {\n this.timedWrapper = $(\"h1#assignment_name\").text();\n } else {\n this.timedWrapper = null;\n }\n }\n if ($(opts.orig).data(\"question_label\")) {\n this.question_label = $(opts.orig).data(\"question_label\");\n }\n this.is_toggle = true ? opts.is_toggle : false;\n this.is_select = true ? opts.is_select : false;\n }\n this.mjelements = [];\n let self = this;\n this.mjReady = new Promise(function (resolve, reject) {\n self.mjresolver = resolve;\n });\n this.aQueue = new AutoQueue();\n if (opts && typeof opts.preamble !== \"undefined\") {\n this.preamble = opts.preamble;\n let y = document.createElement(\"div\");\n y.classList.add(\"hidden-content\");\n y.classList.add(\"process-math\");\n y.innerHTML = \"\\\\(\" + this.preamble + \"\\\\)\";\n // This is a hack to get the preamble into the DOM so that MathJax can process it.\n opts.orig.appendChild(y);\n y.id = \"ltx_preamble\";\n y.style.display = \"none\";\n // Add the preamble to the queue object so it can prepend it to\n // future MathJax processing\n this.aQueue.preamble = y\n }\n\n this.jsonHeaders = new Headers({\n \"Content-type\": \"application/json; charset=utf-8\",\n Accept: \"application/json\",\n });\n }\n\n // Helper for parsing boolean data-* attributes\n // Unset/\"false\"/\"no\" means false, anything else, including empty string means true\n parseBooleanAttribute(element, attributeName) {\n const attrValue = element.getAttribute(attributeName);\n if (attrValue === null) {\n return false;\n }\n const lowerValue = attrValue.toLowerCase();\n if (lowerValue === \"false\" || lowerValue === \"no\") {\n return false;\n }\n return true;\n }\n\n // _`logBookEvent`\n //----------------\n // This function sends the provided ``eventInfo`` to the `hsblog endpoint` of the server. Awaiting this function returns either ``undefined`` (if Runestone services are not available) or the data returned by the server as a JavaScript object (already JSON-decoded).\n async logBookEvent(eventInfo) {\n if (this.graderactive) {\n return;\n }\n let post_return;\n eventInfo.course_name = eBookConfig.course;\n eventInfo.clientLoginStatus = eBookConfig.isLoggedIn;\n eventInfo.timezoneoffset = new Date().getTimezoneOffset() / 60;\n // For selectquestions we need to log using the selector_id for real time scoring\n if (this.selector_id) {\n eventInfo.selector_id = this.selector_id;\n }\n if (typeof this.percent === \"number\") {\n eventInfo.percent = this.percent;\n }\n if (window.assignmentId) {\n eventInfo.assignment_id = window.assignmentId;\n }\n if (\n eBookConfig.isLoggedIn &&\n eBookConfig.useRunestoneServices &&\n eBookConfig.logLevel > 0\n ) {\n post_return = this.postLogMessage(eventInfo);\n }\n if (!this.isTimed || eBookConfig.debug) {\n let prefix = eBookConfig.isLoggedIn ? \"Save\" : \"Not\";\n console.log(`${prefix} logging event ` + JSON.stringify(eventInfo));\n }\n // When selectquestions are part of an assignment especially toggle questions\n // we need to count using the selector_id of the select question.\n // We also need to log an event for that selector so that we will know\n // that interaction has taken place. This is **independent** of how the\n // autograder will ultimately grade the question!\n if (this.selector_id) {\n eventInfo.div_id = this.selector_id.replace(\n \"-toggleSelectedQuestion\",\n \"\"\n );\n eventInfo.event = \"selectquestion\";\n eventInfo.act = \"interaction\";\n this.postLogMessage(eventInfo);\n }\n if (\n typeof pageProgressTracker.updateProgress === \"function\" &&\n eventInfo.act != \"edit\" &&\n this.optional == false\n ) {\n pageProgressTracker.updateProgress(eventInfo.div_id);\n }\n // if the event is in the NO_DECORATE list then don't decorate the status\n if (NO_DECORATE.indexOf(eventInfo.event) === -1) {\n this.decorateStatus();\n }\n return post_return;\n }\n\n async postLogMessage(eventInfo) {\n var post_return;\n let request = new Request(\n `${eBookConfig.new_server_prefix}/logger/bookevent`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(eventInfo),\n }\n );\n try {\n var response = await fetch(request);\n if (!response.ok) {\n if (response.status === 422) {\n // Get details about why this is unprocesable.\n post_return = await response.json();\n console.log(JSON.stringify(post_return.detail, null, 4));\n throw new Error(\"Unprocessable Request\");\n } else if (response.status == 401) {\n post_return = await response.json();\n console.log(\n `Missing authentication token ${post_return.detail}`\n );\n throw new Error(\"Missing authentication token\");\n }\n throw new Error(`Failed to save the log entry\n Status: ${response.status}`);\n }\n post_return = await response.json();\n let scoreSpec = post_return.detail;\n let gradeBox = null;\n if (this.selector_id) {\n let selector_id = this.selector_id.replace(\n \"-toggleSelectedQuestion\",\n \"\"\n );\n gradeBox = document.getElementById(`${selector_id}_score`);\n } else {\n gradeBox = document.getElementById(`${this.divid}_score`);\n }\n if (gradeBox && !this.isTimed && scoreSpec.score) {\n this.updateScores(gradeBox, scoreSpec);\n }\n } catch (e) {\n let detail = \"none\";\n if (post_return && post_return.detail) {\n detail = post_return.detail;\n }\n if (eBookConfig.useRunestoneServices) {\n alert(`Error: Your action was not saved!\n The error was ${e}\n Status Code: ${response.status}\n Detail: ${JSON.stringify(detail, null, 4)}.\n Please report this error!`);\n }\n // send a request to save this error\n console.log(\n `Error: ${e} Detail: ${detail} Status Code: ${response.status}`\n );\n }\n return post_return;\n }\n // update the score for the question and the total score\n // the presence of the gradeBox is used to determine if we are on an assignment page.\n updateScores(gradeBox, scoreSpec) {\n if (!scoreSpec.assigned || scoreSpec.score === null) {\n document.getElementById(`${this.divid}_message`).innerHTML = \"Score not updated. Submissions are closed.\";\n return;\n }\n let scoreSpan = gradeBox.getElementsByClassName(\"qscore\")[0];\n if (scoreSpan) {\n scoreSpan.innerHTML = scoreSpec.score.toFixed(1);\n }\n let allScores = document.getElementsByClassName(\"qscore\");\n let allmax = document.getElementsByClassName(\"qmaxscore\");\n let total = 0;\n let max = 0;\n for (let i = 0; i < allScores.length; i++) {\n total += parseFloat(allScores[i].innerHTML);\n max += parseFloat(allmax[i].innerHTML);\n }\n let totalSpan = document.getElementById(\"total_score\");\n if (totalSpan) {\n totalSpan.innerHTML = total.toFixed(1);\n }\n let maxSpan = document.getElementById(\"total_max\");\n if (maxSpan) {\n maxSpan.innerHTML = max;\n }\n let percentSpan = document.getElementById(\"total_percent\");\n if (percentSpan) {\n percentSpan.innerHTML = ((total / max) * 100).toFixed(2);\n }\n }\n\n // .. _logRunEvent:\n //\n // logRunEvent\n // -----------\n // This function sends the provided ``eventInfo`` to the `runlog endpoint`. When awaited, this function returns the data (decoded from JSON) the server sent back.\n async logRunEvent(eventInfo) {\n let post_promise = \"done\";\n if (this.graderactive) {\n return;\n }\n eventInfo.course = eBookConfig.course;\n eventInfo.clientLoginStatus = eBookConfig.isLoggedIn;\n eventInfo.timezoneoffset = new Date().getTimezoneOffset() / 60;\n if (this.forceSave || \"to_save\" in eventInfo === false) {\n eventInfo.save_code = \"True\";\n }\n if (typeof eventInfo.errinfo !== \"undefined\") {\n eventInfo.errinfo = eventInfo.errinfo.toString();\n }\n if (\n eBookConfig.isLoggedIn &&\n eBookConfig.useRunestoneServices &&\n eBookConfig.logLevel > 0\n ) {\n let request = new Request(\n `${eBookConfig.new_server_prefix}/logger/runlog`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(eventInfo),\n }\n );\n let response = await fetch(request);\n if (!response.ok) {\n post_promise = await response.json();\n if (eBookConfig.useRunestoneServices) {\n alert(`Failed to save your code\n Status is ${response.status}\n Detail: ${JSON.stringify(\n post_promise.detail,\n null,\n 4\n )}`);\n } else {\n console.log(\n `Did not save the code.\n Status: ${response.status}\n Detail: ${JSON.stringify(\n post_promise.detail,\n null,\n 4\n )}`\n );\n }\n } else {\n post_promise = await response.json();\n }\n }\n if (!this.isTimed || eBookConfig.debug) {\n console.log(\"running \" + JSON.stringify(eventInfo));\n }\n if (\n typeof pageProgressTracker.updateProgress === \"function\" &&\n this.optional == false\n ) {\n pageProgressTracker.updateProgress(eventInfo.div_id);\n }\n return post_promise;\n }\n /* Checking/loading from storage\n **WARNING:** DO NOT `await` this function!\n This function, although async, does not explicitly resolve its promise by returning a value. The reason for this is because it is called by the constructor for nearly every component. In Javascript constructors cannot be async!\n\n One of the recommended ways to handle the async requirements from within a constructor is to use an attribute as a promise and resolve that attribute at the appropriate time.\n */\n async checkServer(\n // A string specifying the event name to use for querying the :ref:`getAssessResults` endpoint.\n eventInfo,\n // If true, this function will invoke ``indicate_component_ready()`` just before it returns. This is provided since most components are ready after this function completes its work.\n //\n // TODO: This defaults to false, to avoid causing problems with any components that haven't been updated and tested. After all Runestone components have been updated, default this to true and remove the extra parameter from most calls to this function.\n will_be_ready = false\n ) {\n // Check if the server has stored answer\n let self = this;\n this.checkServerComplete = new Promise(function (resolve, reject) {\n self.csresolver = resolve;\n });\n if (\n eBookConfig.isLoggedIn &&\n (this.useRunestoneServices || this.graderactive)\n ) {\n let data = {};\n data.div_id = this.divid;\n data.course = eBookConfig.course;\n data.event = eventInfo;\n if (this.graderactive && this.deadline) {\n data.deadline = this.deadline;\n data.rawdeadline = this.rawdeadline;\n data.tzoff = this.tzoff;\n }\n if (this.sid) {\n data.sid = this.sid;\n }\n if (!(data.div_id && data.course && data.event)) {\n console.log(\n `A required field is missing data ${data.div_id}:${data.course}:${data.event}`\n );\n }\n // If we are NOT in practice mode and we are not in a peer exercise\n // and assessmentTaken is true\n if (\n !eBookConfig.practice_mode &&\n !eBookConfig.peer &&\n this.assessmentTaken\n ) {\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/results`,\n {\n method: \"POST\",\n body: JSON.stringify(data),\n headers: this.jsonHeaders,\n }\n );\n try {\n let response = await fetch(request);\n console.log(`Response from server: ${response.status}`);\n if (response.ok) {\n data = await response.json();\n data = data.detail;\n console.log(`Data from server: ${JSON.stringify(data)} calling repopulateFromStorage`);\n this.repopulateFromStorage(data);\n this.attempted = true;\n if (typeof data.correct !== \"undefined\") {\n this.correct = data.correct;\n } else {\n this.correct = null;\n }\n console.log(`resolving checkServer with server data`);\n this.csresolver(\"server\");\n } else {\n console.log(\n `HTTP Error getting results: ${response.statusText}`\n );\n this.checkLocalStorage(); // just go right to local storage\n console.log(`resolving checkServer with local data`);\n this.csresolver(\"local\");\n }\n } catch (err) {\n console.log(`Error getting results: ${err}`);\n try {\n this.checkLocalStorage();\n } catch (err) {\n console.log(err);\n }\n }\n } else {\n this.loadData({});\n console.log(`resolving checkServer no answer given`);\n this.csresolver(\"not taken\");\n }\n } else {\n this.checkLocalStorage(); // just go right to local storage\n console.log(`resolving checkServer with local data`);\n this.csresolver(\"local\");\n }\n\n if (will_be_ready) {\n this.indicate_component_ready();\n }\n }\n\n // This method assumes that ``this.componentDiv`` refers to the ``div`` containing the component, and that this component's ID is set.\n indicate_component_ready() {\n // Add a class to indicate the component is now ready.\n this.containerDiv.classList.add(\"runestone-component-ready\");\n // Resolve the ``this.component_ready_promise``.\n this._component_ready_resolve_fn();\n }\n\n loadData(data) {\n // for most classes, loadData doesn't do anything. But for Parsons, and perhaps others in the future,\n // initialization can happen even when there's no history to be loaded\n return null;\n }\n\n /**\n * repopulateFromStorage is called after a successful API call is made to ``getAssessResults`` in\n * the checkServer method in this class\n *\n * ``restoreAnswers,`` ``setLocalStorage`` and ``checkLocalStorage`` are defined in the child classes.\n *\n * @param {*} data - a JSON object representing the data needed to restore a previous answer for a component\n * @param {*} status - the http status\n * @param {*} whatever - ignored\n */\n repopulateFromStorage(data) {\n // decide whether to use the server's answer (if there is one) or to load from storage\n if (data !== null && data !== \"no data\" && this.shouldUseServer(data)) {\n this.restoreAnswers(data);\n this.setLocalStorage(data);\n } else {\n this.checkLocalStorage();\n }\n this.decorateStatus();\n }\n shouldUseServer(data) {\n // returns true if server data is more recent than local storage or if server storage is correct\n if (\n data.correct === \"T\" ||\n data.correct === true ||\n localStorage.length === 0 ||\n this.graderactive === true ||\n this.isTimed\n ) {\n return true;\n }\n let ex = localStorage.getItem(this.localStorageKey());\n if (ex === null) {\n return true;\n }\n let storedData;\n try {\n storedData = JSON.parse(ex);\n } catch (err) {\n // error while parsing; likely due to bad value stored in storage\n console.log(err.message);\n localStorage.removeItem(this.localStorageKey());\n // definitely don't want to use local storage here\n return true;\n }\n if (data.answer == storedData.answer) return true;\n let storageDate = new Date(storedData.timestamp);\n let serverDate = new Date(data.timestamp);\n return serverDate >= storageDate;\n }\n // Return the key which to be used when accessing local storage.\n localStorageKey() {\n return (\n eBookConfig.email +\n \":\" +\n eBookConfig.course +\n \":\" +\n this.divid +\n \"-given\"\n );\n }\n addCaption(elType) {\n //someElement.parentNode.insertBefore(newElement, someElement.nextSibling);\n if (!this.isTimed) {\n var capDiv = document.createElement(\"p\");\n if (this.question_label) {\n // Display caption based on whether Runestone services have been detected\n this.caption = eBookConfig.useRunestoneServices\n ? `Activity: ${this.question_label} ${this.caption} (${this.divid})`\n : `Activity: ${this.question_label} ${this.caption}`; // Without runestone\n $(capDiv).html(this.caption);\n $(capDiv).addClass(`${elType}_caption`);\n } else {\n // Display caption based on whether Runestone services have been detected\n $(capDiv).html(\n eBookConfig.useRunestoneServices\n ? this.caption + \" (\" + this.divid + \")\"\n : this.caption\n ); // Without runestone\n $(capDiv).addClass(`${elType}_caption`);\n $(capDiv).addClass(`${elType}_caption_text`);\n }\n this.capDiv = capDiv;\n //this.outerDiv.parentNode.insertBefore(capDiv, this.outerDiv.nextSibling);\n this.containerDiv.appendChild(capDiv);\n }\n }\n\n hasUserActivity() {\n return this.isAnswered;\n }\n\n checkCurrentAnswer() {\n console.log(\n \"Each component should provide an implementation of checkCurrentAnswer\"\n );\n }\n\n async logCurrentAnswer() {\n console.log(\n \"Each component should provide an implementation of logCurrentAnswer\"\n );\n }\n renderFeedback() {\n console.log(\n \"Each component should provide an implementation of renderFeedback\"\n );\n }\n disableInteraction() {\n console.log(\n \"Each component should provide an implementation of disableInteraction\"\n );\n }\n\n toString() {\n return `${this.constructor.name}: ${this.divid}`;\n }\n\n queueMathJax(component) {\n if (typeof MathJax === \"undefined\") {\n console.log(\"Error -- MathJax is not loaded\");\n return Promise.resolve(null);\n } else {\n // See - https://docs.mathjax.org/en/latest/advanced/typeset.html\n // Per the above we should keep track of the promises and only call this\n // a second time if all previous promises have resolved.\n // Create a queue of components\n // should wait until defaultPageReady is defined\n // If defaultPageReady is not defined then just enqueue the components.\n // Once defaultPageReady is defined\n // the window.runestoneMathReady promise will be fulfilled when the\n // initial typesetting is complete.\n if (MathJax.typesetPromise) {\n if (typeof window.runestoneMathReady !== \"undefined\") {\n return window.runestoneMathReady.then(() =>\n this.mjresolver(this.aQueue.enqueue(component))\n );\n } else {\n return this.mjresolver(this.aQueue.enqueue(component));\n }\n } else {\n console.log(`Waiting on MathJax!! ${MathJax.typesetPromise}`);\n setTimeout(() => this.queueMathJax(component), 200);\n console.log(`Returning mjready promise: ${this.mjReady}`);\n return this.mjReady;\n }\n }\n }\n\n decorateStatus() {\n if (this.isTimed || eBookConfig.peer) return;\n let rsDiv = $(this.containerDiv).closest(\"div.runestone\")[0];\n if (!rsDiv) return;\n rsDiv.classList.remove(\"notAnswered\");\n rsDiv.classList.remove(\"isInCorrect\");\n rsDiv.classList.remove(\"isCorrect\");\n let assignmentInfo = localStorage.getItem(`currentAssignmentInfo_${eBookConfig.course}`);\n let questions = [];\n if (assignmentInfo) {\n questions = JSON.parse(assignmentInfo).questions\n }\n if (questions.indexOf(this.divid) >= 0) {\n rsDiv.classList.add(\"isAssigned\");\n }\n if (this.correct) {\n rsDiv.classList.add(\"isCorrect\");\n } else {\n if (this.correct === null || typeof this.correct === \"undefined\") {\n rsDiv.classList.add(\"notAnswered\");\n } else {\n rsDiv.classList.add(\"isInCorrect\");\n }\n }\n }\n}\n\n// Inspiration and lots of code for this solution come from\n// https://stackoverflow.com/questions/53540348/js-async-await-tasks-queue\n// The idea here is that until MathJax is ready we can just enqueue things\n// once mathjax becomes ready then we can drain the queue and continue as usual.\n\nclass Queue {\n constructor() {\n this._items = [];\n }\n enqueue(item) {\n this._items.push(item);\n }\n dequeue() {\n return this._items.shift();\n }\n get size() {\n return this._items.length;\n }\n}\n\nclass AutoQueue extends Queue {\n constructor() {\n super();\n this._pendingPromise = false;\n }\n\n enqueue(component) {\n return new Promise((resolve, reject) => {\n super.enqueue({ component, resolve, reject });\n this.dequeue();\n });\n }\n\n async dequeue() {\n if (this._pendingPromise) return false;\n\n let item = super.dequeue();\n\n if (!item) return false;\n let qq = this;\n try {\n this._pendingPromise = true;\n\n let payload = await window.runestoneMathReady\n .then(async function () {\n console.log(\n `MathJax Ready -- dequeing a typesetting run for ${item.component.id} ${qq.preamble?.innerHTML}`\n );\n if (qq.preamble) {\n await MathJax.typesetPromise([qq.preamble])\n // Use insertAdjacentElement to preserve existing DOM elements and event listeners\n // instead of overwriting innerHTML which destroys event handlers\n let preambleDiv = document.createElement(\"div\");\n preambleDiv.innerHTML = qq.preamble.innerHTML;\n item.component.insertAdjacentElement(\"afterbegin\", preambleDiv);\n console.log(\n `MathJax typeset the preamble for ${item.component.id}`\n );\n return await MathJax.typesetPromise([item.component]);\n } else {\n return await MathJax.typesetPromise([item.component]);\n }\n });\n\n this._pendingPromise = false;\n item.resolve(payload);\n } catch (e) {\n this._pendingPromise = false;\n item.reject(e);\n } finally {\n // If there are more items in the queue, continue processing them\n this.dequeue();\n }\n\n return true;\n }\n}\n\nwindow.RunestoneBase = RunestoneBase;\n","/**\n *\n * User: bmiller\n * Original: 2011-04-20\n * Date: 2019-06-14\n * Time: 2:01 PM\n * This change marks the beginning of version 4.0 of the runestone components\n * Login/logout is no longer handled through javascript but rather server side.\n * Many of the components depend on the runestone:login event so we will keep that\n * for now to keep the churn fairly minimal.\n */\n\n/*\n\n Copyright (C) 2011 Brad Miller bonelake@gmail.com\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see .\n\n */\n\nimport RunestoneBase from \"./runestonebase.js\";\nvar rb = new RunestoneBase();\n\n//\n// Page decoration functions\n//\n/*\nMaybe something like this at the top:\n\nActive assignment: [Ch 15 reading] [Exit assignment link]\nOn page (3 of 7) [Select input showing current page, can select others] \nBecoming this if not on a page in assignment\n\nActive assignment: [Ch 15 reading] [Exit assignment link]\nThis page is not part of that assignment. Select a page to return to it:\n[Select input]\n*/\nfunction addReadingList() {\n let assignment_info_string = localStorage.getItem(`currentAssignmentInfo_${eBookConfig.course}`)\n\n if (assignment_info_string && eBookConfig.readings) {\n var top, bottom, active, page_name, exit_link, fst, snd, new_pos, path_parts, new_pos_link;\n var assignment_info = JSON.parse(assignment_info_string);\n let assignment_id = assignment_info.id;\n let assignment_name = assignment_info.name;\n let reading_names = assignment_info.readingNames;\n\n active = document.createElement(\"div\");\n active.textContent = \"Active assignment: \"\n\n page_name = document.createElement(\"a\");\n page_name.textContent = assignment_name;\n page_name.href = `/assignment/student/doAssignment?assignment_id=${assignment_id}`;\n\n active.append(page_name);\n\n exit_link = document.createElement(\"a\");\n exit_link.textContent = \" Exit Assignment\";\n exit_link.href = window.location.pathname;\n\n exit_link.addEventListener('click', function (event) {\n localStorage.removeItem(`currentAssignmentInfo_${eBookConfig.course}`);\n });\n\n //active.append(exit_link)\n\n let cur_path_parts = window.location.pathname.split(\"/\");\n let name =\n cur_path_parts[cur_path_parts.length - 2] +\n \"/\" +\n cur_path_parts[cur_path_parts.length - 1];\n // if body has pretext class, then strip the leading path parts from each of the strings in eBookConfig.readings\n let body = document.getElementsByTagName(\"body\")[0];\n let ptxbook = false;\n let endLop = 2;\n if (body.classList.contains(\"pretext\")) {\n ptxbook = true;\n eBookConfig.readings = eBookConfig.readings.map(r => r.split(\"/\").pop());\n name = name.split(\"/\").pop();\n endLop = 1;\n }\n\n let position = eBookConfig.readings.indexOf(name);\n let num_readings = eBookConfig.readings.length;\n // get prev name\n if (position > 0) {\n new_pos = eBookConfig.readings[position - 1];\n path_parts = cur_path_parts.slice(0, cur_path_parts.length - endLop);\n path_parts.push(new_pos);\n new_pos_link = path_parts.join(\"/\");\n fst = active.cloneNode(true);\n let txt = document.createElement(\"p\");\n txt.textContent = `Page ${position + 1} of ${num_readings}, `;\n var fst_lnk = document.createElement(\"a\");\n //fst_lnk.className = \"btn btn-lg reading-navigation prev-reading\";\n fst_lnk.href = new_pos_link;\n fst_lnk.textContent = `Back to page ${position\n } of ${num_readings}: ${reading_names[position - 1]}.`;\n txt.append(fst_lnk);\n fst.append(txt);\n\n } else if (position == 0) {\n fst = active.cloneNode(true);\n let txt = document.createElement(\"p\");\n txt.textContent = `Page 1 of ${num_readings}.`;\n fst.append(txt);\n } else {\n // this isn't a reading page in the assignment, check to see if any\n // activities on this page are assigned to the current assignment\n let exerciseOnPage = false;\n let pageExercises = Object.keys(componentMap);\n if (pageExercises.length == 0) {\n pageExercises = document.querySelectorAll(\"[data-component]\");\n pageExercises = Array.from(pageExercises).map(function (el) {\n return el.id;\n })\n }\n for (let ex of pageExercises) {\n if (assignment_info.questions.includes(ex)) {\n exerciseOnPage = true;\n break;\n }\n }\n new_pos = eBookConfig.readings[0];\n path_parts = cur_path_parts.slice(0, cur_path_parts.length - endLop);\n path_parts.push(new_pos);\n new_pos_link = path_parts.join(\"/\");\n fst = active.cloneNode(true);\n let txt = document.createElement(\"p\");\n if (exerciseOnPage) {\n txt.textContent = \"This page has activities assigned to the current assignment.\";\n } else {\n txt.textContent = \"Notice: this page is not part of the assignment.\";\n }\n txt.append(exit_link);\n fst.append(txt);\n }\n if (position == eBookConfig.readings.length - 1) {\n // no more readings\n snd = active;\n let txt = document.createElement(\"p\");\n txt.textContent = `Page ${num_readings} of ${num_readings}: ${reading_names[position]}`;\n snd.append(txt);\n } else if (position >= 0) {\n // get next name\n new_pos = eBookConfig.readings[position + 1];\n path_parts = cur_path_parts.slice(0, cur_path_parts.length - endLop);\n path_parts.push(new_pos);\n new_pos_link = path_parts.join(\"/\");\n snd = active;\n var snd_lnk = document.createElement(\"a\");\n //snd_lnk.className = \"btn btn-lg reading-navigation next-reading\";\n snd_lnk.href = new_pos_link;\n snd_lnk.textContent = `Continue to page ${position + 2\n } of ${num_readings}: ${reading_names[position + 1]}`;\n let txt = document.createElement(\"p\");\n txt.append(snd_lnk);\n snd.append(txt);\n\n } else {\n snd = active.cloneNode(true);\n let txt = document.createElement(\"p\");\n txt.textContent = \"Notice: this page is not part of the assignment. To remove this warning click \";\n let exit_clone = exit_link.cloneNode(true);\n\n exit_clone.addEventListener('click', function (event) {\n localStorage.removeItem(`currentAssignmentInfo_${eBookConfig.course}`);\n });\n txt.append(exit_clone);\n snd.append(txt);\n\n\n }\n\n top = document.createElement(\"div\");\n top.className = \"ptx-runestone-container\"\n fst.className = \"runestone assignment-nav top-assignment-nav\"\n //top.style.backgroundColor = \"var(--componentBgColor)\"\n //top.style.borderColor = \"var(--componentBorderColor)\"\n //top.style.borderWidth = \"1px\"\n top.append(fst);\n //top.append(snd);\n\n bottom = document.createElement(\"div\");\n bottom.className = \"ptx-runestone-container\"\n snd.className = \"runestone assignment-nav bottom-assignment-nav\"\n //bottom.style.backgroundColor = \"var(--componentBgColor)\"\n //bottom.style.borderColor = \"var(--componentBorderColor)\"\n //bottom.style.borderWidth = \"1px\"\n\n //bottom.append(active.cloneNode(true));\n //bottom.append(fst.cloneNode(true));\n bottom.append(snd);\n\n\n // check the body tag to see if it has a pretext class (no jquery)\n if (ptxbook) {\n //append parts to the header and progress container\n let content = document.getElementById(\"ptx-content\");\n if (content) {\n content.insertBefore(top, content.firstChild);\n }\n let pc = document.getElementById(\"scprogresscontainer\");\n if (pc) {\n pc.style.marginBottom = \"20px\";\n pc.appendChild(bottom);\n }\n return;\n }\n const mainContent = document.getElementById(\"main-content\");\n if (mainContent && snd) {\n mainContent.insertBefore(top, mainContent.firstChild)\n mainContent.appendChild(bottom);\n\n }\n }\n}\n\nfunction timedRefresh() {\n var timeoutPeriod = 900000; // 75 minutes\n let idleTimeoutId;\n\n function onIdle() {\n // After timeout period send the user back to the index. This will force a login\n // if needed when they want to go to a particular page. This may not be perfect\n // but its an easy way to make sure laptop users are properly logged in when they\n // take quizzes and save stuff.\n if (location.href.indexOf(\"index.html\") < 0) {\n console.log(\"Idle timer - \" + location.pathname);\n location.href =\n eBookConfig.app +\n \"/default/user/login?_next=\" +\n location.pathname +\n location.search;\n }\n }\n\n function resetIdleTimer() {\n if (idleTimeoutId) {\n clearTimeout(idleTimeoutId);\n }\n idleTimeoutId = setTimeout(onIdle, timeoutPeriod);\n }\n\n [\"mousemove\", \"keydown\", \"scroll\", \"click\", \"touchstart\", \"wheel\"].forEach(\n (eventName) => {\n window.addEventListener(eventName, resetIdleTimer, { passive: true });\n },\n );\n\n resetIdleTimer();\n}\n\nclass PageProgressBar {\n constructor(actDict) {\n this.possible = 0;\n this.total = 1;\n if (actDict && \"assignment_spec\" in actDict) {\n this.assignment_spec = actDict.assignment_spec;\n delete actDict.assignment_spec;\n }\n if (actDict && Object.keys(actDict).length > 0) {\n this.activities = actDict;\n } else {\n let activities = { page: 0 };\n document.querySelectorAll(\".runestone\").forEach(function (e) {\n activities[e.firstElementChild.id] = 0;\n });\n this.activities = activities;\n }\n this.calculateProgress();\n // Hide the progress bar on the index page.\n if (\n window.location.pathname.match(\n /.*\\/(index.html|toctree.html|Exercises.html|search.html)$/i,\n )\n ) {\n const scprogresscontainer = document.getElementById(\n \"scprogresscontainer\",\n );\n if (scprogresscontainer) scprogresscontainer.style.display = \"none\";\n }\n this.renderProgress();\n }\n\n calculateProgress() {\n for (let k in this.activities) {\n if (k !== undefined) {\n this.possible++;\n if (this.activities[k] > 0) {\n this.total++;\n }\n }\n }\n }\n\n renderProgress() {\n let value = 0;\n const scprogresstotal = document.getElementById(\"scprogresstotal\");\n if (scprogresstotal) scprogresstotal.textContent = this.total;\n const scprogressposs = document.getElementById(\"scprogressposs\");\n if (scprogressposs) scprogressposs.textContent = this.possible;\n try {\n value = (100 * this.total) / this.possible;\n } catch (e) {\n value = 0;\n }\n // Replace #subchapterprogress div with a native element if not already done\n let subchapterprogress = document.getElementById(\"subchapterprogress\");\n if (subchapterprogress && subchapterprogress.tagName !== \"PROGRESS\") {\n // Replace the div with a element\n const progressElem = document.createElement(\"progress\");\n progressElem.id = \"subchapterprogress\";\n progressElem.max = 100;\n progressElem.value = value;\n // Copy over any classes from the old div\n progressElem.className = subchapterprogress.className;\n subchapterprogress.replaceWith(progressElem);\n subchapterprogress = progressElem;\n } else if (subchapterprogress) {\n subchapterprogress.max = 100;\n subchapterprogress.value = value;\n }\n if (this.assignment_spec) {\n // If the user has completed all activities, send the reading score.\n // This handles the case where there are no activities on the page or\n // where the user completed activities on the assignment page and now\n // is viewing the reading page.\n let completeActivities = this.total; // subtract 1 for the page reading which is in total but not an activity\n let requiredActivities =\n this.assignment_spec.activities_required || 1;\n if (this.assignment_spec.activities_required === null) {\n this.assignment_spec.activities_required = this.possible; // if activities_required is null, then there are none on the page\n }\n if (completeActivities >= requiredActivities) {\n this.sendCompletedReadingScore().then(() => {\n console.log(\"Reading score sent for page\");\n // wait a tick then mark the page complete\n // this is needed to let the progress bar update before marking complete\n setTimeout(() => {\n let cb = document.getElementById(\"completionButton\");\n if (\n cb &&\n cb.textContent.toLowerCase() === \"mark as completed\"\n ) {\n cb.click();\n }\n }, 500);\n });\n }\n }\n if (!eBookConfig.isLoggedIn) {\n const subchapterDiv = document.getElementById(\"subchapterprogress\");\n if (subchapterDiv) subchapterDiv.classList.add(\"loggedout\");\n }\n }\n\n updateProgress(div_id) {\n this.activities[div_id]++;\n // Only update the progress bar on the first interaction with an object.\n if (this.activities[div_id] === 1) {\n this.total++;\n let val = (100 * this.total) / this.possible;\n const scprogresstotal2 = document.getElementById(\"scprogresstotal\");\n if (scprogresstotal2) scprogresstotal2.textContent = this.total;\n const scprogressposs2 = document.getElementById(\"scprogressposs\");\n if (scprogressposs2) scprogressposs2.textContent = this.possible;\n let subchapterprogress2 =\n document.getElementById(\"subchapterprogress\");\n if (\n subchapterprogress2 &&\n subchapterprogress2.tagName === \"PROGRESS\"\n ) {\n subchapterprogress2.value = val;\n }\n if (\n this.assignment_spec &&\n this.assignment_spec.activities_required !== null &&\n this.total >= this.assignment_spec.activities_required\n ) {\n console.log(\"Required activities completed\");\n this.sendCompletedReadingScore().then(() => {\n console.log(\"Reading score sent\");\n });\n }\n if (\n val == 100.0 &&\n (function () {\n const cb = document.getElementById(\"completionButton\");\n return (\n cb &&\n cb.textContent &&\n cb.textContent.toLowerCase() === \"mark as completed\"\n );\n })()\n ) {\n const cb = document.getElementById(\"completionButton\");\n if (cb && typeof cb.click === \"function\") {\n cb.click();\n }\n }\n }\n }\n\n async sendCompletedReadingScore() {\n let headers = new Headers({\n \"Content-type\": \"application/json; charset=utf-8\",\n Accept: \"application/json\",\n });\n let data = { ...this.assignment_spec };\n let request = new Request(\n `${eBookConfig.new_server_prefix}/logger/update_reading_score`,\n {\n method: \"POST\",\n body: JSON.stringify(data),\n headers: headers,\n },\n );\n try {\n let response = await fetch(request);\n if (!response.ok) {\n console.error(\n `Failed to send reading score! ${response.statusText}`,\n );\n }\n data = await response.json();\n } catch (e) {\n console.error(`Error sending reading score ${e}`);\n }\n }\n}\n\nexport var pageProgressTracker = {};\n\nfunction getCookie(name) {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop().split(\";\").shift();\n}\n\nlet studyCluesConversationId = -1;\n\nfunction appendStudyCluesMessage(messagesEl, role, text, isHtml = false) {\n const bubble = document.createElement(\"div\");\n bubble.className = `studyclues-message ${role}`;\n if (isHtml) {\n bubble.innerHTML = text;\n } else {\n bubble.textContent = text;\n }\n messagesEl.appendChild(bubble);\n messagesEl.scrollTop = messagesEl.scrollHeight;\n}\n\nfunction createStudyCluesWidget() {\n if (document.getElementById(\"studyclues-fab\")) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.textContent = `\n #studyclues-fab {\n position: fixed;\n right: 24px;\n bottom: 24px;\n z-index: 9999;\n border: none;\n border-radius: 9999px;\n padding: 12px 18px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n color: #fff;\n background: #2563eb;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n }\n\n #studyclues-chat {\n position: fixed;\n right: 24px;\n bottom: 78px;\n z-index: 9999;\n width: min(420px, calc(100vw - 32px));\n height: min(520px, calc(100vh - 120px));\n background: #fff;\n border: 1px solid #d1d5db;\n border-radius: 12px;\n box-shadow: 0 14px 36px rgba(0, 0, 0, 0.25);\n display: none;\n flex-direction: column;\n overflow: hidden;\n }\n\n #studyclues-chat.open {\n display: flex;\n }\n\n .studyclues-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid #e5e7eb;\n font-weight: 600;\n background: #f9fafb;\n }\n\n .studyclues-close {\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n }\n\n .studyclues-coach-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n }\n\n .studyclues-coach-toggle input[type=\"checkbox\"] {\n appearance: none;\n -webkit-appearance: none;\n width: 32px;\n height: 18px;\n border-radius: 9999px;\n background: #d1d5db;\n cursor: pointer;\n position: relative;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n\n .studyclues-coach-toggle input[type=\"checkbox\"]::after {\n content: \"\";\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: #fff;\n transition: transform 0.2s;\n }\n\n .studyclues-coach-toggle input[type=\"checkbox\"]:checked {\n background: #2563eb;\n }\n\n .studyclues-coach-toggle input[type=\"checkbox\"]:checked::after {\n transform: translateX(14px);\n }\n\n .studyclues-messages {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n background: #f8fafc;\n }\n\n .studyclues-message {\n max-width: 85%;\n padding: 10px 12px;\n border-radius: 10px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 14px;\n line-height: 1.4;\n }\n\n .studyclues-message.user {\n margin-left: auto;\n background: #dbeafe;\n border: 1px solid #bfdbfe;\n }\n\n .studyclues-message.assistant {\n margin-right: auto;\n background: #fff;\n border: 1px solid #e5e7eb;\n }\n\n .studyclues-message.studyclues-loading {\n color: #6b7280;\n font-style: italic;\n }\n\n .studyclues-spinner {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n\n .studyclues-spinner-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6b7280;\n opacity: 0.35;\n animation: studyclues-dot-pulse 1s infinite ease-in-out;\n }\n\n .studyclues-spinner-dot:nth-child(2) {\n animation-delay: 0.15s;\n }\n\n .studyclues-spinner-dot:nth-child(3) {\n animation-delay: 0.3s;\n }\n\n @keyframes studyclues-dot-pulse {\n 0%,\n 80%,\n 100% {\n opacity: 0.35;\n transform: scale(1);\n }\n 40% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n\n .studyclues-inputbar {\n display: flex;\n gap: 8px;\n padding: 10px;\n border-top: 1px solid #e5e7eb;\n background: #fff;\n }\n\n .studyclues-inputbar input {\n flex: 1;\n min-width: 0;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 14px;\n }\n\n .studyclues-inputbar button {\n border: none;\n border-radius: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: #fff;\n background: #2563eb;\n font-weight: 600;\n }\n `;\n document.head.appendChild(style);\n\n const button = document.createElement(\"button\");\n button.id = \"studyclues-fab\";\n button.textContent = \"StudyClues Chat\";\n\n const chat = document.createElement(\"div\");\n chat.id = \"studyclues-chat\";\n chat.innerHTML = `\n
    \n StudyClues\n \n \n
    \n
    \n
    \n \n \n
    \n `;\n\n document.body.appendChild(button);\n document.body.appendChild(chat);\n\n const closeBtn = chat.querySelector(\".studyclues-close\");\n const messagesEl = chat.querySelector(\".studyclues-messages\");\n const inputEl = chat.querySelector(\".studyclues-inputbar input\");\n const sendBtn = chat.querySelector(\".studyclues-inputbar button\");\n const coachToggle = chat.querySelector(\"#studyclues-coach-mode\");\n\n let coachMode = coachToggle.checked;\n coachToggle.addEventListener(\"change\", () => {\n coachMode = coachToggle.checked;\n });\n\n const toggleChat = () => {\n chat.classList.toggle(\"open\");\n if (chat.classList.contains(\"open\")) {\n inputEl.focus();\n }\n };\n\n const sendMessage = async () => {\n let query = inputEl.value.trim();\n if (!query) {\n return;\n }\n var sectionInfo = \"this page\";\n // find the section title on the page to include in the initial query\n if (document.querySelector(\"body.pretext\")) {\n let section = document.querySelector('section.section');\n let sectionTitle = section.querySelector('span.title').innerText;\n let sectionNumber = section.querySelector('span.codenumber').innerText;\n sectionInfo = `${sectionNumber} ${sectionTitle}`;\n } else {\n let sectionSpan = document.querySelector(\"span.section-number\");\n if (sectionSpan) {\n sectionInfo = sectionSpan.parentElement.innerText.trim();\n }\n }\n if (studyCluesConversationId === -1) {\n query = `Regarding section \"${sectionInfo}\": ${query}`;\n }\n rb.logBookEvent({ event: \"studyclues_query\", act: `query: ${query}`, div_id: `${sectionInfo}` });\n appendStudyCluesMessage(messagesEl, \"user\", query); // todo: make this conditional on being a book page and on the book being one of the supported books\n inputEl.value = \"\";\n sendBtn.disabled = true;\n\n const loadingBubble = document.createElement(\"div\");\n loadingBubble.className =\n \"studyclues-message assistant studyclues-loading\";\n loadingBubble.innerHTML =\n 'Thinking ';\n messagesEl.appendChild(loadingBubble);\n messagesEl.scrollTop = messagesEl.scrollHeight;\n\n try {\n const response = await fetch(\n `/assignment/student/studyclues_query`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({\n query,\n conversation_id: studyCluesConversationId,\n coachMode,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}`);\n }\n\n const payload = await response.json();\n const detail = payload?.detail || {};\n const studycluesResponse = detail?.response || {};\n const llmResponse = studycluesResponse?.llm_response;\n const references = studycluesResponse?.references || {};\n\n if (typeof detail.conversation_id === \"number\") {\n studyCluesConversationId = detail.conversation_id;\n }\n\n const formattedResponse = (llmResponse || \"No response available from StudyClues.\").replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (match, text, key) => {\n const url = references[key]?.content_url;\n return url ? `(${text})` : match;\n }\n );\n\n appendStudyCluesMessage(\n messagesEl,\n \"assistant\",\n formattedResponse,\n true,\n );\n } catch (err) {\n appendStudyCluesMessage(\n messagesEl,\n \"assistant\",\n \"Sorry, StudyClues is unavailable right now. Please try again.\",\n );\n console.error(\"StudyClues chat error:\", err);\n } finally {\n loadingBubble.remove();\n sendBtn.disabled = false;\n inputEl.focus();\n }\n };\n\n button.addEventListener(\"click\", toggleChat);\n closeBtn.addEventListener(\"click\", toggleChat);\n sendBtn.addEventListener(\"click\", sendMessage);\n inputEl.addEventListener(\"keydown\", (evt) => {\n if (evt.key === \"Enter\") {\n evt.preventDefault();\n sendMessage();\n }\n });\n}\n\nfunction shouldShowStudyCluesWidget() {\n if (!location.pathname.includes(\"/ns/books/\")) {\n return false;\n }\n\n const enabledBasecourses = [\"csawesome2\", \"py4e-int\", \"thinkcspy\", \"httlacs\", \"PTXSB\", \"cppds2\"];\n const enabledCourses = [\"SI201-W26-MW\", \"SI201-W26-TTh\", \"DukeCS101SP26\", \"mcd-csa-schoology\", \"mcd-csa-canvas\", \"csawesome2-MOOC\", \"test_py4e-int_api\", \"bc_cppds_s26\", \"Test-py4e-int\", \"virginiatech_py4e-int_spring26\"];\n const host = window.location.hostname;\n\n if (host === \"localhost\") {\n return enabledBasecourses.includes(eBookConfig.basecourse);\n }\n\n if (host === \"runestone.academy\") {\n return enabledCourses.includes(eBookConfig.course);\n }\n\n return false;\n}\n\nasync function handlePageSetup() {\n var mess;\n if (eBookConfig.useRunestoneServices) {\n let headers = new Headers({\n \"Content-type\": \"application/json; charset=utf-8\",\n Accept: \"application/json\",\n });\n let data = {\n timezoneoffset: new Date().getTimezoneOffset() / 60,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n let RS_info = getCookie(\"RS_info\");\n var tz_match = false;\n if (RS_info) {\n try {\n let cleaned = RS_info.replace(/\\\\054/g, \",\"); // handle octal comma encoding\n let info = JSON.parse(decodeURIComponent(cleaned));\n info = JSON.parse(decodeURIComponent(info));\n if (\n info.timezone === data.timezone &&\n info.tz_offset === data.timezoneoffset\n ) {\n console.log(\n \"Timezone cookie matches, not sending timezone to server\",\n );\n tz_match = true;\n }\n } catch (e) {\n console.error(\n \"Error parsing RS_info cookie, sending timezone to server\",\n );\n }\n }\n if (tz_match === false) {\n // Set a cookie so we don't have to do this again for a while.\n let request = new Request(\n `${eBookConfig.new_server_prefix}/logger/set_tz_offset`,\n {\n method: \"POST\",\n body: JSON.stringify(data),\n headers: headers,\n },\n );\n try {\n let response = await fetch(request);\n if (!response.ok) {\n console.error(\n `Failed to set timezone! ${response.statusText}`,\n );\n }\n data = await response.json();\n } catch (e) {\n console.error(`Error setting timezone ${e}`);\n }\n }\n }\n console.log(`This page served by ${eBookConfig.served_by}`);\n if (eBookConfig.isLoggedIn) {\n mess = `username: ${eBookConfig.username}`;\n if (!eBookConfig.isInstructor) {\n const ipDropdown = document.getElementById(\"ip_dropdown_link\");\n if (ipDropdown && typeof ipDropdown.remove === \"function\") {\n ipDropdown.remove();\n }\n const instPeer = document.getElementById(\"inst_peer_link\");\n if (instPeer && typeof instPeer.remove === \"function\") {\n instPeer.remove();\n }\n }\n document.dispatchEvent(new Event(\"runestone:login\"));\n addReadingList();\n // Only show the StudyClues widget for certain base courses and when the path includes \"/ns/books/\".\n // This is a temporary measure to limit the widget to courses that are known to work well with it and to avoid showing it on non-book pages where it may not be as useful.\n if (shouldShowStudyCluesWidget()) {\n createStudyCluesWidget();\n }\n // Avoid the timedRefresh on the grading page.\n if (\n window.location.pathname.indexOf(\"/admin/grading\") == -1 &&\n window.location.pathname.indexOf(\"/peer/\") == -1\n ) {\n timedRefresh();\n }\n } else {\n mess = \"Not logged in\";\n document.dispatchEvent(new Event(\"runestone:logout\"));\n let bw = document.getElementById(\"browsing_warning\");\n if (bw) {\n bw.innerHTML =\n \"\";\n }\n let aw = document.getElementById(\"ad_warning\");\n if (aw) {\n aw.innerHTML =\n \"\";\n }\n }\n document.querySelectorAll(\".loggedinuser\").forEach((el) => {\n el.innerHTML = mess;\n });\n\n pageProgressTracker = new PageProgressBar(eBookConfig.activities);\n notifyRunestoneComponents();\n}\n\nfunction setupNavbarLoggedIn() {\n const profileLink = document.getElementById(\"profilelink\");\n if (profileLink) profileLink.style.removeProperty(\"display\");\n const passwordLink = document.getElementById(\"passwordlink\");\n if (passwordLink) passwordLink.style.removeProperty(\"display\");\n const registerLink = document.getElementById(\"registerlink\");\n if (registerLink) registerLink.style.display = \"none\";\n document.querySelectorAll(\"li.loginout\").forEach((el) => {\n el.innerHTML =\n 'Log Out';\n });\n}\ndocument.addEventListener(\"runestone:login\", setupNavbarLoggedIn);\n\nfunction setupNavbarLoggedOut() {\n if (eBookConfig.useRunestoneServices) {\n console.log(\"setup navbar for logged out\");\n const registerLink = document.getElementById(\"registerlink\");\n if (registerLink) registerLink.style.removeProperty(\"display\");\n const profileLink = document.getElementById(\"profilelink\");\n if (profileLink) profileLink.style.display = \"none\";\n const passwordLink = document.getElementById(\"passwordlink\");\n if (passwordLink) passwordLink.style.display = \"none\";\n const ipDropdown = document.getElementById(\"ip_dropdown_link\");\n if (ipDropdown) ipDropdown.style.display = \"none\";\n const instPeer = document.getElementById(\"inst_peer_link\");\n if (instPeer) instPeer.style.display = \"none\";\n document.querySelectorAll(\"li.loginout\").forEach((el) => {\n el.innerHTML =\n 'Login';\n });\n document.querySelectorAll(\".footer\").forEach((el) => {\n el.innerHTML = \"user not logged in\";\n });\n }\n}\ndocument.addEventListener(\"runestone:logout\", setupNavbarLoggedOut);\n\nfunction notifyRunestoneComponents() {\n // Runestone components wait until login process is over to load components because of storage issues. This triggers the `dynamic import machinery`, which then sends the login complete signal when this and all dynamic imports are finished.\n console.log(\"triggering runestone:pre-login-complete\");\n document.dispatchEvent(new Event(\"runestone:pre-login-complete\"));\n}\n\nfunction placeAdCopy() {\n if (typeof showAd !== \"undefined\" && showAd) {\n let adNum = Math.floor(Math.random() * 2) + 1;\n let adBlock = document.getElementById(`adcopy_${adNum}`);\n let rsElements = document.querySelectorAll(\".runestone\");\n if (rsElements.length > 0) {\n let randomIndex = Math.floor(Math.random() * rsElements.length);\n rsElements[randomIndex].after(adBlock);\n adBlock.style.display = \"block\";\n }\n }\n}\n\n// initialize stuff\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n if (eBookConfig) {\n handlePageSetup();\n placeAdCopy();\n } else {\n if (typeof eBookConfig === \"undefined\") {\n console.log(\n \"eBookConfig is not defined. This page must not be set up for Runestone\",\n );\n }\n }\n});\n\n// misc stuff\n// todo: This could be further distributed but making a video.js file just for one function seems dumb.\nwindow.addEventListener(\"load\", function () {\n // add the video play button overlay image\n document.querySelectorAll(\".video-play-overlay\").forEach(function (el) {\n el.style.backgroundImage =\n \"url('{{pathto('_static/play_overlay_icon.png', 1)}}')\";\n });\n\n // This function is needed to allow the dropdown search bar to work;\n // The default behaviour is that the dropdown menu closes when something in\n // it (like the search bar) is clicked\n document\n .querySelectorAll(\".dropdown input, .dropdown label\")\n .forEach(function (el) {\n el.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n });\n });\n\n // re-write some urls\n // This is tricker than it looks and you have to obey the rules for # anchors\n // The #anchors must come after the query string as the server basically ignores any part\n // of a url that comes after # - like a comment...\n if (location.href.includes(\"mode=browsing\")) {\n let queryString = \"?mode=browsing\";\n document.querySelectorAll(\"a\").forEach((link) => {\n let anchorText = \"\";\n if (\n link.href.includes(\"books/published\") &&\n !link.href.includes(\"?mode=browsing\")\n ) {\n if (link.href.includes(\"#\")) {\n let aPoint = link.href.indexOf(\"#\");\n anchorText = link.href.substring(aPoint);\n link.href = link.href.substring(0, aPoint);\n }\n link.href = link.href.includes(\"?\")\n ? link.href + queryString.replace(\"?\", \"&\") + anchorText\n : link.href + queryString + anchorText;\n }\n });\n }\n});\n\n/**\n * Returns true if the string appears to contain LaTeX math.\n */\nexport function looksLikeLatexMath(text) {\n if (typeof text !== \"string\") return false;\n\n // Common LaTeX math delimiters\n const mathDelimiters = [\n /\\$\\$[\\s\\S]+?\\$\\$/, // $$ ... $$\n /\\$[^$\\n]+?\\$/, // $ ... $\n /\\\\\\[[\\s\\S]+?\\\\\\]/, // \\[ ... \\]\n /\\\\\\([\\s\\S]+?\\\\\\)/, // \\( ... \\)\n ];\n\n // Common math commands (avoid generic \\text or \\ref-only cases)\n const mathCommands =\n /\\\\(frac|sqrt|sum|prod|int|lim|sin|cos|tan|log|ln|alpha|beta|gamma|pi|theta|sigma|Delta|cdot|times|leq|geq|neq)\\b/;\n\n // Superscripts/subscripts like x^2 or a_i\n const superSubScript = /[a-zA-Z0-9]\\s*[\\^_]\\s*\\{?.+?\\}?/;\n\n return (\n mathDelimiters.some((re) => re.test(text)) ||\n mathCommands.test(text) ||\n superSubScript.test(text)\n );\n}\n","import { runestone_import } from \"../../../webpack.index.js\";\n\nexport async function renderRunestoneComponent(\n componentSrc,\n whereDiv,\n moreOpts\n) {\n /**\n * The easy part is adding the componentSrc to the existing div.\n * The tedious part is calling the right functions to turn the\n * source into the actual component.\n */\n if (!componentSrc) {\n jQuery(`#${whereDiv}`).html(\n `

    Sorry, no source is available for preview.

    `\n );\n return;\n }\n let patt = /..\\/_images/g;\n componentSrc = componentSrc.replace(\n patt,\n `${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`\n );\n jQuery(`#${whereDiv}`).html(componentSrc);\n\n if (typeof window.componentMap === \"undefined\") {\n window.componentMap = {};\n }\n\n let componentKind = $($(`#${whereDiv} [data-component]`)[0]).data(\n \"component\"\n );\n // Import the JavaScript for this component before proceeding.\n await runestone_import(componentKind);\n let opt = {};\n opt.orig = jQuery(`#${whereDiv} [data-component]`)[0];\n if (opt.orig) {\n opt.lang = $(opt.orig).data(\"lang\");\n opt.useRunestoneServices = true;\n opt.graderactive = false;\n opt.python3 = true;\n if (typeof moreOpts !== \"undefined\") {\n for (let key in moreOpts) {\n opt[key] = moreOpts[key];\n }\n }\n }\n\n if (typeof component_factory === \"undefined\") {\n alert(\"Error: Missing the component factory!\");\n } else {\n if (\n !window.component_factory[componentKind] &&\n !jQuery(`#${whereDiv}`).html()\n ) {\n jQuery(`#${whereDiv}`).html(\n `

    Preview not available for ${componentKind}

    `\n );\n } else {\n let res = window.component_factory[componentKind](opt);\n if (componentKind === \"activecode\") {\n if (moreOpts.multiGrader) {\n window.componentMap[\n `${moreOpts.gradingContainer} ${res.divid}`\n ] = res;\n } else {\n window.componentMap[res.divid] = res;\n }\n }\n }\n }\n}\n\nexport function createTimedComponent(componentSrc, moreOpts) {\n /* The important distinction is that the component does not really need to be rendered\n into the page, in fact, due to the async nature of getting the source the list of questions\n is made and the original html is replaced by the look of the exam.\n */\n\n let patt = /..\\/_images/g;\n componentSrc = componentSrc.replace(\n patt,\n `${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`\n );\n\n let componentKind = $($(componentSrc).find(\"[data-component]\")[0]).data(\n \"component\"\n );\n\n let origId = $(componentSrc).find(\"[data-component]\").first().attr(\"id\");\n\n // Double check -- if the component source is not in the DOM, then briefly add it\n // and call the constructor.\n let hdiv;\n if (!document.getElementById(origId)) {\n hdiv = $(\"
    \", {\n css: { display: \"none\" },\n }).appendTo(\"body\");\n hdiv.html(componentSrc);\n }\n // at this point hdiv is a jquery object\n\n let ret;\n let opts = {\n orig: document.getElementById(origId),\n timed: true,\n };\n if (typeof moreOpts !== \"undefined\") {\n for (let key in moreOpts) {\n opts[key] = moreOpts[key];\n }\n }\n\n if (componentKind in window.component_factory) {\n ret = window.component_factory[componentKind](opts);\n }\n\n let rdict = {};\n rdict.question = ret;\n return rdict;\n}\n\n// For integration with the React overhault of Pretext\n// 1. Disable the automatic instantiation at the end of each component.js\n// 2. react will search for all \".runestone\" and will call this function for each of them.\nexport async function renderOneComponent(rsDiv) {\n // Find the actual component inside the runestone component.\n let component = rsDiv.querySelector(\"[data-component]\");\n if (component == null) {\n console.log(\"Render was called for a component, but now [data-component] attribute is present. This may mean the component has already been rendered.\")\n return;\n }\n let componentKind = component.dataset.component;\n await runestone_import(componentKind);\n if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n // If this element exists within a timed component, don't render it here\n try {\n let divid = component.id;\n window.componentMap[divid] = window.component_factory[\n componentKind\n ]({\n orig: component,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n });\n } catch (err) {\n console.log(`Error rendering ${componentKind} Problem ${this.id}\n Details: ${err}`);\n }\n }\n}\n"],"names":["$","patchToc","$ul","minLevel","findA","$elem","level","find","each","index","item","$item","tag","tagName","toLowerCase","$childrenLi","children","$parentLi","parent","length","addClass","first","attr","patchTables","removeClass","navHeight","height","shiftWindow","scrollBy","location","hash","window","addEventListener","this","remove","not","$parent","$kids","detach","replaceWith","after","$localLi","dropdown","i","e","hasClass","text","jQuery","codeExercises","presentModeInitialized","presentToggle","dataComponent","closest","css","wrapAll","wrap","before","presentModeSetup","bod","presentClass","fullHeightClass","bottomClass","localStorage","setItem","presenterCssLink","disabled","activateExercise","getActiveExercise","active","filter","nextExercise","nextIndex","prevExercise","prevIndex","document","on","eBookConfig","isInstructor","prepend","change","i18n","extend","fallbacks","ab","ace","aln","als","an","anp","arn","arz","av","ay","ba","bar","bcc","bh","bjn","bm","bpy","bqi","bug","ce","crh","csb","cv","dsb","dtp","egl","eml","ff","fit","frc","frp","frr","fur","gag","gan","gl","glk","gn","gsw","hif","hsb","ht","ii","inh","iu","jut","jv","kaa","kbd","khw","kiu","kk","kl","koi","krc","ks","ksh","ku","kv","lad","lb","lbe","lez","li","lij","liv","lmo","ln","ltg","lzz","mai","mg","mhr","min","mo","mrj","mwl","myv","mzn","nah","nap","nds","no","os","pcd","pdc","pdt","pfl","pms","pt","qu","qug","rgn","rmy","rue","ruq","sa","sah","scn","sg","sgs","sli","sr","srn","stq","su","szl","tcy","tg","tt","ty","udm","ug","uk","vec","vep","vls","vmf","vot","vro","wa","wo","wuu","xal","xmf","yi","za","zea","zh","language","pluralRules","ak","one","am","ar","zero","two","few","many","ars","as","be","bn","br","bs","cs","cy","da","fa","fil","fr","ga","gd","gu","guw","gv","he","hi","hr","hy","is","iw","kab","kn","kw","lag","lt","lv","mk","mr","mt","naq","nso","pa","pl","prg","ro","ru","se","sh","shi","si","sk","sl","sma","smi","smj","smn","sms","ti","tl","tzm","zu","convertPlural","count","forms","pluralFormIndex","form","explicitPluralPattern","RegExp","test","parseInt","slice","indexOf","undefined","map","locale","getPluralForm","Math","number","pluralForms","pluralRuleParser","convertNumber","num","integer","tmp","transformTable","numberString","convertedNumber","digitTransformTable","String","parseFloat","convertGrammar","word","gender","push","tables","ml","lo","or","kh","my","ta","te","th","bo","split","languages","strongDirRegExp","parser","emitter","bidi","nodes","m","dir","match","module","exports","MessageParserEmitter","prototype","constructor","emit","node","replacements","ret","subnodes","operation","messageParserEmitter","n","Error","concat","result","replace","plural","grammar","MessageParser","options","defaults","simpleParse","message","parameters","str","parse","ast","pipe","colon","backslash","anyCharacter","dollar","digits","regularLiteral","regularLiteralWithoutBar","escapedOrLiteralWithoutBar","escapedOrRegularLiteral","templateContents","templateName","openTemplate","closeTemplate","expression","paramExpression","p","fn","pos","choice","parserSyntax","sequence","res","originalPos","nOrMore","parsed","makeStringParser","s","len","makeRegexParser","regex","matches","escapedLiteral","replacement","templateParam","expr","templateWithReplacement","templateWithOutReplacement","template","toString","join","start","MessageStore","messages","sources","load","source","url","deferred","key","deferreds","messageStore","log","Deferred","getJSON","done","resolve","fail","jqxhr","settings","exception","promise","localization","set","Object","hasOwnProperty","call","when","apply","get","messageKey","I18N","nav","Array","localize","localeParts","localePartIndex","fallbackIndex","tryingLocale","fallbackLocale","destroy","removeData","fallbackLocales","locIndex","sourceMap","pop","param1","data","arguments","lBracket","rBracket","type","$this","html","debug","console","navigator","userLanguage","idleTimer","newTimeout","elem","opts","startImmediately","idle","enabled","timeout","events","toggleIdleState","myelem","obj","elapsed","Date","olddate","clearTimeout","tId","setTimeout","event","Event","trigger","off","stop","trim","isPreTeXt","querySelector","processPageState","completionFlag","pageLoad","markingComplete","markingIncomplete","currentPathname","pathname","substring","lastIndexOf","isPtxBook","lastPageUrl","lastPageScrollLocation","round","scrollTop","course","ajaxError","jqhxr","ajax","new_server_prefix","contentType","dataType","JSON","stringify","method","async","lastPositionVal","href","completionClass","completionMsg","detail","completionStatus","scp","classList","add","append","getCompletions","getUrlVar","animate","navLinkBgRightHalfOpen","navLinkBgRightHiddenPosition","outerWidth","relationsNextIconInitialPosition","relationsNextIconNewPosition","show","navBgShown","scroll","right","left","addNavigationAndCompletionButtons","subChapterList","allSubChapterURLs","chapterName","subChapterName","parentElement","endDate","hover","next","hide","lastPageData","lastPageChapter","lastPageSubchapter","decorateTableOfContents","getUrlVars","vars","hashes","search","name","rb","querySelectorAll","forEach","el","div_id","getAttribute","logBookEvent","act","open","id","btn","container","codeInput","textContent","warn","style","display","setupPTXEvents","getElementById","overflow","SpliceWrapper","super","initSplice","base64","jsonPayload","sourceIframe","sendingIframe","subject","handleScoreAndState","handleSpliceEvent","handleGetState","origin","msgdata","jwt","decodeURIComponent","atob","c","charCodeAt","frame_id","score","getUniqueID","frame","rsDiv","activity_id","src","error","state","percent","correct","answer","f","getElementsByTagName","contentWindow","getSavedState","response","fetch","headers","body","ok","status","json","postMessage","message_id","checkLocalStorage","setLocalStorage","restoreAnswers","disableInteraction","module_map","activecode","ble","clickablearea","codelens","datafile","dragndrop","fillintheblank","groupsub","khanex","lp_build","matching","multiplechoice","hparsons","parsons","poll","quizly","reveal","selectquestion","shortanswer","showeval","simple_sensor","spreadsheet","tabbedStuff","timedAssessment","wavedrom","webwork","youtube","doenet","Promise","module_map_cache","QUEUE_FLUSH_TIME_MS","queue","queueLastFlush","flushQueue","now","toFlush","component_name","flushedPromise","reject","flushed","all","pre_login_complete_promise","runestone_auto_import","Set","element","a","value","z","msg","then","dataset","reactInUse","dispatchEvent","CustomEvent","runestone_import","retPromise","r","rej","queueImport","ready","script_src","currentScript","rc","getSwitch","toggleSwitch","currentTheme","getItem","documentElement","setAttribute","checked","switchTheme","popupScratchAC","scratchDiv","ACFactory","createScratchActivecode","divid","componentMap","createActiveCode","acDefaultLanguage","isLoggedIn","enableSaveLoad","toggleScratchActivecode","renderOneComponent","runestoneComponents","NO_DECORATE","RunestoneBase","component_ready_promise","_component_ready_resolve_fn","optional","allComponents","sid","graderactive","showfeedback","timed","isTimed","enforceDeadline","deadline","parseBooleanAttribute","orig","selector_id","assessmentTaken","timedWrapper","question_label","is_toggle","is_select","mjelements","self","mjReady","mjresolver","aQueue","AutoQueue","preamble","y","createElement","innerHTML","appendChild","jsonHeaders","Headers","Accept","attributeName","attrValue","lowerValue","eventInfo","post_return","course_name","clientLoginStatus","timezoneoffset","getTimezoneOffset","assignmentId","assignment_id","useRunestoneServices","logLevel","postLogMessage","prefix","updateProgress","decorateStatus","request","Request","scoreSpec","gradeBox","updateScores","alert","assigned","scoreSpan","getElementsByClassName","toFixed","allScores","allmax","total","max","totalSpan","maxSpan","percentSpan","logRunEvent","post_promise","forceSave","save_code","errinfo","checkServer","will_be_ready","checkServerComplete","csresolver","rawdeadline","tzoff","practice_mode","peer","loadData","repopulateFromStorage","attempted","statusText","err","indicate_component_ready","containerDiv","shouldUseServer","storedData","ex","localStorageKey","removeItem","storageDate","timestamp","email","addCaption","elType","capDiv","caption","hasUserActivity","isAnswered","checkCurrentAnswer","logCurrentAnswer","renderFeedback","queueMathJax","component","MathJax","typesetPromise","runestoneMathReady","enqueue","assignmentInfo","questions","Queue","_items","dequeue","shift","size","_pendingPromise","qq","payload","preambleDiv","insertAdjacentElement","PageProgressBar","actDict","possible","assignment_spec","keys","activities","page","firstElementChild","calculateProgress","scprogresscontainer","renderProgress","k","scprogresstotal","scprogressposs","subchapterprogress","progressElem","className","completeActivities","requiredActivities","activities_required","sendCompletedReadingScore","cb","click","subchapterDiv","val","scprogresstotal2","scprogressposs2","subchapterprogress2","pageProgressTracker","studyCluesConversationId","appendStudyCluesMessage","messagesEl","role","isHtml","bubble","scrollHeight","looksLikeLatexMath","some","re","profileLink","removeProperty","passwordLink","registerLink","app","ipDropdown","instPeer","mess","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","RS_info","parts","cookie","getCookie","tz_match","cleaned","info","tz_offset","served_by","username","assignment_info_string","readings","top","bottom","page_name","exit_link","fst","snd","new_pos","path_parts","new_pos_link","assignment_info","assignment_name","reading_names","readingNames","cur_path_parts","ptxbook","endLop","contains","position","num_readings","cloneNode","txt","fst_lnk","exerciseOnPage","pageExercises","from","includes","snd_lnk","exit_clone","content","insertBefore","firstChild","pc","marginBottom","mainContent","addReadingList","host","hostname","basecourse","shouldShowStudyCluesWidget","head","button","chat","closeBtn","inputEl","sendBtn","coachToggle","coachMode","toggleChat","toggle","focus","sendMessage","query","sectionInfo","section","sectionTitle","innerText","sectionSpan","loadingBubble","conversation_id","studycluesResponse","llmResponse","llm_response","references","formattedResponse","content_url","evt","preventDefault","createStudyCluesWidget","idleTimeoutId","onIdle","resetIdleTimer","eventName","passive","timedRefresh","bw","aw","handlePageSetup","showAd","adNum","floor","random","adBlock","rsElements","placeAdCopy","backgroundImage","stopPropagation","queryString","link","anchorText","aPoint","renderRunestoneComponent","componentSrc","whereDiv","moreOpts","componentKind","opt","lang","python3","component_factory","multiGrader","gradingContainer","createTimedComponent","hdiv","origId","appendTo","rdict","question"],"sourceRoot":""} \ No newline at end of file diff --git a/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.map.gz b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js.map.gz new file mode 100755 index 0000000000000000000000000000000000000000..3cfcc3f50e817e073f5986098ba03255c59edaf3 GIT binary patch literal 75192 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 literal 0 HcmV?d00001 diff --git a/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js b/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js new file mode 100755 index 0000000..0b3443e --- /dev/null +++ b/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,r,t,a,d,c={},n={};function o(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={id:e,loaded:!1,exports:{}};return c[e].call(t.exports,t,t.exports,o),t.loaded=!0,t.exports}o.m=c,e=[],o.O=(r,t,a,d)=>{if(!t){var c=1/0;for(b=0;b=d)&&Object.keys(o.O).every((e=>o.O[e](t[f])))?t.splice(f--,1):(n=!1,d0&&e[b-1][2]>d;b--)e[b]=e[b-1];e[b]=[t,a,d]},o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((r,t)=>(o.f[t](e,r),r)),[])),o.u=e=>e+"."+{28:"bb005543f41af5fb",39:"15b22d3dac60149d",126:"a976f62852f30b51",128:"5bed857c54ac4e8b",131:"ee437eeefadd750d",168:"fe63e6dec2d06468",186:"be52164d57f4b7e4",207:"3a19748be8bb18ba",249:"7ec032cf0b3ede9a",268:"60719f20e69f885e",296:"37eb8c05642d8ef9",340:"c525bd899366c5f9",357:"a6fa55aea0c38a63",412:"5965503d81003593",420:"e197c63136060d40",442:"f48919e396acaa18",460:"bae9001422d7a484",466:"63840a83388af9f2",486:"b03e25ab1e190440",529:"f5fdfcbb88388877",566:"8345f32fac0929c0",576:"17e80ff72c52b54b",580:"28428521d8f13ec7",616:"89f80a32caf41aef",625:"120987bdd5293ae3",640:"cbc8d3a34deb8837",662:"e77a89c65303c376",680:"eb99211d1806dba1",759:"7032c311ffc20fc3",764:"c33a81cafe63d2b6",770:"7bd6d39128dde910",817:"3438cd0f1b0f98bc",819:"a9dba7a670e07497",824:"4343b78afc34c12f",877:"c2f5ef32dd94b9b6",915:"8f500bccc86f901d",919:"4801fda4dafcc487"}[e]+".js",o.miniCssF=e=>"prefix-"+e+"."+{39:"ec5d93a85cddac28",131:"b184379d0dc5871b",168:"1c4deaed00ca1f5e",186:"0d47de180767fda9",198:"86b6b2a70a576922",249:"6ca19da539a8ed1a",268:"67f2441667bc7c43",294:"986bf74bfa4ccbd4",350:"dbca9271f6e2dfbf",380:"67748940131a4a84",412:"25f3c4ff23eb9893",442:"6ae0ea584f8e75c5",460:"7c0b70502d117f7d",486:"958d128f4cca3039",576:"9b1852878840651d",580:"22958d4327b0425a",616:"5c78f604ddad1ec0",621:"8c109e297bdd8ce7",737:"cf869b6ea8bfad2f",824:"271ae6cff6401ed5",850:"e86d03c2cec75438",877:"5cc60d2dc82dc67b",915:"882512b642b7fffa"}[e]+".css",o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="WebComponents:",o.l=(e,a,d,c)=>{if(r[e])r[e].push(a);else{var n,f;if(void 0!==d)for(var i=document.getElementsByTagName("script"),b=0;b{n.onerror=n.onload=null,clearTimeout(u);var d=r[e];if(delete r[e],n.parentNode&&n.parentNode.removeChild(n),d&&d.forEach((e=>e(a))),t)return t(a)},u=setTimeout(s.bind(null,void 0,{type:"timeout",target:n}),12e4);n.onerror=s.bind(null,n.onerror),n.onload=s.bind(null,n.onload),f&&document.head.appendChild(n)}},o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var r=o.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),a=e=>new Promise(((r,t)=>{var a=o.miniCssF(e),d=o.p+a;if(((e,r)=>{for(var t=document.getElementsByTagName("link"),a=0;a{var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onerror=d.onload=c=>{if(d.onerror=d.onload=null,"load"===c.type)t();else{var n=c&&("load"===c.type?"missing":c.type),o=c&&c.target&&c.target.href||r,f=new Error("Loading CSS chunk "+e+" failed.\n("+o+")");f.code="CSS_CHUNK_LOAD_FAILED",f.type=n,f.request=o,d.parentNode.removeChild(d),a(f)}},d.href=r,document.head.appendChild(d)})(e,d,r,t)})),d={121:0},o.f.miniCss=(e,r)=>{d[e]?r.push(d[e]):0!==d[e]&&{39:1,131:1,168:1,186:1,198:1,249:1,268:1,294:1,350:1,380:1,412:1,442:1,460:1,486:1,576:1,580:1,616:1,621:1,737:1,824:1,850:1,877:1,915:1}[e]&&r.push(d[e]=a(e).then((()=>{d[e]=0}),(r=>{throw delete d[e],r})))},(()=>{var e={121:0};o.f.j=(r,t)=>{var a=o.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^([16]21|(35|38|85)0|198|294|737)$/.test(r))e[r]=0;else{var d=new Promise(((t,d)=>a=e[r]=[t,d]));t.push(a[2]=d);var c=o.p+o.u(r),n=new Error;o.l(c,(t=>{if(o.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var d=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;n.message="Loading chunk "+r+" failed.\n("+d+": "+c+")",n.name="ChunkLoadError",n.type=d,n.request=c,a[1](n)}}),"chunk-"+r,r)}},o.O.j=r=>0===e[r];var r=(r,t)=>{var a,d,[c,n,f]=t,i=0;if(c.some((r=>0!==e[r]))){for(a in n)o.o(n,a)&&(o.m[a]=n[a]);if(f)var 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 literal 0 HcmV?d00001 diff --git a/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map b/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map new file mode 100755 index 0000000..5f17188 --- /dev/null +++ b/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prefix-runtime.b76b8eace4405b9e.bundle.js","mappings":"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","sources":["webpack://WebComponents/webpack/runtime/chunk loaded","webpack://WebComponents/webpack/runtime/load script","webpack://WebComponents/webpack/runtime/css loading","webpack://WebComponents/webpack/bootstrap","webpack://WebComponents/webpack/runtime/compat get default export","webpack://WebComponents/webpack/runtime/define property getters","webpack://WebComponents/webpack/runtime/ensure chunk","webpack://WebComponents/webpack/runtime/get javascript chunk filename","webpack://WebComponents/webpack/runtime/get mini-css chunk filename","webpack://WebComponents/webpack/runtime/global","webpack://WebComponents/webpack/runtime/hasOwnProperty shorthand","webpack://WebComponents/webpack/runtime/make namespace object","webpack://WebComponents/webpack/runtime/node module decorator","webpack://WebComponents/webpack/runtime/publicPath","webpack://WebComponents/webpack/runtime/jsonp chunk loading"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"WebComponents:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t121: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"39\":1,\"131\":1,\"168\":1,\"186\":1,\"198\":1,\"249\":1,\"268\":1,\"294\":1,\"350\":1,\"380\":1,\"412\":1,\"442\":1,\"460\":1,\"486\":1,\"576\":1,\"580\":1,\"616\":1,\"621\":1,\"737\":1,\"824\":1,\"850\":1,\"877\":1,\"915\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"28\":\"bb005543f41af5fb\",\"39\":\"15b22d3dac60149d\",\"126\":\"a976f62852f30b51\",\"128\":\"5bed857c54ac4e8b\",\"131\":\"ee437eeefadd750d\",\"168\":\"fe63e6dec2d06468\",\"186\":\"be52164d57f4b7e4\",\"207\":\"3a19748be8bb18ba\",\"249\":\"7ec032cf0b3ede9a\",\"268\":\"60719f20e69f885e\",\"296\":\"37eb8c05642d8ef9\",\"340\":\"c525bd899366c5f9\",\"357\":\"a6fa55aea0c38a63\",\"412\":\"5965503d81003593\",\"420\":\"e197c63136060d40\",\"442\":\"f48919e396acaa18\",\"460\":\"bae9001422d7a484\",\"466\":\"63840a83388af9f2\",\"486\":\"b03e25ab1e190440\",\"529\":\"f5fdfcbb88388877\",\"566\":\"8345f32fac0929c0\",\"576\":\"17e80ff72c52b54b\",\"580\":\"28428521d8f13ec7\",\"616\":\"89f80a32caf41aef\",\"625\":\"120987bdd5293ae3\",\"640\":\"cbc8d3a34deb8837\",\"662\":\"e77a89c65303c376\",\"680\":\"eb99211d1806dba1\",\"759\":\"7032c311ffc20fc3\",\"764\":\"c33a81cafe63d2b6\",\"770\":\"7bd6d39128dde910\",\"817\":\"3438cd0f1b0f98bc\",\"819\":\"a9dba7a670e07497\",\"824\":\"4343b78afc34c12f\",\"877\":\"c2f5ef32dd94b9b6\",\"915\":\"8f500bccc86f901d\",\"919\":\"4801fda4dafcc487\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"prefix-\" + chunkId + \".\" + {\"39\":\"ec5d93a85cddac28\",\"131\":\"b184379d0dc5871b\",\"168\":\"1c4deaed00ca1f5e\",\"186\":\"0d47de180767fda9\",\"198\":\"86b6b2a70a576922\",\"249\":\"6ca19da539a8ed1a\",\"268\":\"67f2441667bc7c43\",\"294\":\"986bf74bfa4ccbd4\",\"350\":\"dbca9271f6e2dfbf\",\"380\":\"67748940131a4a84\",\"412\":\"25f3c4ff23eb9893\",\"442\":\"6ae0ea584f8e75c5\",\"460\":\"7c0b70502d117f7d\",\"486\":\"958d128f4cca3039\",\"576\":\"9b1852878840651d\",\"580\":\"22958d4327b0425a\",\"616\":\"5c78f604ddad1ec0\",\"621\":\"8c109e297bdd8ce7\",\"737\":\"cf869b6ea8bfad2f\",\"824\":\"271ae6cff6401ed5\",\"850\":\"e86d03c2cec75438\",\"877\":\"5cc60d2dc82dc67b\",\"915\":\"882512b642b7fffa\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t121: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^([16]21|(35|38|85)0|198|294|737)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkWebComponents\"] = self[\"webpackChunkWebComponents\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","this","Function","window","obj","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","value","nmd","paths","children","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","test","Error","replace","p","resolve","reject","href","fullhref","existingLinkTags","dataHref","tag","rel","existingStyleTags","findStylesheet","linkTag","errorType","realHref","err","code","request","createStylesheet","miniCss","then","installedChunks","installedChunkData","promise","error","realSrc","message","name","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map.gz b/course/_static/prefix-runtime.b76b8eace4405b9e.bundle.js.map.gz new file mode 100755 index 0000000000000000000000000000000000000000..d840aa149e4f1ca4d453a5cb1e8c5b4b5a320e18 GIT binary patch literal 8468 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 I(cAz400^)|j{pDw diff --git a/course/_static/webpack_static_imports.xml b/course/_static/webpack_static_imports.xml index a678ed5..9344ee1 100755 --- a/course/_static/webpack_static_imports.xml +++ b/course/_static/webpack_static_imports.xml @@ -1,14 +1,14 @@ - prefix-runtime.d2d4c56cb9826035.bundle.js + prefix-runtime.b76b8eace4405b9e.bundle.js prefix-723.3e6434f80549315a.bundle.js - prefix-runestone.a4a209ed3a55c515.bundle.js + prefix-runestone.bbf2283c5c1d4f99.bundle.js prefix-723.3bccd435914aa0ff.css prefix-runestone.b12a7b3f0773ebcd.css https://runestone.academy/cdn/runestone/ - 7.12.2 + 7.13.3 diff --git a/course/boxes.html b/course/boxes.html index 6d36229..99a411d 100755 --- a/course/boxes.html +++ b/course/boxes.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;

    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 Rzy9n0{eSwKIooRABmnKJPKp2k literal 0 HcmV?d00001 diff --git a/course/_static/_runestone-services.xml b/course/_static/_runestone-services.xml index 72ce379..4519158 100755 --- a/course/_static/_runestone-services.xml +++ b/course/_static/_runestone-services.xml @@ -1,14 +1,14 @@ - prefix-runtime.d2d4c56cb9826035.bundle.js + prefix-runtime.b76b8eace4405b9e.bundle.js prefix-723.3e6434f80549315a.bundle.js - prefix-runestone.a4a209ed3a55c515.bundle.js + prefix-runestone.bbf2283c5c1d4f99.bundle.js prefix-723.3bccd435914aa0ff.css prefix-runestone.b12a7b3f0773ebcd.css https://runestone.academy/cdn/runestone/ - 7.12.2 + 7.13.3 diff --git a/course/_static/prefix-486.958d128f4cca3039.css b/course/_static/prefix-486.958d128f4cca3039.css new file mode 100755 index 0000000..f31d315 --- /dev/null +++ b/course/_static/prefix-486.958d128f4cca3039.css @@ -0,0 +1,2 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fff;color:#000}.xml .hljs-meta{color:silver}.hljs-comment,.hljs-quote{color:#007400}.hljs-attribute,.hljs-keyword,.hljs-literal,.hljs-name,.hljs-selector-tag,.hljs-tag{color:#aa0d91}.hljs-template-variable,.hljs-variable{color:#3f6e74}.hljs-code,.hljs-meta .hljs-string,.hljs-string{color:#c41a16}.hljs-link,.hljs-regexp{color:#0e0eff}.hljs-bullet,.hljs-number,.hljs-symbol,.hljs-title{color:#1c00cf}.hljs-meta,.hljs-section{color:#643820}.hljs-built_in,.hljs-class .hljs-title,.hljs-params,.hljs-title.class_,.hljs-type{color:#5c2699}.hljs-attr{color:#836c28}.hljs-subst{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#baeeba}.hljs-deletion{background-color:#ffc8bd}.hljs-selector-class,.hljs-selector-id{color:#9b703f}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic}.hparsons-input{padding:15px}.hparsons-tip{font-style:italic}.parsons-tooltip{background-color:#000;border-radius:6px;color:#fff;max-width:120px;padding:5px;position:absolute;text-align:center;top:30px;visibility:hidden;width:max-content;z-index:1}.parsons-block:hover .parsons-tooltip{visibility:visible}.parsons-block{background-color:#efefef;border:1px solid #d3d3d3;border-radius:10px;display:inline-block;font-family:monospace;margin:5px 1px 0;padding:5px 10px;position:relative}.drop-area .parsons-block.incorrectPosition{background-color:#ffbaba;border:1px solid red}.parsons-block:focus,.parsons-block:hover{border-color:#000}.parsons-block:focus-visible{outline:3px solid #005fcc;outline-offset:2px}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.drop-area{background-color:#ffa;height:auto;margin:2px 0;min-height:32px;padding:0 5px 5px}.drop-area.incorrect{background-color:#f2dede;border-color:#f2b6b6}.drop-area.correct{background-color:#dff0d8;border-color:#ade595}.drag-area .parsons-block:hover .tooltip{visibility:visible}.drag-area{background-color:#efefff;height:auto;margin:2px 0;min-height:32px;padding:0 5px 5px}pre.context{background-color:#ffd;margin:0;padding:2px 10px}.hp_actions{margin-top:10px;text-align:center}.hparsons-input{padding:0}.hparsons-tip{margin-top:10px}.hp_output{background-color:inherit;display:none}.hp_output pre{background-color:var(--questionBgColor,#d3d3d3)}.hp_feedback{margin-top:10px}.hp_sql_result{background-color:var(--questionBgColor,#d3d3d3);border-radius:6px;margin-bottom:10px;padding:10px}.hp_sql_result_success{color:var(--parsonsCorrectBgColor,green)}.hp_sql_result_failure,.hp_sql_result_success{background-color:transparent;border:0;margin-bottom:10px;margin-top:10px;min-height:0!important;padding:0}.hp_sql_result_failure{color:var(--parsonsIncorrectBgColor,red)}micro-parsons .drag-area{background-color:var(--questionBgColor,#efefff);border:1px solid var(--componentBorderColor,#efefff)}micro-parsons .parsons-block{color:#000} +/*# sourceMappingURL=prefix-486.958d128f4cca3039.css.map*/ \ No newline at end of file diff --git a/course/_static/prefix-486.958d128f4cca3039.css.gz b/course/_static/prefix-486.958d128f4cca3039.css.gz new file mode 100755 index 0000000000000000000000000000000000000000..08f8876852637e63c86fea18ed423d08903de36f GIT binary patch literal 1146 zcmV-=1cmz_iwFP!000026Qx#7Z{s!)z4uqR$YryLypq3SOXy|yRG)ePnb`M13=VQWdwc_}r0E%X~0F7+`v z<)m@Cs0m|2?eh$(>&+*wF6+~5U7xPqYDwtp-sncL{DE^`P%X8|AJR0v&QFz`wN^<5 zj$FDeDlw!KIJzyz)WX9pao3W#b@NzQXya4GUjVI50$pFGZ?o zW^f3VTjW?)f<@fB@;O~b#+jx!!Jz;&3ZMmi1hGH3{JAd@MRy=p*vnKsNVV0< zCPLMX>)S8udM|D|QBOJd+geL+a$hDgU6j~EU=l-^Xl%ZzPesoGFDi0Mj)J*Eo-I<` ziU8LBUE7xCoRn5e?90Nz$t9S3uX2hV4W@9q&X?ZtO;}M1Y|?Xn5R8E;y0AV0Md)Z= z{DW08IOW+5dOMr)gC9<_yLtvO+gAxA$0^-#|AeCR496H^7i{*xmi`&Bk$LEGP6~z1 z3SHz*dz@54p7Tm8ZEHdS=`wqvJUcTVIvw&gYlHQq8Nf*+-Vib~x=x4zGJB7HE)>i3V}zX+hps6Qf8;Rn@9|QKnu&C#6XH7_@CHcQbI6rG z8d3*|WgbLN@+5~O0%)(kfMC&{U?o%%HkXS*2c-V~>+Zll_U*)`vMd-dDBe@e7v-kh z3`2YzfN`F(?I-|Yu->hG0J5JFQS6-`^-S;kLBHS}_#gDt25$%7;ipMfIEw*q-LeSX z;z!&IX|F4L>8uhzQQA(r8#W(K%XBmfX?m<)SYk26GJ(;9yP^y6Rx^Z57&!b^V^RjrL9 z7~(|(|u`(Qr!Su$Fl=Ke{7&i`OaJT7-+n<=a&byl+s%Bp-m+}5d#;P M1$NY&A`T1y0K4%tQvd(} literal 0 HcmV?d00001 diff --git a/course/_static/prefix-486.958d128f4cca3039.css.map b/course/_static/prefix-486.958d128f4cca3039.css.map new file mode 100755 index 0000000..547dddb --- /dev/null +++ b/course/_static/prefix-486.958d128f4cca3039.css.map @@ -0,0 +1 @@ +{"version":3,"file":"prefix-486.958d128f4cca3039.css","mappings":"AAAA,cAAc,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,eAAe,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC,gBAAgB,YAAY,CAAC,0BAA0B,aAAa,CAAC,oFAAoF,aAAa,CAAC,uCAAuC,aAAa,CAAC,gDAAgD,aAAa,CAAC,wBAAwB,aAAa,CAAC,mDAAmD,aAAa,CAAC,yBAAyB,aAAa,CAAC,kFAAkF,aAAa,CAAC,WAAW,aAAa,CAAC,YAAY,UAAU,CAAC,cAAc,qBAAqB,CAAC,iBAAiB,CAAC,eAAe,wBAAwB,CAAC,eAAe,wBAAwB,CAAC,uCAAuC,aAAa,CAAC,0BAA0B,eAAe,CAAC,eAAe,iBAAiB,CCAh7B,gBACE,YACF,CACA,cACE,iBACF,CACA,iBAIE,qBAAuB,CAGvB,iBAAkB,CAFlB,UAAW,CAHX,eAAgB,CAMhB,WAAY,CACZ,iBAAkB,CAHlB,iBAAkB,CAKlB,QAAS,CAVT,iBAAkB,CAElB,iBAAkB,CAOlB,SAEF,CACA,sCACE,kBACF,CACA,eAOE,wBAAyB,CACzB,wBAAyB,CAFzB,kBAAmB,CALnB,oBAAqB,CACrB,qBAAsB,CAQtB,gBAAe,CADf,gBAAiB,CAJjB,iBAMF,CACA,4CACE,wBAAyB,CACzB,oBACF,CACA,0CAEE,iBACF,CACA,6BACE,yBAA0B,CAC1B,kBACF,CAEA,SAOE,kBAAsB,CAEtB,QAAS,CANT,UAAW,CAEX,WAAY,CACZ,eAAgB,CAFhB,SAAU,CAHV,iBAAkB,CAOlB,kBAAmB,CANnB,SAQF,CACA,WACE,qBAAsB,CAGtB,WAAY,CACZ,YAAa,CAFb,eAAgB,CADhB,iBAIF,CACA,qBACE,wBAAyB,CACzB,oBACF,CACA,mBACE,wBAAyB,CACzB,oBACF,CACA,yCACE,kBACF,CACA,WACE,wBAAyB,CAGzB,WAAY,CACZ,YAAa,CAFb,eAAgB,CADhB,iBAIF,CAEA,YAEE,qBAAsB,CACtB,QAAS,CACT,gBACF,CCvFA,YACI,eAAgB,CAChB,iBACJ,CAEA,gBACI,SACJ,CAEA,cACI,eACJ,CAEA,WAEI,wBAAyB,CADzB,YAEJ,CACA,eACI,+CACJ,CAEA,aACI,eACJ,CAEA,eACI,+CAAmD,CAEnD,iBAAkB,CAClB,kBAAmB,CAFnB,YAGJ,CAEA,uBAEI,wCAMJ,CAEA,8CATI,4BAA6B,CAE7B,QAAW,CAGX,kBAAmB,CADnB,eAAgB,CAEhB,sBAA0B,CAH1B,SAcJ,CARA,uBAEI,wCAMJ,CAEA,yBACI,+CAAiD,CACjD,oDACJ,CAEA,6BACI,UACJ","sources":["webpack://WebComponents/./runestone/hparsons/css/hljs-xcode.css","webpack://WebComponents/./node_modules/micro-parsons/micro-parsons/micro-parsons.css","webpack://WebComponents/./runestone/hparsons/css/hparsons.css"],"sourcesContent":["pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#fff;color:#000}.xml .hljs-meta{color:silver}.hljs-comment,.hljs-quote{color:#007400}.hljs-attribute,.hljs-keyword,.hljs-literal,.hljs-name,.hljs-selector-tag,.hljs-tag{color:#aa0d91}.hljs-template-variable,.hljs-variable{color:#3f6e74}.hljs-code,.hljs-meta .hljs-string,.hljs-string{color:#c41a16}.hljs-link,.hljs-regexp{color:#0e0eff}.hljs-bullet,.hljs-number,.hljs-symbol,.hljs-title{color:#1c00cf}.hljs-meta,.hljs-section{color:#643820}.hljs-built_in,.hljs-class .hljs-title,.hljs-params,.hljs-title.class_,.hljs-type{color:#5c2699}.hljs-attr{color:#836c28}.hljs-subst{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#baeeba}.hljs-deletion{background-color:#ffc8bd}.hljs-selector-class,.hljs-selector-id{color:#9b703f}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic}",".hparsons-input {\n padding: 15px;\n}\n.hparsons-tip {\n font-style: italic;\n}\n.parsons-tooltip {\n visibility: hidden;\n max-width: 120px;\n width: max-content;\n background-color: black;\n color: #fff;\n text-align: center;\n border-radius: 6px;\n padding: 5px;\n position: absolute;\n z-index: 1;\n top: 30px;\n}\n.parsons-block:hover .parsons-tooltip {\n visibility: visible;\n}\n.parsons-block {\n display: inline-block;\n font-family: monospace;\n border-color: gray;\n margin: 0 1px;\n position: relative;\n border-radius: 10px;\n background-color: #efefef;\n border: 1px solid #d3d3d3;\n padding: 5px 10px;\n margin-top: 5px;\n}\n.drop-area .parsons-block.incorrectPosition {\n background-color: #ffbaba;\n border: 1px solid red;\n}\n.parsons-block:hover,\n.parsons-block:focus {\n border-color: black;\n}\n.parsons-block:focus-visible {\n outline: 3px solid #005fcc;\n outline-offset: 2px;\n}\n/* Screen-reader-only live region */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n.drop-area {\n background-color: #ffa;\n padding: 0 5px 5px 5px;\n min-height: 32px;\n height: auto;\n margin: 2px 0;\n}\n.drop-area.incorrect {\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.drop-area.correct {\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.drag-area .parsons-block:hover .tooltip {\n visibility: visible;\n}\n.drag-area {\n background-color: #efefff;\n padding: 0 5px 5px 5px;\n min-height: 32px;\n height: auto;\n margin: 2px 0;\n}\n\npre.context {\n /* white-space: pre; */\n background-color: #ffd;\n margin: 0;\n padding: 2px 10px;\n}\n","/* Todo, better integration with prism and Pretext dark mode*/\n\n.hp_actions {\n margin-top: 10px;\n text-align: center;\n}\n\n.hparsons-input {\n padding: 0;\n}\n\n.hparsons-tip {\n margin-top: 10px;\n}\n\n.hp_output {\n display: none;\n background-color: inherit;\n}\n.hp_output pre {\n background-color: var(--questionBgColor, lightgray);\n}\n\n.hp_feedback {\n margin-top: 10px;\n}\n\n.hp_sql_result {\n background-color: var(--questionBgColor, lightgray);\n padding: 10px;\n border-radius: 6px;\n margin-bottom: 10px;\n}\n\n.hp_sql_result_success {\n background-color: transparent;\n color: var(--parsonsCorrectBgColor, green);\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n}\n\n.hp_sql_result_failure {\n background-color: transparent;\n color: var(--parsonsIncorrectBgColor, red);\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n} \n\nmicro-parsons .drag-area {\n background-color: var(--questionBgColor, #efefff);\n border: 1px solid var(--componentBorderColor, #efefff);\n}\n\nmicro-parsons .parsons-block {\n color: black;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/course/_static/prefix-486.958d128f4cca3039.css.map.gz b/course/_static/prefix-486.958d128f4cca3039.css.map.gz new file mode 100755 index 0000000000000000000000000000000000000000..c9946a0a2d38be11932d75d26f47c93f830063c7 GIT binary patch literal 1972 zcmV;l2TS-LiwFP!000026UA6;0_D?Ufvm`+SZ*X;z2+`?w3ba@dIu)QCz@Kgs1W6YK0qRCU5Or}7;A(Uq z1ozeGQxJS=ExZeYcde;j)uU+`1k)1in(}kb+wzR`z`I8?>~YVwt;2{K!lFA}yPy_5 zT`Rrlwzd&fHlnwc4W)Mr)Yy4a>DuXiFu85;jlZkLF?nmN3{?Lb)w*bVt6f%o00ea0 zq$X;o=9(&_H)dBEYL9SKjNmc~?rythpgq)OaiODB#c=bvF*2rM9pMBb6t>3R^i|>$ zW$cdw)>olLNfgTH+qlcdbqGVf`U&RHlLaezf}th+dkk26 z|G(-WBSs}`RI$Qk#CD+ng+m+|gQYfhAg3OM>L!uG;M;tSA6r zx0*ecOyYHI;o?jg(JM$wPU2ExqdCW`XU0=A%ZbDs{V$7}SRS`2AwIs3u*-tz#u?7^fnvX=nBgU!?&jy#L zUhRkE@_|sJn&e0br)As7q0mqv+D=cj>Vp-n7B!6XjVxEu_V(@V1;%2>#C zyKb~NW4tJH)G9F7=wOUT8B{iKyUMXoB+5x*y+DoX5cjvm2;&$Ty%Z|rh+dW@mvOq; zsURKXZdsAk;=YP6yn$srWl2+TPyh@HKm&fpWIB`nMI9s*-3$pL*8A~58#uAY+9h;R zN@x9*I*vVtP9F~8=qufPrH!5>i%P3yR=)moFWyw-jqg2V)l(aLvbBuz0LDRF_8 z?lVc{44j>M+MDATfm%zd_M*jmJUVd>BE4n=x<9D7#7pS{rYZHE1PowanSc|Gxyw;X zO5r<0F;rQJE zuShz8E6ZXOqa(ODPLF4;yC=?AQVQc~i&6(^OgP3Ax;RqK8O>Kt4!MFjriz1Kd*EM~h4l+1Y!90ue^#}NrW$OD zysdI^?Yh0kw+?ZVlZ7guME>G+9rO2fo1-cPM-2Xt9+LZ!g`)vx#;P>M}CF z6}y!7&rLCE#_)p>0Y zO%I(2+h~5W!8B&pFPvx7M*kONf2HtHJkgDPX-I+k-YOJO80nHeQVHpHFWZKC+B6sN z26r4-zhf!uIx&`T5kMQ27#gDP9nVD0z#S2VgJ|mf&ap<7B0h(Pnqmb)-+m8BziUhn z*zQ_&D?4)UY>bWln|9~G?I_mSJm}6UKS0}P8LV#$3Qu^0YM(?xXP6UNU+&h3dc&`e zZGwmDFD^Wx;qw5f2&a(}ccBkK&eaX`x{WHsI8`QoCIa!8KX5F{T>f{?w+L-z<;b;P zgNm7ytau66gD4aD+7ZX`NscI#FSoCi`b|;+H#v=}UQolIs;>Te3nr98jjySWUC6tI zcQ_Kg(mJRhb^b!&V~7gM~Zy{~4;IV%_={c6Phre^7X) zP3{KNyfCVLiT$(=wZi`9%>h&g9)UH-^@BrwgsTrx_5Td@_xK--!MAv)v-vjATwi literal 0 HcmV?d00001 diff --git a/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js new file mode 100755 index 0000000..4754b67 --- /dev/null +++ b/course/_static/prefix-runestone.bbf2283c5c1d4f99.bundle.js @@ -0,0 +1,3 @@ +/*! For license information please see prefix-runestone.bbf2283c5c1d4f99.bundle.js.LICENSE.txt */ +(self.webpackChunkWebComponents=self.webpackChunkWebComponents||[]).push([[222],{3403:()=>{!function(e){var n=function(n,t){var o;(o=function(n,i){i=i||0,n.find("> li > a.internal, > ul, > li > ul").each((function(n,s){var a=e(s),r=s.tagName.toLowerCase(),d=a.children("li"),l=e(a.parent("li"),a.parent().parent("li"));"ul"===r&&i>=t&&d.length>0&&(l.addClass("dropdown-submenu").children("a").first().attr("tabindex",-1),a.addClass("dropdown-menu")),o(a,i+1)}))})(n)};patchTables=function(){e("table.docutils").removeClass("docutils").addClass("table").attr("border",0)},e((function(){if(e("#navbar.navbar-fixed-top").length>0){var t=e("#navbar").height(),o=function(){scrollBy(0,-t-10)};location.hash&&o(),window.addEventListener("hashchange",o)}e(".dropdown-menu").each((function(){e(this).find("ul").each((function(n,t){e(t).addClass("unstyled")}))})),e("ul.globaltoc li").length?n(e("ul.globaltoc"),1):e(".globaltoc-container").remove(),n(e("ul.localtoc"),2),e(".dropdown-menu ul").not(".dropdown-menu").each((function(){var n=e(this),t=n.parent(),o=t[0].tagName.toLowerCase(),i=n.children().detach();"ul"===o?n.replaceWith(i):"li"===o&&(t.after(i),n.remove())})),$localLi=e("ul.localtoc li"),$localLi.length>2&&$localLi.first().after('

  • - +
  • diff --git a/course/ch-notes.html b/course/ch-notes.html index 2efee13..c036584 100755 --- a/course/ch-notes.html +++ b/course/ch-notes.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/course-documents.html b/course/course-documents.html index c779298..c5bf361 100755 --- a/course/course-documents.html +++ b/course/course-documents.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/exam-01.html b/course/exam-01.html index bfe59c6..b17a255 100755 --- a/course/exam-01.html +++ b/course/exam-01.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -135,7 +135,7 @@ eBookConfig.enable_chatcodes = false; -PrevUpNext +PrevUpNext
  • - +
  • @@ -641,7 +644,7 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • @@ -289,7 +292,10 @@ eBookConfig.enable_chatcodes = false;

    Chapter Exams

    -
    +
    diff --git a/course/frontmatter.html b/course/frontmatter.html index 96b4b5a..04000e6 100755 --- a/course/frontmatter.html +++ b/course/frontmatter.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/fun.html b/course/fun.html index 6b827d5..7107b09 100755 --- a/course/fun.html +++ b/course/fun.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/index.html b/course/index.html index aff1420..59472ff 100755 --- a/course/index.html +++ b/course/index.html @@ -2,7 +2,7 @@ - + diff --git a/course/lunr-pretext-search-index.js b/course/lunr-pretext-search-index.js index 21eeb11..19833dc 100755 --- a/course/lunr-pretext-search-index.js +++ b/course/lunr-pretext-search-index.js @@ -1278,6 +1278,78 @@ var ptx_lunr_docs = [ "title": "", "body": " Suppose a parameter has likelihood function . Find the maximum likelihood estimation of . is a continuous function and is a closed interval, so we use the CIM. Then: is the largest value, so the MLE is " }, +{ + "id": "exam-02", + "level": "1", + "url": "exam-02.html", + "type": "Worksheet", + "number": "", + "title": "Exam 2", + "body": " Exam 2 Show all relevant work. Write either True or False for each of the following statements. No justification is required. Suppose are any random variables and . Then is approximately normally distributed. False. Let be the standard normal distribution. For any , . True. If we're using a set of data to find a confidence interval for a parameter, then the 95% confidence interval will be wider than the 90% confidence interval. True. In hypothesis testing, a type I error is the probability of accepting the null hypothesis. False. For a particular set of collected data, the -value of a 2-tailed test will be as large or larger than the -value of a 1-tailed test. True. In a test, if , then we can reject the null hypothesis. False. In each of the following scenarios, determine whether we should use a 1-tailed test or a 2-tailed test. Indicate clearly which words or phrase in the description of the scenario would lead you to draw your conclusion. We wonder whether the population of mice in a city have a different average weight to the population of mice in a rural town. 2-tailed, because we wonder whether the cities have \"different average weight\" without suspecting a direction of difference. A new fertilizer is designed to increase the yield of a particular species of fruit, and we wonder whether the fertilizer is effective. 1-tailed, because the new fertilizer is \"designed to increase the yield\", so we suspect the change happens in a particular direction. We find a weighted 6-sided die and suspect that it will roll a 6 more often than a fair die would. 1-tailed, because we suspect the die will roll 6 \"more often\", indicating difference in a particular direction. A coin has a probability of coming up heads. We flip the coin 180 times, and write for the number of heads. Estimate . (Use a continuity correction if appropriate.) is binomially distributed with and . Therefore: The weights of five apples are measured and recorded below. Find the sample mean, sample variance, and a 95\\% confidence interval around the sample mean for the weights of the apples. (Pretend that 5 measurements is enough for the CLT to apply. Do not use the -distribution.) Apple Weight (g) Suppose we're told that a proportion of of a population has a particular trait, but we suspect that this information is incorrect. We sample 160 people from the population and see 76 people with the trait. Is this enough evidence to reject the null hypothesis at the 0.05 significance level? \"We suspect the information is incorrect\" indicates a 2-tailed test. Let be the number of people in the sample with the trait. Then, under , , so and . The observed people is more than expected. Equally extreme in the other direction would be fewer, so people. Therefore the -value is: so we do not reject . Suppose we have a coin that we're told has probability of coming up heads, but we suspect it comes up heads more often than that. We flip the coin 160 times. What is the minimum number of heads we would need to see to reject the null hypothesis? \"More often\" suggests we should use a 1-tailed test. Let be the number of heads. Then, under , , so and . Therefore, the -value when observing heads would be: We would need the -score to be at least 1.65 to reject , so: Therefore, it would take at least heads to reject . If the coin is actually fair, what is the power of this test? If the coin is fair, then and . The probability of rejecting is then: A store owner assumes an equal number of people on average come into the store each day of the week. Are the following counts of 400 observed shoppers consistent with this hypothesis? Day Mon Tue Wed Thu Fri Observed Shoppers Under the null hypothesis, we would expect people each day. So: The number of degrees of freedom is , so the critical value is . Since , we reject the null hypothesis. " +}, +{ + "id": "exam-02-3-1", + "level": "2", + "url": "exam-02.html#exam-02-3-1", + "type": "Worksheet Exercise", + "number": "1", + "title": "", + "body": " Write either True or False for each of the following statements. No justification is required. Suppose are any random variables and . Then is approximately normally distributed. False. Let be the standard normal distribution. For any , . True. If we're using a set of data to find a confidence interval for a parameter, then the 95% confidence interval will be wider than the 90% confidence interval. True. In hypothesis testing, a type I error is the probability of accepting the null hypothesis. False. For a particular set of collected data, the -value of a 2-tailed test will be as large or larger than the -value of a 1-tailed test. True. In a test, if , then we can reject the null hypothesis. False. " +}, +{ + "id": "exam-02-4-1", + "level": "2", + "url": "exam-02.html#exam-02-4-1", + "type": "Worksheet Exercise", + "number": "2", + "title": "", + "body": " In each of the following scenarios, determine whether we should use a 1-tailed test or a 2-tailed test. Indicate clearly which words or phrase in the description of the scenario would lead you to draw your conclusion. We wonder whether the population of mice in a city have a different average weight to the population of mice in a rural town. 2-tailed, because we wonder whether the cities have \"different average weight\" without suspecting a direction of difference. A new fertilizer is designed to increase the yield of a particular species of fruit, and we wonder whether the fertilizer is effective. 1-tailed, because the new fertilizer is \"designed to increase the yield\", so we suspect the change happens in a particular direction. We find a weighted 6-sided die and suspect that it will roll a 6 more often than a fair die would. 1-tailed, because we suspect the die will roll 6 \"more often\", indicating difference in a particular direction. " +}, +{ + "id": "exam-02-5-1", + "level": "2", + "url": "exam-02.html#exam-02-5-1", + "type": "Worksheet Exercise", + "number": "3", + "title": "", + "body": " A coin has a probability of coming up heads. We flip the coin 180 times, and write for the number of heads. Estimate . (Use a continuity correction if appropriate.) is binomially distributed with and . Therefore: " +}, +{ + "id": "exam-02-5-2", + "level": "2", + "url": "exam-02.html#exam-02-5-2", + "type": "Worksheet Exercise", + "number": "4", + "title": "", + "body": " The weights of five apples are measured and recorded below. Find the sample mean, sample variance, and a 95\\% confidence interval around the sample mean for the weights of the apples. (Pretend that 5 measurements is enough for the CLT to apply. Do not use the -distribution.) Apple Weight (g) " +}, +{ + "id": "exam-02-6-1", + "level": "2", + "url": "exam-02.html#exam-02-6-1", + "type": "Worksheet Exercise", + "number": "5", + "title": "", + "body": " Suppose we're told that a proportion of of a population has a particular trait, but we suspect that this information is incorrect. We sample 160 people from the population and see 76 people with the trait. Is this enough evidence to reject the null hypothesis at the 0.05 significance level? \"We suspect the information is incorrect\" indicates a 2-tailed test. Let be the number of people in the sample with the trait. Then, under , , so and . The observed people is more than expected. Equally extreme in the other direction would be fewer, so people. Therefore the -value is: so we do not reject . " +}, +{ + "id": "exam-02-7-1", + "level": "2", + "url": "exam-02.html#exam-02-7-1", + "type": "Worksheet Exercise", + "number": "6", + "title": "", + "body": " Suppose we have a coin that we're told has probability of coming up heads, but we suspect it comes up heads more often than that. We flip the coin 160 times. What is the minimum number of heads we would need to see to reject the null hypothesis? \"More often\" suggests we should use a 1-tailed test. Let be the number of heads. Then, under , , so and . Therefore, the -value when observing heads would be: We would need the -score to be at least 1.65 to reject , so: Therefore, it would take at least heads to reject . If the coin is actually fair, what is the power of this test? If the coin is fair, then and . The probability of rejecting is then: " +}, +{ + "id": "exam-02-8-1", + "level": "2", + "url": "exam-02.html#exam-02-8-1", + "type": "Worksheet Exercise", + "number": "7", + "title": "", + "body": " A store owner assumes an equal number of people on average come into the store each day of the week. Are the following counts of 400 observed shoppers consistent with this hypothesis? Day Mon Tue Wed Thu Fri Observed Shoppers Under the null hypothesis, we would expect people each day. So: The number of degrees of freedom is , so the critical value is . Since , we reject the null hypothesis. " +}, { "id": "recitation-calculus-review", "level": "1", diff --git a/course/notes-01-13.html b/course/notes-01-13.html index aafdcbe..762c81e 100755 --- a/course/notes-01-13.html +++ b/course/notes-01-13.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-01-15.html b/course/notes-01-15.html index ad23232..a5f7f67 100755 --- a/course/notes-01-15.html +++ b/course/notes-01-15.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-01-20.html b/course/notes-01-20.html index c66aec5..8d16ce1 100755 --- a/course/notes-01-20.html +++ b/course/notes-01-20.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-01-22.html b/course/notes-01-22.html index c8a8282..0702eea 100755 --- a/course/notes-01-22.html +++ b/course/notes-01-22.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-01-27.html b/course/notes-01-27.html index cd185a3..8128a3d 100755 --- a/course/notes-01-27.html +++ b/course/notes-01-27.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-01-29.html b/course/notes-01-29.html index e71dd3e..da00046 100755 --- a/course/notes-01-29.html +++ b/course/notes-01-29.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-02-03.html b/course/notes-02-03.html index ad89715..1b4171f 100755 --- a/course/notes-02-03.html +++ b/course/notes-02-03.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-02-05.html b/course/notes-02-05.html index 526ec94..39d5d64 100755 --- a/course/notes-02-05.html +++ b/course/notes-02-05.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-02-10.html b/course/notes-02-10.html index 485a0af..30ec738 100755 --- a/course/notes-02-10.html +++ b/course/notes-02-10.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-02-19.html b/course/notes-02-19.html index 9dd2679..49c3f30 100755 --- a/course/notes-02-19.html +++ b/course/notes-02-19.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/notes-02-24.html b/course/notes-02-24.html index ac5bb33..7efdda5 100755 --- a/course/notes-02-24.html +++ b/course/notes-02-24.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/quiz-01.html b/course/quiz-01.html index 31c50a7..4b67bb2 100755 --- a/course/quiz-01.html +++ b/course/quiz-01.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/quiz-02.html b/course/quiz-02.html index 9dbcbca..b9f521f 100755 --- a/course/quiz-02.html +++ b/course/quiz-02.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/quiz-03.html b/course/quiz-03.html index 8711c3d..04e855c 100755 --- a/course/quiz-03.html +++ b/course/quiz-03.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/quiz-04.html b/course/quiz-04.html index 8048568..4301d42 100755 --- a/course/quiz-04.html +++ b/course/quiz-04.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/quizzes.html b/course/quizzes.html index a389251..d1a0fa1 100755 --- a/course/quizzes.html +++ b/course/quizzes.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/recitation-calculus-review.html b/course/recitation-calculus-review.html index 29d9cb4..e39736b 100755 --- a/course/recitation-calculus-review.html +++ b/course/recitation-calculus-review.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/recitations.html b/course/recitations.html index f992326..ad9427b 100755 --- a/course/recitations.html +++ b/course/recitations.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -135,7 +135,7 @@ eBookConfig.enable_chatcodes = false; -PrevUpNext +PrevUpNext
  • - +
  • @@ -291,7 +294,7 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/root-1-2.html b/course/root-1-2.html index a74e2ab..a298c10 100755 --- a/course/root-1-2.html +++ b/course/root-1-2.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +
  • diff --git a/course/syllabus.html b/course/syllabus.html index cf56802..63667b1 100755 --- a/course/syllabus.html +++ b/course/syllabus.html @@ -101,14 +101,14 @@ eBookConfig.allow_pairs = false; eBookConfig.enableScratchAC = false; eBookConfig.build_info = ""; eBookConfig.python3 = null; -eBookConfig.runestone_version = '7.12.2'; +eBookConfig.runestone_version = '7.13.3'; eBookConfig.jobehost = ''; eBookConfig.proxyuri_runs = ''; eBookConfig.proxyuri_files = ''; eBookConfig.enable_chatcodes = false; - + @@ -256,7 +256,10 @@ eBookConfig.enable_chatcodes = false;
  • - +