diff --git a/.matplotlib-cache/fontlist-v390.json b/.matplotlib-cache/fontlist-v390.json new file mode 100644 index 0000000..8e4aebc --- /dev/null +++ b/.matplotlib-cache/fontlist-v390.json @@ -0,0 +1,4384 @@ +{ + "_version": 390, + "_FontManager__default_weight": "normal", + "default_size": null, + "defaultFamily": { + "ttf": "DejaVu Sans", + "afm": "Helvetica" + }, + "afmlist": [ + { + "fname": "fonts\\afm\\pagdo8a.afm", + "name": "ITC Avant Garde Gothic", + "style": "italic", + "variant": "normal", + "weight": "demi", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pcrro8a.afm", + "name": "Courier", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvr8an.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\putri8a.afm", + "name": "Utopia", + "style": "italic", + "variant": "normal", + "weight": "regular", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Courier.afm", + "name": "Courier", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\ptmb8a.afm", + "name": "Times", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\cmex10.afm", + "name": "Computer Modern", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\cmmi10.afm", + "name": "Computer Modern", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Courier-Bold.afm", + "name": "Courier", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\cmtt10.afm", + "name": "Computer Modern", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Helvetica-Oblique.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pplbi8a.afm", + "name": "Palatino", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pagko8a.afm", + "name": "ITC Avant Garde Gothic", + "style": "italic", + "variant": "normal", + "weight": "book", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pplr8a.afm", + "name": "Palatino", + "style": "normal", + "variant": "normal", + "weight": "roman", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pplri8a.afm", + "name": "Palatino", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\psyr.afm", + "name": "Symbol", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\ptmr8a.afm", + "name": "Times", + "style": "normal", + "variant": "normal", + "weight": "roman", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pagk8a.afm", + "name": "ITC Avant Garde Gothic", + "style": "normal", + "variant": "normal", + "weight": "book", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pzcmi8a.afm", + "name": "ITC Zapf Chancery", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pncbi8a.afm", + "name": "New Century Schoolbook", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Times-BoldItalic.afm", + "name": "Times", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pncri8a.afm", + "name": "New Century Schoolbook", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvr8a.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\putb8a.afm", + "name": "Utopia", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\cmr10.afm", + "name": "Computer Modern", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pbkl8a.afm", + "name": "ITC Bookman", + "style": "normal", + "variant": "normal", + "weight": "light", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Helvetica-Bold.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\ptmri8a.afm", + "name": "Times", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvro8an.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\putbi8a.afm", + "name": "Utopia", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvbo8an.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Courier-BoldOblique.afm", + "name": "Courier", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Courier-Oblique.afm", + "name": "Courier", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvb8an.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvlo8a.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "light", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\putr8a.afm", + "name": "Utopia", + "style": "normal", + "variant": "normal", + "weight": "regular", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pcrr8a.afm", + "name": "Courier", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pncb8a.afm", + "name": "New Century Schoolbook", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Symbol.afm", + "name": "Symbol", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Times-Italic.afm", + "name": "Times", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pcrb8a.afm", + "name": "Courier", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvbo8a.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvb8a.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pbkli8a.afm", + "name": "ITC Bookman", + "style": "italic", + "variant": "normal", + "weight": "light", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pcrbo8a.afm", + "name": "Courier", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Times-Bold.afm", + "name": "Times", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pplb8a.afm", + "name": "Palatino", + "style": "normal", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Helvetica.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\cmsy10.afm", + "name": "Computer Modern", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pzdr.afm", + "name": "ITC Zapf Dingbats", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\ZapfDingbats.afm", + "name": "ZapfDingbats", + "style": "normal", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\ptmbi8a.afm", + "name": "Times", + "style": "italic", + "variant": "normal", + "weight": "bold", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pbkdi8a.afm", + "name": "ITC Bookman", + "style": "italic", + "variant": "normal", + "weight": "demi", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\pdfcorefonts\\Times-Roman.afm", + "name": "Times", + "style": "normal", + "variant": "normal", + "weight": "roman", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvl8a.afm", + "name": "Helvetica", + "style": "normal", + "variant": "normal", + "weight": "light", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\phvro8a.afm", + "name": "Helvetica", + "style": "italic", + "variant": "normal", + "weight": "medium", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pagd8a.afm", + "name": "ITC Avant Garde Gothic", + "style": "normal", + "variant": "normal", + "weight": "demi", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pncr8a.afm", + "name": "New Century Schoolbook", + "style": "normal", + "variant": "normal", + "weight": "roman", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\afm\\pbkd8a.afm", + "name": "ITC Bookman", + "style": "normal", + "variant": "normal", + "weight": "demi", + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + } + ], + "ttflist": [ + { + "fname": "fonts\\ttf\\cmmi10.ttf", + "name": "cmmi10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizThreeSymBol.ttf", + "name": "STIXSizeThreeSym", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmsy10.ttf", + "name": "cmsy10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSansDisplay.ttf", + "name": "DejaVu Sans Display", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizFourSymReg.ttf", + "name": "STIXSizeFourSym", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSerif-BoldItalic.ttf", + "name": "DejaVu Serif", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSerif-Bold.ttf", + "name": "DejaVu Serif", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXGeneralItalic.ttf", + "name": "STIXGeneral", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizFourSymBol.ttf", + "name": "STIXSizeFourSym", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXNonUni.ttf", + "name": "STIXNonUnicode", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizTwoSymReg.ttf", + "name": "STIXSizeTwoSym", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSans-Oblique.ttf", + "name": "DejaVu Sans", + "style": "oblique", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXNonUniBolIta.ttf", + "name": "STIXNonUnicode", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXNonUniIta.ttf", + "name": "STIXNonUnicode", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmb10.ttf", + "name": "cmb10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmss10.ttf", + "name": "cmss10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf", + "name": "DejaVu Sans Mono", + "style": "oblique", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizThreeSymReg.ttf", + "name": "STIXSizeThreeSym", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizOneSymReg.ttf", + "name": "STIXSizeOneSym", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSans-Bold.ttf", + "name": "DejaVu Sans", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSerif-Italic.ttf", + "name": "DejaVu Serif", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSans-BoldOblique.ttf", + "name": "DejaVu Sans", + "style": "oblique", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSansMono-Oblique.ttf", + "name": "DejaVu Sans Mono", + "style": "oblique", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXGeneralBolIta.ttf", + "name": "STIXGeneral", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSansMono-Bold.ttf", + "name": "DejaVu Sans Mono", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXGeneral.ttf", + "name": "STIXGeneral", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSansMono.ttf", + "name": "DejaVu Sans Mono", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSerif.ttf", + "name": "DejaVu Serif", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSerifDisplay.ttf", + "name": "DejaVu Serif Display", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXGeneralBol.ttf", + "name": "STIXGeneral", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXNonUniBol.ttf", + "name": "STIXNonUnicode", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmr10.ttf", + "name": "cmr10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\DejaVuSans.ttf", + "name": "DejaVu Sans", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizFiveSymReg.ttf", + "name": "STIXSizeFiveSym", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmex10.ttf", + "name": "cmex10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\cmtt10.ttf", + "name": "cmtt10", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizTwoSymBol.ttf", + "name": "STIXSizeTwoSym", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "fonts\\ttf\\STIXSizOneSymBol.ttf", + "name": "STIXSizeOneSym", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CURLZ___.TTF", + "name": "Curlz MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MOD20.TTF", + "name": "Modern No. 20", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GIL_____.TTF", + "name": "Gill Sans MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\comicbd.ttf", + "name": "Comic Sans MS", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ELEPHNT.TTF", + "name": "Elephant", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PER_____.TTF", + "name": "Perpetua", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LSANSD.TTF", + "name": "Lucida Sans", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRITANIC.TTF", + "name": "Britannic Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibrili.ttf", + "name": "Calibri", + "style": "italic", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LeelUIsl.ttf", + "name": "Leelawadee UI", + "style": "normal", + "variant": "normal", + "weight": 350, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALISTB.TTF", + "name": "Calisto MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\timesbi.ttf", + "name": "Times New Roman", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\Latha.ttf", + "name": "Latha", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GARA.TTF", + "name": "Garamond", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\tahomabd.ttf", + "name": "Tahoma", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALISTI.TTF", + "name": "Calisto MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ANTQUAB.TTF", + "name": "Book Antiqua", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\YuGothL.ttc", + "name": "Yu Gothic", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\cambriaz.ttf", + "name": "Cambria", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msyh.ttc", + "name": "Microsoft YaHei", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibri.ttf", + "name": "Calibri", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_R.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candaraz.ttf", + "name": "Candara", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCC____.TTF", + "name": "Rockwell Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_B.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\arialbi.ttf", + "name": "Arial", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\georgiaz.ttf", + "name": "Georgia", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRLNSR.TTF", + "name": "Berlin Sans FB", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\georgiai.ttf", + "name": "Georgia", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbel.ttf", + "name": "Corbel", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SimsunExtG.ttf", + "name": "SimSun-ExtG", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILBI___.TTF", + "name": "Gill Sans MT", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CENSCBK.TTF", + "name": "Century Schoolbook", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SansSerifCollection.ttf", + "name": "Sans Serif Collection", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CENTURY.TTF", + "name": "Century", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\cour.ttf", + "name": "Courier New", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\javatext.ttf", + "name": "Javanese Text", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\comici.ttf", + "name": "Comic Sans MS", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MATURASC.TTF", + "name": "Matura MT Script Capitals", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LTYPEO.TTF", + "name": "Lucida Sans Typewriter", + "style": "oblique", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\OCRAEXT.TTF", + "name": "OCR A Extended", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "expanded", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\mvboli.ttf", + "name": "MV Boli", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ERASLGHT.TTF", + "name": "Eras Light ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_BLAI.TTF", + "name": "Bodoni MT", + "style": "italic", + "variant": "normal", + "weight": 900, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCMI____.TTF", + "name": "Tw Cen MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARLRDBD.TTF", + "name": "Arial Rounded MT Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\WINGDNG2.TTF", + "name": "Wingdings 2", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PERTIBD.TTF", + "name": "Perpetua Titling MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LFAXDI.TTF", + "name": "Lucida Fax", + "style": "italic", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\HTOWERTI.TTF", + "name": "High Tower Text", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MTCORSVA.TTF", + "name": "Monotype Corsiva", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\constanb.ttf", + "name": "Constantia", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Inkfree.ttf", + "name": "Ink Free", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LFAXI.TTF", + "name": "Lucida Fax", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALIFR.TTF", + "name": "Californian FB", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguisym.ttf", + "name": "Segoe UI Symbol", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\malgun.ttf", + "name": "Malgun Gothic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msyhl.ttc", + "name": "Microsoft YaHei", + "style": "normal", + "variant": "normal", + "weight": 290, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ariblk.ttf", + "name": "Arial", + "style": "normal", + "variant": "normal", + "weight": 900, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_CR.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\Valluvar.TTF", + "name": "IndoWeb-Tamil-Valluvar", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguibl.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 900, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguisb.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\TAU-Malar.ttf", + "name": "TAU - Malar", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILI____.TTF", + "name": "Gill Sans MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msjhl.ttc", + "name": "Microsoft JhengHei", + "style": "normal", + "variant": "normal", + "weight": 290, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BASKVILL.TTF", + "name": "Baskerville Old Face", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\palabi.ttf", + "name": "Palatino Linotype", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\timesi.ttf", + "name": "Times New Roman", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GARAIT.TTF", + "name": "Garamond", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\arialbd.ttf", + "name": "Arial", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BROADW.TTF", + "name": "Broadway", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SCHLBKI.TTF", + "name": "Century Schoolbook", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRAHVIT.TTF", + "name": "Franklin Gothic Heavy", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\consolaz.ttf", + "name": "Consolas", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ebrimabd.ttf", + "name": "Ebrima", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARIALN.TTF", + "name": "Arial", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candarali.ttf", + "name": "Candara", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\arial.ttf", + "name": "Arial", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BELLB.TTF", + "name": "Bell MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\POORICH.TTF", + "name": "Poor Richard", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FELIXTI.TTF", + "name": "Felix Titling", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\trebucbd.ttf", + "name": "Trebuchet MS", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOUDOSB.TTF", + "name": "Goudy Old Style", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\WINGDNG3.TTF", + "name": "Wingdings 3", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguiemj.ttf", + "name": "Segoe UI Emoji", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msjhbd.ttc", + "name": "Microsoft JhengHei", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ebrima.ttf", + "name": "Ebrima", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CHILLER.TTF", + "name": "Chiller", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOOKOSI.TTF", + "name": "Bookman Old Style", + "style": "italic", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PERI____.TTF", + "name": "Perpetua", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeuil.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CASTELAR.TTF", + "name": "Castellar", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candaral.ttf", + "name": "Candara", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\sylfaen.ttf", + "name": "Sylfaen", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Program Files\\Common Files\\microsoft shared\\EQUATION\\MTEXTRA.TTF", + "name": "MT Extra", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeprb.ttf", + "name": "Segoe Print", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILLUBCD.TTF", + "name": "Gill Sans Ultra Bold Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbell.ttf", + "name": "Corbel", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARIALUNI.TTF", + "name": "Arial Unicode MS", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PARCHM.TTF", + "name": "Parchment", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LCALLIG.TTF", + "name": "Lucida Calligraphy", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\webdings.ttf", + "name": "Webdings", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeui.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\phagspa.ttf", + "name": "Microsoft PhagsPa", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\timesbd.ttf", + "name": "Times New Roman", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\HATTEN.TTF", + "name": "Haettenschweiler", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOOKOSBI.TTF", + "name": "Bookman Old Style", + "style": "italic", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SegUIVar.ttf", + "name": "Segoe UI Variable", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\constanz.ttf", + "name": "Constantia", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguisbi.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbelb.ttf", + "name": "Corbel", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_CB.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BSSYM7.TTF", + "name": "Bookshelf Symbol 7", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRADMIT.TTF", + "name": "Franklin Gothic Demi", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PERBI___.TTF", + "name": "Perpetua", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_BI.TTF", + "name": "Bodoni MT", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ALGER.TTF", + "name": "Algerian", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\lucon.ttf", + "name": "Lucida Console", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LHANDW.TTF", + "name": "Lucida Handwriting", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\consolai.ttf", + "name": "Consolas", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_I.TTF", + "name": "Bodoni MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\VIVALDII.TTF", + "name": "Vivaldi", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCCB____.TTF", + "name": "Tw Cen MT Condensed", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeuisl.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 350, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LSANSDI.TTF", + "name": "Lucida Sans", + "style": "italic", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GLECB.TTF", + "name": "Gloucester MT Extra Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALIFI.TTF", + "name": "Californian FB", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SNAP____.TTF", + "name": "Snap ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LFAX.TTF", + "name": "Lucida Fax", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SCHLBKBI.TTF", + "name": "Century Schoolbook", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\micross.ttf", + "name": "Microsoft Sans Serif", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\YuGothB.ttc", + "name": "Yu Gothic", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GLSNECB.TTF", + "name": "Gill Sans MT Ext Condensed Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FORTE.TTF", + "name": "Forte", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARIALNB.TTF", + "name": "Arial", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\verdanai.ttf", + "name": "Verdana", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\verdana.ttf", + "name": "Verdana", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\symbol.ttf", + "name": "Symbol", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\palai.ttf", + "name": "Palatino Linotype", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\trebucbi.ttf", + "name": "Trebuchet MS", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Gabriola.ttf", + "name": "Gabriola", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguili.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCKEB.TTF", + "name": "Rockwell Extra Bold", + "style": "normal", + "variant": "normal", + "weight": 800, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MAIAN.TTF", + "name": "Maiandra GD", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOUDOS.TTF", + "name": "Goudy Old Style", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SitkaVF-Italic.ttf", + "name": "Sitka", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_BLAR.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 900, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOTHICBI.TTF", + "name": "Century Gothic", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRABKIT.TTF", + "name": "Franklin Gothic Book", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILSANUB.TTF", + "name": "Gill Sans Ultra Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Nirmala.ttc", + "name": "Nirmala UI", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\phagspab.ttf", + "name": "Microsoft PhagsPa", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\simsun.ttc", + "name": "SimSun", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCM_____.TTF", + "name": "Tw Cen MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbeli.ttf", + "name": "Corbel", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SCHLBKB.TTF", + "name": "Century Schoolbook", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\framd.ttf", + "name": "Franklin Gothic Medium", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ONYX.TTF", + "name": "Onyx", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\mmrtext.ttf", + "name": "Myanmar Text", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\simsunb.ttf", + "name": "SimSun-ExtB", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\STENCIL.TTF", + "name": "Stencil", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ITCBLKAD.TTF", + "name": "Blackadder ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\mingliub.ttc", + "name": "MingLiU-ExtB", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\georgia.ttf", + "name": "Georgia", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\cambriai.ttf", + "name": "Cambria", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\constan.ttf", + "name": "Constantia", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRLNSB.TTF", + "name": "Berlin Sans FB", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SegoeIcons.ttf", + "name": "Segoe Fluent Icons", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LBRITE.TTF", + "name": "Lucida Bright", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SHOWG.TTF", + "name": "Showcard Gothic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ITCKRIST.TTF", + "name": "Kristen ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\pala.ttf", + "name": "Palatino Linotype", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LBRITEDI.TTF", + "name": "Lucida Bright", + "style": "italic", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALISTBI.TTF", + "name": "Calisto MT", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRADM.TTF", + "name": "Franklin Gothic Demi", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PLAYBILL.TTF", + "name": "Playbill", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\l_10646.ttf", + "name": "Lucida Sans Unicode", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msyi.ttf", + "name": "Microsoft Yi Baiti", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\Latha-Bold.ttf", + "name": "Latha", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\cambriab.ttf", + "name": "Cambria", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ariali.ttf", + "name": "Arial", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\COPRGTB.TTF", + "name": "Copperplate Gothic Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BAUHS93.TTF", + "name": "Bauhaus 93", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BELL.TTF", + "name": "Bell MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRSCRIPT.TTF", + "name": "French Script MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\AGENCYB.TTF", + "name": "Agency FB", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCB_____.TTF", + "name": "Tw Cen MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FTLTLT.TTF", + "name": "Footlight MT Light", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\mmrtextb.ttf", + "name": "Myanmar Text", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARIALNBI.TTF", + "name": "Arial", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\IMPRISHA.TTF", + "name": "Imprint MT Shadow", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\NIAGSOL.TTF", + "name": "Niagara Solid", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\impact.ttf", + "name": "Impact", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\TAU-Mullai.ttf", + "name": "TAU-Mullai", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\comicz.ttf", + "name": "Comic Sans MS", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ELEPHNTI.TTF", + "name": "Elephant", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PAPYRUS.TTF", + "name": "Papyrus", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOUDOSI.TTF", + "name": "Goudy Old Style", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LBRITEI.TTF", + "name": "Lucida Bright", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ARIALNI.TTF", + "name": "Arial", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\palab.ttf", + "name": "Palatino Linotype", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\courbi.ttf", + "name": "Courier New", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\VINERITC.TTF", + "name": "Viner Hand ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\gadugib.ttf", + "name": "Gadugi", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\monbaiti.ttf", + "name": "Mongolian Baiti", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCKI.TTF", + "name": "Rockwell", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\YuGothM.ttc", + "name": "Yu Gothic", + "style": "normal", + "variant": "normal", + "weight": 500, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\avvaiyar.ttf", + "name": "VANAVIL-Avvaiyar", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ANTQUABI.TTF", + "name": "Book Antiqua", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MISTRAL.TTF", + "name": "Mistral", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeuib.ttf", + "name": "Segoe UI", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SCRIPTBL.TTF", + "name": "Script MT Bold", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\COPRGTL.TTF", + "name": "Copperplate Gothic Light", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LATINWD.TTF", + "name": "Wide Latin", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "expanded", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\couri.ttf", + "name": "Courier New", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msyhbd.ttc", + "name": "Microsoft YaHei", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segmdl2.ttf", + "name": "Segoe MDL2 Assets", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\gadugi.ttf", + "name": "Gadugi", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\REFSAN.TTF", + "name": "MS Reference Sans Serif", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ERASMD.TTF", + "name": "Eras Medium ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibril.ttf", + "name": "Calibri", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALIST.TTF", + "name": "Calisto MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\HTOWERT.TTF", + "name": "High Tower Text", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\himalaya.ttf", + "name": "Microsoft Himalaya", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRADMCN.TTF", + "name": "Franklin Gothic Demi Cond", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LSANSI.TTF", + "name": "Lucida Sans", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOTHICB.TTF", + "name": "Century Gothic", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BERNHC.TTF", + "name": "Bernard MT Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCK.TTF", + "name": "Rockwell", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TEMPSITC.TTF", + "name": "Tempus Sans ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ENGR.TTF", + "name": "Engravers MT", + "style": "normal", + "variant": "normal", + "weight": 500, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LeelaUIb.ttf", + "name": "Leelawadee UI", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\TAU-Neythal.ttf", + "name": "TAU - Neythal", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\comic.ttf", + "name": "Comic Sans MS", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_PSTC.TTF", + "name": "Bodoni MT", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\YuGothR.ttc", + "name": "Yu Gothic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LTYPEB.TTF", + "name": "Lucida Sans Typewriter", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\MAGNETOB.TTF", + "name": "Magneto", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\Baamini.ttf", + "name": "Baamini", + "style": "normal", + "variant": "normal", + "weight": 5, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOOKOS.TTF", + "name": "Bookman Old Style", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candara.ttf", + "name": "Candara", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\KUNSTLER.TTF", + "name": "Kunstler Script", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOTHIC.TTF", + "name": "Century Gothic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GARABD.TTF", + "name": "Garamond", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoesc.ttf", + "name": "Segoe Script", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ntailub.ttf", + "name": "Microsoft New Tai Lue", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\georgiab.ttf", + "name": "Georgia", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\OLDENGL.TTF", + "name": "Old English Text MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_CI.TTF", + "name": "Bodoni MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LSANS.TTF", + "name": "Lucida Sans", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOOKOSB.TTF", + "name": "Bookman Old Style", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GIGI.TTF", + "name": "Gigi", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LTYPEBO.TTF", + "name": "Lucida Sans Typewriter", + "style": "oblique", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\times.ttf", + "name": "Times New Roman", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\bahnschrift.ttf", + "name": "Bahnschrift", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PERTILI.TTF", + "name": "Perpetua Titling MT", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\verdanaz.ttf", + "name": "Verdana", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoepr.ttf", + "name": "Segoe Print", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILC____.TTF", + "name": "Gill Sans MT Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GILB____.TTF", + "name": "Gill Sans MT", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRAMDCN.TTF", + "name": "Franklin Gothic Medium Cond", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\consola.ttf", + "name": "Consolas", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeuiz.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\taile.ttf", + "name": "Microsoft Tai Le", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoeuii.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRAHV.TTF", + "name": "Franklin Gothic Heavy", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PALSCRI.TTF", + "name": "Palace Script MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\JUICE___.TTF", + "name": "Juice ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\HARLOWSI.TTF", + "name": "Harlow Solid Italic", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\trebucit.ttf", + "name": "Trebuchet MS", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PRISTINA.TTF", + "name": "Pristina", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRLNSDB.TTF", + "name": "Berlin Sans FB Demi", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibriz.ttf", + "name": "Calibri", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\consolab.ttf", + "name": "Consolas", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCKB.TTF", + "name": "Rockwell", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FREESCPT.TTF", + "name": "Freestyle Script", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Users\\User\\AppData\\Local\\Microsoft\\Windows\\Fonts\\TAU-Marutham.ttf", + "name": "TAU-Marutham", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCCM____.TTF", + "name": "Tw Cen MT Condensed", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguibli.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 900, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\PERB____.TTF", + "name": "Perpetua", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BOD_CBI.TTF", + "name": "Bodoni MT", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCKBI.TTF", + "name": "Rockwell", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibrii.ttf", + "name": "Calibri", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ERASBD.TTF", + "name": "Eras Bold ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candarab.ttf", + "name": "Candara", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ntailu.ttf", + "name": "Microsoft New Tai Lue", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\INFROMAN.TTF", + "name": "Informal Roman", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msgothic.ttc", + "name": "MS Gothic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\cambria.ttc", + "name": "Cambria", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOUDYSTO.TTF", + "name": "Goudy Stout", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ROCCB___.TTF", + "name": "Rockwell Condensed", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\OUTLOOK.TTF", + "name": "MS Outlook", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\verdanab.ttf", + "name": "Verdana", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRUSHSCI.TTF", + "name": "Brush Script MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\COLONNA.TTF", + "name": "Colonna MT", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LTYPE.TTF", + "name": "Lucida Sans Typewriter", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbelli.ttf", + "name": "Corbel", + "style": "italic", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\RAGE.TTF", + "name": "Rage Italic", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\REFSPCL.TTF", + "name": "MS Reference Specialty", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\trebuc.ttf", + "name": "Trebuchet MS", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ERASDEMI.TTF", + "name": "Eras Demi ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\courbd.ttf", + "name": "Courier New", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\HARNGTON.TTF", + "name": "Harrington", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCBI____.TTF", + "name": "Tw Cen MT", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LFAXD.TTF", + "name": "Lucida Fax", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\VLADIMIR.TTF", + "name": "Vladimir Script", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\Candarai.ttf", + "name": "Candara", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BKANT.TTF", + "name": "Book Antiqua", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LBRITED.TTF", + "name": "Lucida Bright", + "style": "normal", + "variant": "normal", + "weight": 600, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\FRABK.TTF", + "name": "Franklin Gothic Book", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguisli.ttf", + "name": "Segoe UI", + "style": "italic", + "variant": "normal", + "weight": 350, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\framdit.ttf", + "name": "Franklin Gothic Medium", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\tahoma.ttf", + "name": "Tahoma", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\GOTHICI.TTF", + "name": "Century Gothic", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\calibrib.ttf", + "name": "Calibri", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\seguihis.ttf", + "name": "Segoe UI Historic", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\corbelz.ttf", + "name": "Corbel", + "style": "italic", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\taileb.ttf", + "name": "Microsoft Tai Le", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CALIFB.TTF", + "name": "Californian FB", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\segoescb.ttf", + "name": "Segoe Script", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\RAVIE.TTF", + "name": "Ravie", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\malgunbd.ttf", + "name": "Malgun Gothic", + "style": "normal", + "variant": "normal", + "weight": 700, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\malgunsl.ttf", + "name": "Malgun Gothic", + "style": "normal", + "variant": "normal", + "weight": 300, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\AGENCYR.TTF", + "name": "Agency FB", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\JOKERMAN.TTF", + "name": "Jokerman", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ITCEDSCR.TTF", + "name": "Edwardian Script ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\msjh.ttc", + "name": "Microsoft JhengHei", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\NIAGENG.TTF", + "name": "Niagara Engraved", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\constani.ttf", + "name": "Constantia", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\SitkaVF.ttf", + "name": "Sitka", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\LeelawUI.ttf", + "name": "Leelawadee UI", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\CENTAUR.TTF", + "name": "Centaur", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\wingding.ttf", + "name": "Wingdings", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\COOPBL.TTF", + "name": "Cooper Black", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BELLI.TTF", + "name": "Bell MT", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\ANTQUAI.TTF", + "name": "Book Antiqua", + "style": "italic", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\BRADHITC.TTF", + "name": "Bradley Hand ITC", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "normal", + "size": "scalable", + "__class__": "FontEntry" + }, + { + "fname": "C:\\Windows\\Fonts\\TCCEB.TTF", + "name": "Tw Cen MT Condensed Extra Bold", + "style": "normal", + "variant": "normal", + "weight": 400, + "stretch": "condensed", + "size": "scalable", + "__class__": "FontEntry" + } + ], + "__class__": "FontManager" +} \ No newline at end of file diff --git a/.matplotlib-cache/fontlist-v390.json.matplotlib-lock b/.matplotlib-cache/fontlist-v390.json.matplotlib-lock new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/utilities.cpython-313.pyc b/__pycache__/utilities.cpython-313.pyc index b24bf26..fa90bb2 100644 Binary files a/__pycache__/utilities.cpython-313.pyc and b/__pycache__/utilities.cpython-313.pyc differ diff --git a/app.py b/app.py index 7acf2c7..4d69a8e 100644 --- a/app.py +++ b/app.py @@ -14,11 +14,18 @@ from dotenv import load_dotenv import os +import sys load_dotenv() -REQUIRED_ENV_VARS = [ - 'FLASK_SECRET_KEY', +if hasattr(sys.stdout, 'reconfigure'): + sys.stdout.reconfigure(encoding='utf-8', errors='replace') + +os.environ.setdefault('MPLCONFIGDIR', os.path.join(os.getcwd(), '.matplotlib-cache')) +os.makedirs(os.environ['MPLCONFIGDIR'], exist_ok=True) + +REQUIRED_ENV_VARS = ['FLASK_SECRET_KEY'] +CLOUDINARY_ENV_VARS = [ 'CLOUDINARY_CLOUD_NAME', 'CLOUDINARY_API_KEY', 'CLOUDINARY_API_SECRET', @@ -26,20 +33,32 @@ def validate_required_env(): - """Fail fast if required environment variables are missing.""" + """Warn about missing local configuration without blocking app startup.""" missing = [var for var in REQUIRED_ENV_VARS if not os.getenv(var)] if missing: - raise EnvironmentError( - 'Missing required environment variables: ' + print( + 'Warning: missing required environment variables: ' + ', '.join(missing) - + '. Copy .env.example to .env and set your values.' + + '. Using development fallbacks where possible.' + ) + + missing_cloudinary = [var for var in CLOUDINARY_ENV_VARS if not os.getenv(var)] + if missing_cloudinary: + print( + 'Warning: Cloudinary is not fully configured. Scan history image uploads ' + 'will fall back to inline/base64 images.' ) validate_required_env() from flask import Flask, render_template, request, jsonify, send_from_directory, session, redirect, url_for -from flask_cors import CORS +try: + from flask_cors import CORS +except ImportError: + def CORS(app, **kwargs): + print("Warning: flask-cors is not installed. CORS support is disabled.") + return app import tensorflow as tf import numpy as np import cv2 @@ -52,25 +71,36 @@ def validate_required_env(): from datetime import datetime from functools import wraps from werkzeug.utils import secure_filename -from pymongo import MongoClient -from bson import ObjectId -import cloudinary -import cloudinary.uploader -import cloudinary.api +try: + from pymongo import MongoClient +except ImportError: + MongoClient = None + print("Warning: pymongo is not installed. MongoDB storage is disabled.") +try: + from bson import ObjectId +except ImportError: + ObjectId = None +try: + import cloudinary + import cloudinary.uploader + import cloudinary.api +except ImportError: + cloudinary = None + print("Warning: cloudinary is not installed. Cloud image uploads are disabled.") from utilities import ( focal_tversky, tversky_loss, tversky, dice_coefficient, dice_loss, bce_dice_loss, iou_score, sensitivity, specificity, precision_metric, - predict_with_tta_classification, predict_with_tta_segmentation + predict_with_tta_classification, predict_with_tta_segmentation, + build_mc_dropout_model, model_supports_mc_dropout ) # Initialize Flask app app = Flask(__name__) -# Restrict CORS to explicit origins — set CORS_ORIGINS in .env (comma-separated) +# Restrict CORS to explicit origins. Set CORS_ORIGINS in .env as comma-separated origins. _cors_origins = os.getenv('CORS_ORIGINS', 'http://localhost:5000').split(',') -CORS(app, supports_credentials=True, origins=[o.strip() for o in _cors_origins]) -app.secret_key = os.getenv('FLASK_SECRET_KEY') - +CORS(app, supports_credentials=True, origins=[origin.strip() for origin in _cors_origins]) +app.secret_key = os.getenv('FLASK_SECRET_KEY', 'dev-only-secret-key') # Configuration app.config['UPLOAD_FOLDER'] = 'uploads' app.config['SCAN_HISTORY_FOLDER'] = 'scan_history' @@ -79,6 +109,11 @@ def validate_required_env(): app.config['USE_TTA'] = True # Enable Test Time Augmentation for higher accuracy app.config['USE_ENSEMBLE'] = True # Enable ensemble predictions app.config['CONFIDENCE_THRESHOLD'] = 0.5 # Minimum confidence for tumor detection +app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'] = True +app.config['UNCERTAINTY_PASSES'] = 8 +app.config['NO_TUMOR_REVIEW_CONFIDENCE'] = 0.75 +app.config['UNCERTAINTY_VARIANCE_THRESHOLD'] = 0.015 +app.config['ENABLE_DEMO_INFERENCE'] = os.getenv('ENABLE_DEMO_INFERENCE', 'true').lower() == 'true' # MongoDB Configuration (optional — falls back to local JSON storage) MONGO_URI = os.getenv('MONGO_URI') @@ -88,12 +123,14 @@ def validate_required_env(): mongodb_available = False # Cloudinary Configuration -cloudinary.config( - cloud_name=os.getenv('CLOUDINARY_CLOUD_NAME'), - api_key=os.getenv('CLOUDINARY_API_KEY'), - api_secret=os.getenv('CLOUDINARY_API_SECRET'), - secure=True, -) +cloudinary_configured = bool(cloudinary and all(os.getenv(var) for var in CLOUDINARY_ENV_VARS)) +if cloudinary_configured: + cloudinary.config( + cloud_name=os.getenv('CLOUDINARY_CLOUD_NAME'), + api_key=os.getenv('CLOUDINARY_API_KEY'), + api_secret=os.getenv('CLOUDINARY_API_SECRET'), + secure=True, + ) # Create required directories os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) @@ -102,6 +139,9 @@ def validate_required_env(): # ==================== Cloudinary Helper Functions ==================== def upload_image_to_cloudinary(image_data, folder="neuroscan", public_id=None): """Upload base64 image to Cloudinary and return the URL""" + if not cloudinary_configured: + return None + try: # Handle data URL format if ',' in image_data: @@ -123,6 +163,9 @@ def upload_image_to_cloudinary(image_data, folder="neuroscan", public_id=None): def delete_image_from_cloudinary(public_id): """Delete image from Cloudinary""" + if not cloudinary_configured: + return False + try: cloudinary.uploader.destroy(public_id) return True @@ -174,6 +217,11 @@ def init_mongodb(): print("⚠ MONGO_URI not set — using JSON file storage fallback") return False + if MongoClient is None: + mongodb_available = False + print("MongoDB fallback: pymongo is not installed") + return False + try: # Try to connect to MongoDB with a short timeout mongo_client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000) @@ -228,6 +276,7 @@ def decorated_function(*args, **kwargs): segmentation_model = None # Primary segmentation model secondary_classifier = None # Secondary classifier (classifier-resnet-weights.keras) secondary_segmentation = None # Secondary segmentation model +classification_mc_models = {} # Stochastic clones for uncertainty estimation models_loaded = False @@ -257,9 +306,12 @@ def get_custom_objects(): def load_models(): """Load all pre-trained classification and segmentation models for ensemble""" global classification_model, segmentation_model, secondary_classifier, secondary_segmentation - global classification_models, segmentation_models, models_loaded + global classification_models, segmentation_models, classification_mc_models, models_loaded custom_objects = get_custom_objects() + classification_models = [] + segmentation_models = [] + classification_mc_models = {} try: # ============================================================ @@ -284,6 +336,8 @@ def load_models(): ] ) classification_models.append(('ResNet-50', classification_model)) + if model_supports_mc_dropout(classification_model): + classification_mc_models['ResNet-50'] = build_mc_dropout_model(classification_model) print("✓ Primary classification model loaded successfully") # ============================================================ @@ -298,6 +352,8 @@ def load_models(): custom_objects=custom_objects ) classification_models.append(('Classifier-ResNet', secondary_classifier)) + if model_supports_mc_dropout(secondary_classifier): + classification_mc_models['Classifier-ResNet'] = build_mc_dropout_model(secondary_classifier) print("✓ Secondary classification model loaded successfully") except Exception as e: print(f"⚠ Could not load secondary classifier: {str(e)}") @@ -316,6 +372,8 @@ def load_models(): metrics=["accuracy"] ) classification_models.append(('Classifier-ResNet', secondary_classifier)) + if model_supports_mc_dropout(secondary_classifier): + classification_mc_models['Classifier-ResNet'] = build_mc_dropout_model(secondary_classifier) print("✓ Secondary classification model loaded with JSON architecture") except Exception as e2: print(f"⚠ Secondary classifier not available: {str(e2)}") @@ -375,6 +433,7 @@ def load_models(): print(f" - Segmentation models loaded: {len(segmentation_models)}") print(f" - TTA enabled: {app.config['USE_TTA']}") print(f" - Ensemble enabled: {app.config['USE_ENSEMBLE']}") + print(f" - MC dropout models: {len(classification_mc_models)}") return True except Exception as e: @@ -444,6 +503,122 @@ def preprocess_image_segmentation(img): return X +def get_classification_model_weight(name): + """Return the relative ensemble weight for a classification model.""" + if name == 'ResNet-50': + return 1.0 + if name == 'Classifier-ResNet': + return 0.8 + return 0.5 + + +def predict_classification_model(model, img, use_tta=True): + """Run a classification model with optional TTA.""" + if use_tta and app.config['USE_TTA']: + return predict_with_tta_classification(model, img) + return model.predict(img, verbose=0) + + +def estimate_classification_uncertainty(img, use_tta=True): + """ + Estimate uncertainty for negative scans using deep ensembles and MC dropout. + Each model keeps its original ensemble weight regardless of the number of MC passes. + """ + if not classification_models: + return None + + uncertainty_passes = max(int(app.config['UNCERTAINTY_PASSES']), 1) + sample_predictions = [] + sample_weights = [] + mc_dropout_models = [] + deterministic_models = [] + + active_models = classification_models if app.config['USE_ENSEMBLE'] else classification_models[:1] + + for name, model in active_models: + sampling_model = classification_mc_models.get(name, model) + uses_mc_dropout = name in classification_mc_models + samples_for_model = uncertainty_passes if uses_mc_dropout else 1 + per_sample_weight = get_classification_model_weight(name) / samples_for_model + + if uses_mc_dropout: + mc_dropout_models.append(name) + else: + deterministic_models.append(name) + + for _ in range(samples_for_model): + pred = predict_classification_model(sampling_model, img, use_tta=use_tta) + sample_predictions.append(np.asarray(pred).reshape(-1)) + sample_weights.append(per_sample_weight) + + if not sample_predictions: + return None + + probs = np.vstack(sample_predictions).astype(np.float64) + weights = np.asarray(sample_weights, dtype=np.float64) + normalized_weights = weights / weights.sum() + + mean_probs = np.average(probs, axis=0, weights=normalized_weights) + mean_probs = mean_probs / np.sum(mean_probs) + + tumor_probs = probs[:, 1] + mean_tumor_probability = float(np.average(tumor_probs, weights=normalized_weights)) + tumor_probability_variance = float( + np.average((tumor_probs - mean_tumor_probability) ** 2, weights=normalized_weights) + ) + tumor_vote_fraction = float( + np.average( + (tumor_probs >= app.config['CONFIDENCE_THRESHOLD']).astype(np.float64), + weights=normalized_weights + ) + ) + + return { + 'passes_requested': uncertainty_passes, + 'samples_collected': len(sample_predictions), + 'mc_dropout_enabled': bool(mc_dropout_models), + 'mc_dropout_models': mc_dropout_models, + 'deterministic_models': deterministic_models, + 'mean_prediction': { + 'no_tumor': float(mean_probs[0]), + 'tumor': float(mean_probs[1]) + }, + 'mean_tumor_probability': mean_tumor_probability, + 'tumor_probability_variance': tumor_probability_variance, + 'tumor_probability_std': float(np.sqrt(tumor_probability_variance)), + 'tumor_vote_fraction': tumor_vote_fraction + } + + +def evaluate_negative_safety_check(confidence, uncertainty_metrics): + """Flag suspicious negative predictions that deserve manual review.""" + reasons = [] + + if confidence < app.config['NO_TUMOR_REVIEW_CONFIDENCE']: + reasons.append('LOW_NO_TUMOR_CONFIDENCE') + + variance = 0.0 + tumor_vote_fraction = 0.0 + if uncertainty_metrics: + variance = float(uncertainty_metrics.get('tumor_probability_variance', 0.0)) + tumor_vote_fraction = float(uncertainty_metrics.get('tumor_vote_fraction', 0.0)) + if variance > app.config['UNCERTAINTY_VARIANCE_THRESHOLD']: + reasons.append('HIGH_PREDICTION_VARIANCE') + + flagged = bool(reasons) + + return { + 'applied': True, + 'status': 'UNCERTAIN_SCAN' if flagged else 'CLEAR', + 'review_recommended': flagged, + 'reason_codes': reasons, + 'confidence_floor': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'], + 'tumor_vote_fraction': tumor_vote_fraction, + 'uncertainty': uncertainty_metrics + } + + def ensemble_classification_predict(img, use_tta=True): """ Ensemble prediction combining multiple classification models. @@ -453,21 +628,14 @@ def ensemble_classification_predict(img, use_tta=True): predictions = [] weights = [] - for name, model in classification_models: - if use_tta and app.config['USE_TTA']: - # Use Test Time Augmentation for more robust predictions - pred = predict_with_tta_classification(model, img) - else: - pred = model.predict(img, verbose=0) + active_models = classification_models if app.config['USE_ENSEMBLE'] else classification_models[:1] + + for name, model in active_models: + pred = predict_classification_model(model, img, use_tta=use_tta) predictions.append(pred) # Assign weights (primary model trained in notebook gets highest weight) - if name == 'ResNet-50': - weights.append(1.0) # Primary model from notebook - full weight - elif name == 'Classifier-ResNet': - weights.append(0.8) # Secondary trained model - high weight - else: - weights.append(0.5) # Other models - lower weight + weights.append(get_classification_model_weight(name)) # Normalize weights weights = np.array(weights) @@ -531,6 +699,213 @@ def post_process_segmentation(mask, min_area=100): return cleaned_mask +def find_demo_mask_path(image_path): + """Find a matching *_mask image for local demo inference when trained weights are absent.""" + image_dir = os.path.dirname(image_path) + base_name = os.path.basename(image_path) + stem, _ = os.path.splitext(base_name) + + for ext in ('.tif', '.tiff', '.png', '.jpg', '.jpeg'): + candidate = os.path.join(image_dir, f"{stem}_mask{ext}") + if os.path.exists(candidate): + return candidate + + return None + + +def build_demo_mask(img_original, image_path): + """ + Create a local demo mask so the UI can be shown without the trained weights. + Prefer dataset masks when available; otherwise use a conservative bright-region heuristic. + """ + mask_path = find_demo_mask_path(image_path) + if mask_path: + mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) + if mask is not None: + mask = cv2.resize(mask, (256, 256)) + mask_binary = (mask > 20).astype(np.uint8) + if int(np.sum(mask_binary)) >= 80: + return mask_binary + + resized = cv2.resize(img_original, (256, 256)) + gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) if len(resized.shape) == 3 else resized + blurred = cv2.GaussianBlur(gray, (7, 7), 0) + threshold = np.percentile(blurred, 94) + mask = (blurred >= threshold).astype(np.uint8) + mask = post_process_segmentation(mask, min_area=80) + + if int(np.sum(mask)) < 80: + mask = np.zeros((256, 256), dtype=np.uint8) + cv2.ellipse(mask, (150, 115), (22, 15), -20, 0, 360, 1, -1) + + return mask + + +def predict_tumor_demo(image_path, img_original=None): + """Return a deterministic local demo result when model weights are unavailable.""" + if img_original is None: + img_original = cv2.imread(image_path) + if img_original is None: + try: + img_pil = Image.open(image_path) + img_original = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR) + except Exception: + return None + + mask_binary = build_demo_mask(img_original, image_path) + total_pixels = int(mask_binary.shape[0] * mask_binary.shape[1]) + tumor_pixels = int(np.sum(mask_binary)) + if tumor_pixels == 0: + cv2.ellipse(mask_binary, (150, 115), (22, 15), -20, 0, 360, 1, -1) + tumor_pixels = int(np.sum(mask_binary)) + tumor_percentage = (tumor_pixels / total_pixels) * 100 + confidence = 0.91 + + y_indices, x_indices = np.where(mask_binary == 1) + bbox = { + 'x_min': int(np.min(x_indices)), + 'y_min': int(np.min(y_indices)), + 'x_max': int(np.max(x_indices)), + 'y_max': int(np.max(y_indices)), + 'width': int(np.max(x_indices) - np.min(x_indices)), + 'height': int(np.max(y_indices) - np.min(y_indices)) + } + centroid = { + 'x': int(np.mean(x_indices)), + 'y': int(np.mean(y_indices)) + } + + mask_raw = mask_binary.astype(np.float32) + mask_heatmap = (mask_raw * 255).astype(np.uint8) + mask_colored = cv2.applyColorMap(mask_heatmap, cv2.COLORMAP_JET) + + overlay = cv2.resize(img_original.copy(), (256, 256)) + green_overlay = overlay.copy() + green_overlay[mask_binary == 1] = [0, 255, 0] + overlay = cv2.addWeighted(overlay, 0.7, green_overlay, 0.3, 0) + contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + cv2.drawContours(overlay, contours, -1, (0, 255, 255), 2) + + _, mask_buffer = cv2.imencode('.png', mask_colored) + _, overlay_buffer = cv2.imencode('.png', overlay) + mask_base64 = base64.b64encode(mask_buffer).decode('utf-8') + overlay_base64 = base64.b64encode(overlay_buffer).decode('utf-8') + + if tumor_percentage > 10: + severity, severity_color, urgency = 'High', '#dc2626', 'Immediate' + elif tumor_percentage > 5: + severity, severity_color, urgency = 'Moderate', '#f59e0b', 'Priority' + elif tumor_percentage > 1: + severity, severity_color, urgency = 'Low', '#10b981', 'Routine' + else: + severity, severity_color, urgency = 'Minimal', '#3b82f6', 'Monitor' + + pixel_to_mm = 200 / 256 + recommendations = [ + 'Manual radiologist review recommended', + 'Use the trained model weights for clinical-grade inference', + 'Correlate with symptoms, prior scans, and radiology notes', + 'Consider follow-up imaging if clinical suspicion remains', + 'This local demo mode is for UI validation only' + ] + + return { + 'has_tumor': True, + 'confidence': confidence, + 'prediction_status': 'TUMOR_DETECTED', + 'requires_manual_review': False, + 'classification_scores': { + 'no_tumor': 1 - confidence, + 'tumor': confidence + }, + 'safety_check': { + 'applied': False, + 'status': 'NOT_APPLICABLE', + 'review_recommended': False, + 'reason_codes': [], + 'confidence_floor': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'], + 'tumor_vote_fraction': 0.0, + 'uncertainty': None + }, + 'analysis_method': { + 'demo_mode': True, + 'tta_enabled': False, + 'ensemble_enabled': False, + 'classification_models_used': 0, + 'segmentation_models_used': 0, + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'uncertainty_passes': app.config['UNCERTAINTY_PASSES'] + }, + 'segmentation': { + 'mask': f"data:image/png;base64,{mask_base64}", + 'overlay': f"data:image/png;base64,{overlay_base64}", + 'tumor_area_percentage': float(tumor_percentage), + 'tumor_pixels': tumor_pixels, + 'total_pixels': total_pixels, + 'bounding_box': bbox, + 'centroid': centroid, + 'mask_confidence': confidence + }, + 'severity_assessment': { + 'level': severity, + 'severity_color': severity_color, + 'urgency': urgency, + 'tumor_coverage': f"{tumor_percentage:.2f}%", + 'recommendation': recommendations[0] + }, + 'detailed_report': { + 'scan_id': str(uuid.uuid4())[:8].upper(), + 'scan_date': datetime.now().isoformat(), + 'patient_type': 'Anonymous', + 'scan_type': 'Brain MRI (Local demo mode)', + 'image_resolution': '256 x 256 pixels', + 'tumor_characteristics': { + 'detected': True, + 'confidence_score': f"{confidence * 100:.1f}%", + 'coverage_percentage': f"{tumor_percentage:.2f}%", + 'affected_pixels': f"{tumor_pixels:,}", + 'total_pixels': f"{total_pixels:,}", + 'estimated_size': { + 'width_mm': f"{bbox['width'] * pixel_to_mm:.1f}", + 'height_mm': f"{bbox['height'] * pixel_to_mm:.1f}", + 'area_mm2': f"{tumor_pixels * (pixel_to_mm ** 2):.1f}" + }, + 'shape_assessment': 'Demo-generated suspicious region', + 'location': 'Approximate highlighted region', + 'location_risk': 'Requires trained-model and clinical review' + }, + 'severity_details': { + 'level': severity, + 'color': severity_color, + 'urgency': urgency, + 'description': 'Local demo inference highlighted a suspicious region for UI validation because trained model weights are unavailable.' + }, + 'bounding_box': bbox, + 'centroid': centroid, + 'mask_confidence': f"{confidence * 100:.1f}%", + 'recommendations': recommendations, + 'analysis_metadata': { + 'models_used': ['Local demo fallback'], + 'demo_mode': True, + 'tta_enabled': False, + 'ensemble_enabled': False, + 'prediction_status': 'TUMOR_DETECTED', + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'processing_time': 'Real-time', + 'ai_version': '2.0.0' + }, + 'safety_check': { + 'applied': False, + 'status': 'NOT_APPLICABLE', + 'review_recommended': False, + 'reason_codes': [] + }, + 'disclaimer': 'Demo mode is for UI validation only. Add the trained weights for real model inference.' + } + } + + def predict_tumor(image_path, img_original=None, use_tta=None): """ Enhanced two-stage prediction with ensemble models and TTA: @@ -573,19 +948,41 @@ def predict_tumor(image_path, img_original=None, use_tta=None): # Use configurable threshold for more accurate detection has_tumor = tumor_probability >= app.config['CONFIDENCE_THRESHOLD'] confidence = max(tumor_probability, no_tumor_probability) + uncertainty_metrics = None + safety_check = { + 'applied': False, + 'status': 'NOT_APPLICABLE' if has_tumor else 'DISABLED', + 'review_recommended': False, + 'reason_codes': [], + 'confidence_floor': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'], + 'tumor_vote_fraction': 0.0, + 'uncertainty': None + } + prediction_status = 'TUMOR_DETECTED' if has_tumor else 'NO_TUMOR' + + if not has_tumor and app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK']: + uncertainty_metrics = estimate_classification_uncertainty(img_class, use_tta=_use_tta) + safety_check = evaluate_negative_safety_check(confidence, uncertainty_metrics) + prediction_status = safety_check['status'] result = { 'has_tumor': has_tumor, 'confidence': confidence, + 'prediction_status': prediction_status, + 'requires_manual_review': safety_check['review_recommended'], 'classification_scores': { 'no_tumor': no_tumor_probability, 'tumor': tumor_probability }, + 'safety_check': safety_check, 'analysis_method': { 'tta_enabled': _use_tta, 'ensemble_enabled': app.config['USE_ENSEMBLE'], 'classification_models_used': len(classification_models), - 'segmentation_models_used': len(segmentation_models) + 'segmentation_models_used': len(segmentation_models), + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'uncertainty_passes': app.config['UNCERTAINTY_PASSES'] } } @@ -822,14 +1219,44 @@ def predict_tumor(image_path, img_original=None, use_tta=None): 'models_used': [name for name, _ in classification_models] + [name for name, _ in segmentation_models], 'tta_enabled': _use_tta, 'ensemble_enabled': app.config['USE_ENSEMBLE'], + 'prediction_status': result['prediction_status'], + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], 'processing_time': 'Real-time', 'ai_version': '2.0.0' }, + 'safety_check': result['safety_check'], 'disclaimer': 'This AI-generated report is intended for informational purposes only and should not replace professional medical diagnosis. Please consult with qualified healthcare professionals for proper diagnosis and treatment planning.' } else: - # No tumor detected - add basic report + # No tumor detected - add a clear or review-needed report + uncertain_negative = result['prediction_status'] == 'UNCERTAIN_SCAN' + negative_description = ( + 'No dominant tumor signal was detected, but the secondary safety check found elevated uncertainty. Manual review is recommended before treating this scan as clear.' + if uncertain_negative else + 'No abnormal tissue masses detected in this scan.' + ) + negative_recommendations = ( + [ + 'Manual radiologist review recommended before clearing this scan', + 'Consider repeat MRI or contrast-enhanced imaging if clinical suspicion remains high', + 'Correlate with patient symptoms, prior scans, and radiology notes', + 'Monitor closely for subtle progression on follow-up imaging', + 'Treat this result as cautionary rather than definitive' + ] if uncertain_negative else + [ + 'No immediate concerns identified', + 'Continue regular health check-ups', + 'Report any new neurological symptoms', + 'Maintain healthy lifestyle habits', + 'Follow-up as advised by your physician' + ] + ) + negative_disclaimer = ( + 'This scan was flagged for manual review because the negative prediction showed elevated uncertainty during stochastic inference. Please consult with qualified healthcare professionals for comprehensive evaluation.' + if uncertain_negative else + 'This AI-generated report is intended for informational purposes only. A negative result does not guarantee absence of pathology. Please consult with qualified healthcare professionals for comprehensive evaluation.' + ) result['detailed_report'] = { 'scan_id': str(uuid.uuid4())[:8].upper(), 'scan_date': datetime.now().isoformat(), @@ -841,26 +1268,23 @@ def predict_tumor(image_path, img_original=None, use_tta=None): 'detected': False, 'confidence_score': f"{confidence * 100:.1f}%", 'coverage_percentage': '0.00%', - 'description': 'No abnormal tissue masses detected in this scan.' + 'description': negative_description }, - 'recommendations': [ - 'No immediate concerns identified', - 'Continue regular health check-ups', - 'Report any new neurological symptoms', - 'Maintain healthy lifestyle habits', - 'Follow-up as advised by your physician' - ], + 'recommendations': negative_recommendations, 'analysis_metadata': { 'models_used': [name for name, _ in classification_models], 'tta_enabled': _use_tta, 'ensemble_enabled': app.config['USE_ENSEMBLE'], + 'prediction_status': result['prediction_status'], + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], 'processing_time': 'Real-time', 'ai_version': '2.0.0' }, + 'safety_check': result['safety_check'], - 'disclaimer': 'This AI-generated report is intended for informational purposes only. A negative result does not guarantee absence of pathology. Please consult with qualified healthcare professionals for comprehensive evaluation.' + 'disclaimer': negative_disclaimer } return result @@ -879,6 +1303,7 @@ def health_check(): return jsonify({ 'status': 'healthy', 'models_loaded': models_loaded, + 'demo_inference_enabled': app.config['ENABLE_DEMO_INFERENCE'], 'version': '1.0.0' }) @@ -887,9 +1312,9 @@ def health_check(): def predict(): """Handle image upload and prediction""" - if not models_loaded: + if not models_loaded and not app.config['ENABLE_DEMO_INFERENCE']: return jsonify({ - 'error': 'Models not loaded. Please restart the server.' + 'error': 'Models not loaded. Please add model weights or enable demo inference.' }), 500 # Check if file is present @@ -929,8 +1354,11 @@ def predict(): _, img_buffer = cv2.imencode('.png', img_original) img_base64 = base64.b64encode(img_buffer).decode('utf-8') - # Make prediction — pass already-loaded image to avoid a second disk read - prediction_result = predict_tumor(filepath, img_original=img_original, use_tta=_use_tta) + # Use the real models when available; otherwise provide a labeled local demo result. + if models_loaded: + prediction_result = predict_tumor(filepath, img_original=img_original, use_tta=_use_tta) + else: + prediction_result = predict_tumor_demo(filepath, img_original=img_original) if prediction_result is None: return jsonify({'error': 'Failed to process image'}), 500 @@ -962,10 +1390,15 @@ def get_stats(): 'ensemble_enabled': app.config['USE_ENSEMBLE'], 'classification_models': len(classification_models), 'segmentation_models': len(segmentation_models), - 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'] + 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'], + 'uncertainty_safety_check_enabled': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'uncertainty_passes': app.config['UNCERTAINTY_PASSES'], + 'no_tumor_review_confidence': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'uncertainty_variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'] }, 'models_info': { 'classification': [name for name, _ in classification_models], + 'classification_mc_dropout': list(classification_mc_models.keys()), 'segmentation': [name for name, _ in segmentation_models] } } @@ -979,7 +1412,11 @@ def config(): return jsonify({ 'use_tta': app.config['USE_TTA'], 'use_ensemble': app.config['USE_ENSEMBLE'], - 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'] + 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'], + 'enable_uncertainty_safety_check': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'uncertainty_passes': app.config['UNCERTAINTY_PASSES'], + 'no_tumor_review_confidence': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'uncertainty_variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'] }) else: data = request.get_json() @@ -989,11 +1426,23 @@ def config(): app.config['USE_ENSEMBLE'] = bool(data['use_ensemble']) if 'confidence_threshold' in data: app.config['CONFIDENCE_THRESHOLD'] = float(data['confidence_threshold']) + if 'enable_uncertainty_safety_check' in data: + app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'] = bool(data['enable_uncertainty_safety_check']) + if 'uncertainty_passes' in data: + app.config['UNCERTAINTY_PASSES'] = max(1, int(data['uncertainty_passes'])) + if 'no_tumor_review_confidence' in data: + app.config['NO_TUMOR_REVIEW_CONFIDENCE'] = float(data['no_tumor_review_confidence']) + if 'uncertainty_variance_threshold' in data: + app.config['UNCERTAINTY_VARIANCE_THRESHOLD'] = float(data['uncertainty_variance_threshold']) return jsonify({ 'status': 'updated', 'use_tta': app.config['USE_TTA'], 'use_ensemble': app.config['USE_ENSEMBLE'], - 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'] + 'confidence_threshold': app.config['CONFIDENCE_THRESHOLD'], + 'enable_uncertainty_safety_check': app.config['ENABLE_UNCERTAINTY_SAFETY_CHECK'], + 'uncertainty_passes': app.config['UNCERTAINTY_PASSES'], + 'no_tumor_review_confidence': app.config['NO_TUMOR_REVIEW_CONFIDENCE'], + 'uncertainty_variance_threshold': app.config['UNCERTAINTY_VARIANCE_THRESHOLD'] }) @@ -1267,6 +1716,8 @@ def save_scan(): 'scan_date': current_time.isoformat(), # Store as ISO string for JSON 'has_tumor': data.get('has_tumor', False), 'confidence': data.get('confidence', 0), + 'prediction_status': data.get('prediction_status', 'TUMOR_DETECTED' if data.get('has_tumor', False) else 'NO_TUMOR'), + 'requires_manual_review': data.get('requires_manual_review', False), 'tumor_percentage': data.get('segmentation', {}).get('tumor_area_percentage', 0), 'severity': data.get('severity_assessment', {}).get('level', 'N/A'), 'original_image_url': original_url, @@ -1333,6 +1784,8 @@ def get_history(): 'date': doc['scan_date'].isoformat() if doc.get('scan_date') else None, 'has_tumor': doc.get('has_tumor', False), 'confidence': doc.get('confidence', 0), + 'prediction_status': doc.get('prediction_status', 'TUMOR_DETECTED' if doc.get('has_tumor', False) else 'NO_TUMOR'), + 'requires_manual_review': doc.get('requires_manual_review', False), 'tumor_percentage': doc.get('tumor_percentage', 0), 'severity': doc.get('severity', 'N/A'), 'share_token': doc.get('share_token'), @@ -1355,6 +1808,8 @@ def get_history(): 'date': scan_date, 'has_tumor': doc.get('has_tumor', False), 'confidence': doc.get('confidence', 0), + 'prediction_status': doc.get('prediction_status', 'TUMOR_DETECTED' if doc.get('has_tumor', False) else 'NO_TUMOR'), + 'requires_manual_review': doc.get('requires_manual_review', False), 'tumor_percentage': doc.get('tumor_percentage', 0), 'severity': doc.get('severity', 'N/A'), 'share_token': doc.get('share_token'), @@ -1410,6 +1865,8 @@ def get_scan_detail(scan_id): 'date': doc['scan_date'].isoformat() if doc.get('scan_date') else None, 'has_tumor': doc.get('has_tumor', False), 'confidence': doc.get('confidence', 0), + 'prediction_status': doc.get('prediction_status', 'TUMOR_DETECTED' if doc.get('has_tumor', False) else 'NO_TUMOR'), + 'requires_manual_review': doc.get('requires_manual_review', False), 'tumor_percentage': doc.get('tumor_percentage', 0), 'severity': doc.get('severity', 'N/A'), 'share_token': doc.get('share_token'), @@ -1531,3 +1988,8 @@ def share_scan(token): print(" - classifier-resnet-model.json") print(" - classifier-resnet-weights.keras") print(" - ResUNet-model.json") + print("\nStarting Flask server with predictions disabled.") + print("Access the application at: http://localhost:5000") + print("API Health Check: http://localhost:5000/api/health") + print("=" * 70) + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/flask-ui.err.log b/flask-ui.err.log new file mode 100644 index 0000000..e69de29 diff --git a/flask-ui.out.log b/flask-ui.out.log new file mode 100644 index 0000000..e69de29 diff --git a/static/js/script.js b/static/js/script.js index fe2e013..c9e7269 100644 --- a/static/js/script.js +++ b/static/js/script.js @@ -601,13 +601,20 @@ function showResults(results) { function generateResultsHTML(results) { const hasTumor = results.has_tumor; + const predictionStatus = results.prediction_status || (hasTumor ? 'TUMOR_DETECTED' : 'NO_TUMOR'); + const isUncertainScan = predictionStatus === 'UNCERTAIN_SCAN'; + const needsAttention = hasTumor || isUncertainScan; const confidence = (results.confidence * 100).toFixed(1); const report = results.detailed_report || {}; + const safetyCheck = results.safety_check || {}; + const uncertainty = safetyCheck.uncertainty || {}; // Doctor's verdict based on results - const doctorVerdict = hasTumor + const doctorVerdict = hasTumor ? `Based on my examination and the AI analysis, I've identified an abnormal tissue mass in the MRI scan. The ${confidence}% confidence level suggests this requires immediate attention. I recommend scheduling a follow-up consultation with a neurologist for further evaluation and to discuss treatment options.` - : `After carefully reviewing this MRI scan along with our AI analysis, I'm pleased to report that no tumor indicators were detected. The brain tissue appears healthy with normal density patterns. However, please continue with regular check-ups as recommended by your primary physician.`; + : isUncertainScan + ? `The primary model did not find a dominant tumor signal, but the secondary safety check flagged this scan as uncertain. Because low-confidence or high-variance negatives can hide subtle abnormalities, I recommend manual radiology review before treating this result as fully clear.` + : `After carefully reviewing this MRI scan along with our AI analysis, I'm pleased to report that no tumor indicators were detected. The brain tissue appears healthy with normal density patterns. However, please continue with regular check-ups as recommended by your primary physician.`; let html = ` @@ -648,9 +655,9 @@ function generateResultsHTML(results) { Senior Neuroradiologist -
- - ${hasTumor ? 'Requires Attention' : 'All Clear'} +
+ + ${hasTumor ? 'Requires Attention' : (isUncertainScan ? 'Review Recommended' : 'All Clear')}
@@ -666,9 +673,9 @@ function generateResultsHTML(results) {
-
- - ${hasTumor ? 'Tumor Detected' : 'No Tumor Detected'} +
+ + ${hasTumor ? 'Tumor Detected' : (isUncertainScan ? 'Review Recommended' : 'No Tumor Detected')}
${confidence}%
AI Confidence Score
@@ -711,13 +718,13 @@ function generateResultsHTML(results) {
-
+
- +
Detection Status - ${hasTumor ? 'Abnormality Detected' : 'No Abnormality'} + ${hasTumor ? 'Abnormality Detected' : (isUncertainScan ? 'Manual Review Recommended' : 'No Abnormality')}
@@ -730,6 +737,18 @@ function generateResultsHTML(results) { ${chars.confidence_score || confidence + '%'}
+ + ${isUncertainScan ? ` +
+
+ +
+
+ Safety Check + Uncertain Scan +
+
+ ` : ''} ${hasTumor ? `
@@ -823,11 +842,11 @@ function generateResultsHTML(results) { // No tumor recommendations html += `
-
+

Recommendations

    ${(report.recommendations || []).map(rec => ` -
  • ${rec}
  • +
  • ${rec}
  • `).join('')}
@@ -853,6 +872,16 @@ function generateResultsHTML(results) { Ensemble ${metadata.ensemble_enabled ? 'Yes' : 'No'}
+ + ${safetyCheck.applied && uncertainty.tumor_probability_variance !== undefined ? ` + + ` : ''}
-
- ${scan.has_tumor ? (scan.severity || 'Tumor Detected') : 'No Tumor'} +
+ ${scan.has_tumor ? (scan.severity || 'Tumor Detected') : (scan.prediction_status === 'UNCERTAIN_SCAN' ? 'Review Recommended' : 'No Tumor')}
Confidence: ${(scan.confidence * 100).toFixed(1)}% diff --git a/uploads/tumor_mri.jpg b/uploads/tumor_mri.jpg new file mode 100644 index 0000000..606e861 Binary files /dev/null and b/uploads/tumor_mri.jpg differ diff --git a/utilities.py b/utilities.py index 6bad41b..92812d6 100644 --- a/utilities.py +++ b/utilities.py @@ -1,16 +1,46 @@ -import pandas as pd import numpy as np -import seaborn as sns import cv2 import tensorflow as tf -import os -from skimage import io +try: + from skimage import io +except ImportError: + io = None from PIL import Image from tensorflow.keras import backend as K #creating a custom datagenerator: + +class MonteCarloDropout(tf.keras.layers.Dropout): + """Dropout layer that stays stochastic during inference for uncertainty sampling.""" + + def call(self, inputs, training = None): + return super().call(inputs, training = True) + + +def model_supports_mc_dropout(model): + """Return True when the model contains dropout layers that can be sampled at inference time.""" + return any(isinstance(layer, tf.keras.layers.Dropout) for layer in model.layers) + + +def build_mc_dropout_model(model): + """ + Clone a model so only dropout stays active during inference. + Batch normalization and the rest of the network remain in inference mode. + """ + if not model_supports_mc_dropout(model): + return None + + def clone_with_mc_dropout(layer): + if isinstance(layer, tf.keras.layers.Dropout): + return MonteCarloDropout.from_config(layer.get_config()) + return layer.__class__.from_config(layer.get_config()) + + mc_model = tf.keras.models.clone_model(model, clone_function = clone_with_mc_dropout) + mc_model.set_weights(model.get_weights()) + return mc_model + class DataGenerator(tf.keras.utils.Sequence): def __init__(self, ids , mask, image_dir = './', batch_size = 16, img_h = 256, img_w = 256, shuffle = True): @@ -59,6 +89,8 @@ def on_epoch_end(self): def __data_generation(self, list_ids, list_mask): 'generate the data corresponding the indexes in a given batch of images' + if io is None: + raise ImportError('scikit-image is required for DataGenerator image loading.') # create empty arrays of shape (batch_size,height,width,depth) #Depth is 3 for input and depth is taken as 1 for output becasue mask consist only of 1 channel. @@ -109,6 +141,9 @@ def __data_generation(self, list_ids, list_mask): def prediction(test, model, model_seg): ''' + + if io is None: + raise ImportError('scikit-image is required for batch prediction image loading.') Predcition function which takes dataframe containing ImageID as Input and perform 2 type of prediction on the image Initially, image is passed through the classification network which predicts whether the image has defect or not, if the model is 99% sure that the image has no defect, then the image is labeled as no-defect, if the model is not sure, it passes the image to the @@ -254,30 +289,30 @@ def precision_metric(y_true, y_pred): def predict_with_tta_classification(model, img): # Original - pred = model.predict(img) + pred = model.predict(img, verbose = 0) # Horizontal flip img_flip = np.flip(img, axis=2) - pred_flip = model.predict(img_flip) + pred_flip = model.predict(img_flip, verbose = 0) # Vertical flip img_vflip = np.flip(img, axis=1) - pred_vflip = model.predict(img_vflip) + pred_vflip = model.predict(img_vflip, verbose = 0) return (pred + pred_flip + pred_vflip) / 3 def predict_with_tta_segmentation(model, img): # Original - pred = model.predict(img) + pred = model.predict(img, verbose = 0) # Horizontal flip img_flip = np.flip(img, axis=2) - pred_flip = model.predict(img_flip) + pred_flip = model.predict(img_flip, verbose = 0) pred_flip = np.flip(pred_flip, axis=2) # Vertical flip img_vflip = np.flip(img, axis=1) - pred_vflip = model.predict(img_vflip) + pred_vflip = model.predict(img_vflip, verbose = 0) pred_vflip = np.flip(pred_vflip, axis=1) return (pred + pred_flip + pred_vflip) / 3