diff --git a/Unit1.fmx b/Unit1.fmx new file mode 100644 index 0000000..c4b4d59 --- /dev/null +++ b/Unit1.fmx @@ -0,0 +1,3999 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu, biMinimize] + BorderStyle = Single + Caption = 'XTool' + ClientHeight = 410 + ClientWidth = 592 + Position = ScreenCenter + StyleBook = StyleBook1 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnShow = FormShow + DesignerMasterStyle = 0 + object StyleBook1: TStyleBook + Styles = < + item + ResourcesBin = { + 464D585F5354594C4520322E3501060B7377697463687374796C6503EB00060D + 63616C656E6461727374796C6503220B061263616C656E6461726C6162656C73 + 74796C650359010611696D616765636F6E74726F6C7374796C6503B503061466 + 72616D65647363726F6C6C626F787374796C6503AF08060F6261636B67726F75 + 6E647374796C6503D600060E6D756C7469766965777374796C6503E400060A70 + 616E656C7374796C6503C901061163616C6C6F757470616E656C7374796C6503 + 1601060E7374617475736261727374796C6503D902060C746F6F6C6261727374 + 796C6503D9010613457870616E646572427574746F6E5374796C6503C30B060D + 657870616E6465727374796C65035D04060D67726F7570626F787374796C6503 + B20206107370656564627574746F6E7374796C65035E08060D73706C69747465 + 727374796C65034E01060A6C6162656C7374796C65035101060F76616C75656C + 6162656C7374796C65036902060C7461626974656D7374796C65039B0C060B74 + 6162646F747374796C65034B01060F746162636F6E74726F6C7374796C650337 + 02060D636865636B626F787374796C6503A8070610726164696F627574746F6E + 7374796C65032407061070726F67726573736261727374796C6503A30A060D73 + 697A65677269707374796C6503D501060F636F6D626F706F7075707374796C65 + 032D02060D74726565766965777374796C6503FF090611747265657669657769 + 74656D7374796C65039F04061B7472656576696577657870616E646572627574 + 746F6E7374796C6503A904060D747261636B6261727374796C65032105060E6E + 756D626572626F787374796C6503BA060609656469747374796C65035D06060C + 7370696E626F787374796C65034A0A0611636C656172696E6765646974737479 + 6C6503610806096D656D6F7374796C6503FD08060B627574746F6E7374796C65 + 03C5080610636F6C6F72627574746F6E7374796C6503FD070611636F726E6572 + 627574746F6E7374796C65038506060D706F707570626F787374796C65030E09 + 060C6172636469616C7374796C6503FE08060D7468756D626261727374796C65 + 035C0306147363726F6C6C62617276747261636B7374796C6503990206147363 + 726F6C6C62617268747261636B7374796C65039A0206137363726F6C6C626172 + 6C656674627574746F6E03200406147363726F6C6C6261727269676874627574 + 746F6E03150406127363726F6C6C626172746F70627574746F6E031F04061573 + 63726F6C6C626172626F74746F6D627574746F6E031604060B687468756D6273 + 74796C65038B03060B767468756D627374796C65038B03060D636F6D626F626F + 787374796C65032E07060E636F6D626F656469747374796C65030108060A7472 + 61636B7374796C6503FE02060C6C697374626F787374796C6503FE0906126C69 + 7374626F78706C61696E686561646572036603060D6C697374626F78666F6F74 + 657203B60106177472616E73706172656E746C697374626F787374796C650371 + 0806167472616E73706172656E74627574746F6E7374796C6503FB02061C7472 + 616E73706172656E74636972636C65627574746F6E7374796C6503FF0206106C + 697374626F786974656D7374796C650345030615636F6C6F726C697374626F78 + 6974656D7374796C6503A503060E7363726F6C6C6261727374796C6503D80506 + 19736D616C6C7363726F6C6C62617276747261636B7374796C65035402061973 + 6D616C6C7363726F6C6C62617268747261636B7374796C650354020613736D61 + 6C6C7363726F6C6C6261727374796C65036702060F64726F7074617267657473 + 74796C65039E040609677269647374796C65031E0A060F686561646572697465 + 6D7374796C65036303060D7465787463656C6C7374796C65038402060E636865 + 636B63656C6C7374796C6503FE03060E706F70757063656C6C7374796C650315 + 04061170726F677265737363656C6C7374796C65031003060E696D6167656365 + 6C6C7374796C65039E01060C6D656E756261727374796C6503D901060D6D656E + 75766965777374796C6503E702060D6D656E756974656D7374796C6503820C06 + 106D656E756261726974656D7374796C6503870C06126D656E75736570617261 + 746F727374796C650303020611616E69696E64696361746F727374796C6503AA + 00060D74696D65656469747374796C6503140C060D6461746565646974737479 + 6C65030C0A060E7370696E65646974627574746F6E03C60200545046300D5453 + 77697463684F626A65637400095374796C654E616D65060B7377697463687374 + 796C65085461624F72646572020012547261636B696E675468756D625363616C + 65050000000000000080FF3F0756697369626C65080A46696C6C2E436F6C6F72 + 07097846463438343834380C46696C6C4F6E2E436F6C6F720709784646363543 + 3845300B46696C6C4F6E2E4B696E640705536F6C69640C5374726F6B652E436F + 6C6F7207097846463143314331430B5468756D622E436F6C6F72070978464634 + 3834383438115468756D625374726F6B652E436F6C6F72070978464631433143 + 314300005450463007544C61796F757400095374796C654E616D65060D63616C + 656E6461727374796C650A53697A652E57696474680500000000000000B40640 + 0B53697A652E4865696768740500000000000000A006401453697A652E506C61 + 74666F726D44656661756C74080756697369626C6508085461624F7264657202 + 010009545374796C6554616700095374796C654E616D65060946697865645369 + 7A65000007544C61796F75740005416C69676E07074D6F7374546F70064C6F63 + 6B6564090E4D617267696E732E426F74746F6D05000000000000008000400A53 + 697A652E57696474680500000000000000B406400B53697A652E486569676874 + 05000000000000009803401453697A652E506C6174666F726D44656661756C74 + 08000754427574746F6E00095374796C654E616D6506047072657605416C6967 + 6E07044C6566740843616E466F63757308064C6F636B6564090D4D617267696E + 732E526967687405000000000000008000400B526570656174436C69636B090A + 53697A652E576964746805000000000000009803400B53697A652E4865696768 + 7405000000000000009803401453697A652E506C6174666F726D44656661756C + 74080B5374796C654C6F6F6B7570061C7472616E73706172656E74636972636C + 65627574746F6E7374796C65000A54506174684C6162656C0005416C69676E07 + 0643656E74657209446174612E506174680A3400000004000000000000000000 + 803F00000000010000000000803F0000803F01000000000000000000003F0100 + 00000000803F00000000064C6F636B6564090A53697A652E5769647468050000 + 0000000000A001400B53697A652E4865696768740500000000000000A0014014 + 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 + 70061263616C656E6461726C6162656C7374796C650000000754427574746F6E + 00095374796C654E616D650605746F64617905416C69676E07044C6566740843 + 616E466F63757308064C6F636B6564090D4D617267696E732E52696768740500 + 0000000000008000400A506F736974696F6E2E580500000000000000A803400B + 526570656174436C69636B090A53697A652E5769647468050000000000000098 + 03400B53697A652E48656967687405000000000000009803401453697A652E50 + 6C6174666F726D44656661756C74080B5374796C654C6F6F6B7570061C747261 + 6E73706172656E74636972636C65627574746F6E7374796C65000A5450617468 + 4C6162656C0005416C69676E070643656E74657209446174612E506174680A34 + 000000040000000000000089C965431BE2BB43010000002B88E1421080834301 + 0000002B886143AEFA114301000000CF46AB43625F8143064C6F636B6564090A + 53697A652E57696474680500000000000000A001400B53697A652E4865696768 + 740500000000000000A001401453697A652E506C6174666F726D44656661756C + 74080B5374796C654C6F6F6B7570061263616C656E6461726C6162656C737479 + 6C650000000754427574746F6E00095374796C654E616D6506046E6578740541 + 6C69676E07044C6566740843616E466F63757308064C6F636B6564090D4D6172 + 67696E732E526967687405000000000000008000400A506F736974696F6E2E58 + 0500000000000000A804400B526570656174436C69636B090A53697A652E5769 + 64746805000000000000009803400B53697A652E486569676874050000000000 + 00009803401453697A652E506C6174666F726D44656661756C74080B5374796C + 654C6F6F6B7570061C7472616E73706172656E74636972636C65627574746F6E + 7374796C65000A54506174684C6162656C0005416C69676E070643656E746572 + 09446174612E506174680A280000000300000000000000000000000000000001 + 000000000000000000803F010000000000803F0000003F064C6F636B6564090A + 53697A652E57696474680500000000000000A001400B53697A652E4865696768 + 740500000000000000A001401453697A652E506C6174666F726D44656661756C + 74080B5374796C654C6F6F6B7570061263616C656E6461726C6162656C737479 + 6C650000000954506F707570426F7800095374796C654E616D6506066D6F6E74 + 687305416C69676E0706436C69656E740843616E466F63757308124469736162 + 6C65466F63757345666665637409064C6F636B6564090C4D617267696E732E4C + 6566740500000000000000A001400D4D617267696E732E526967687405000000 + 00000000A001400A53697A652E576964746805000000000000008605400B5369 + 7A652E48656967687405000000000000009803401453697A652E506C6174666F + 726D44656661756C74080B5374796C654C6F6F6B7570061263616C656E646172 + 6C6162656C7374796C6500000954506F707570426F7800095374796C654E616D + 650605796561727305416C69676E070552696768740843616E466F6375730812 + 44697361626C65466F63757345666665637409064C6F636B6564090A506F7369 + 74696F6E2E5805000000000000008C06400A53697A652E576964746805000000 + 00000000A004400B53697A652E48656967687405000000000000009803401453 + 697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570 + 061263616C656E6461726C6162656C7374796C650000000B54477269644C6179 + 6F757400095374796C654E616D6506047765656B05416C69676E0703546F7006 + 4C6F636B6564090A4974656D4865696768740500000000000000980340094974 + 656D576964746805000000000000008005400B4F7269656E746174696F6E070A + 486F72697A6F6E74616C0E4D617267696E732E426F74746F6D05000000000000 + 008000400A506F736974696F6E2E590500000000000000A803400A53697A652E + 57696474680500000000000000B406400B53697A652E48656967687405000000 + 000000009803401453697A652E506C6174666F726D44656661756C740800000B + 54477269644C61796F757400095374796C654E616D6506057765656B7305416C + 69676E07084D6F73744C656674064C6F636B6564090A4974656D486569676874 + 0500000000000000980340094974656D57696474680500000000000000800540 + 0B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E73 + 2E546F700500000000000000A803400A53697A652E5769647468050000000000 + 0000B803400B53697A652E4865696768740500000000000000C804401453697A + 652E506C6174666F726D44656661756C74080756697369626C6508000008544C + 697374426F7800095374796C654E616D6506046461797305416C69676E070643 + 6C69656E74064C6F636B6564090A53697A652E57696474680500000000000000 + B406400B53697A652E4865696768740500000000000000EC05401453697A652E + 506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006177472 + 616E73706172656E746C697374626F787374796C650E53686F775363726F6C6C + 426172730818416C7465726E6174696E67526F774261636B67726F756E640908 + 43616E466F6375730807436F6C756D6E7302071244697361626C65466F637573 + 456666656374090A4974656D48656967687405000000000000009803401B4465 + 6661756C744974656D5374796C65732E4974656D5374796C6512000000002244 + 656661756C744974656D5374796C65732E47726F75704865616465725374796C + 6512000000002244656661756C744974656D5374796C65732E47726F7570466F + 6F7465725374796C6512000000000E56696577706F72742E5769647468050000 + 0000000000B406400F56696577706F72742E4865696768740500000000000000 + E405400000005450463007544C61796F757400095374796C654E616D65061263 + 616C656E6461726C6162656C7374796C650A506F736974696F6E2E5805000000 + 00000000C607400A506F736974696F6E2E590500000000000080F507400A5369 + 7A652E57696474680500000000000000C404400B53697A652E48656967687405 + 00000000000000A003401453697A652E506C6174666F726D44656661756C7408 + 0756697369626C6508085461624F726465720202000554546578740009537479 + 6C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B65 + 64090748697454657374080A53697A652E57696474680500000000000000C404 + 400B53697A652E4865696768740500000000000000A003401453697A652E506C + 6174666F726D44656661756C7408045465787406056C6162656C165465787453 + 657474696E67732E466F6E74436F6C6F72070978464645304530453000000054 + 50463007544C61796F757400095374796C654E616D650611696D616765636F6E + 74726F6C7374796C650A506F736974696F6E2E580500000000000000C007400A + 506F736974696F6E2E590500000000000000F407400A53697A652E5769647468 + 05000000000000009205400B53697A652E4865696768740500000000000000D0 + 03401453697A652E506C6174666F726D44656661756C74080756697369626C65 + 08085461624F726465720203000A5452656374616E676C6500095374796C654E + 616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A + 46696C6C2E436F6C6F720709784646313931393139064C6F636B656409074869 + 7454657374080A53697A652E576964746805000000000000009205400B53697A + 652E4865696768740500000000000000D003401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463339333933 + 39000A5452656374616E676C650005416C69676E0706436C69656E740946696C + 6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C65 + 6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000 + 0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61 + 7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964 + 746805000000000000008E05400B53697A652E48656967687405000000000000 + 00C003401453697A652E506C6174666F726D44656661756C74080C5374726F6B + 652E436F6C6F72070978464631383138313800000654496D6167650009537479 + 6C654E616D650605696D6167650E4D756C74695265734269746D61700E010000 + 05416C69676E0706436C69656E74064C6F636B6564090748697454657374080C + 4D617267696E732E4C6566740500000000000000C000400B4D617267696E732E + 546F700500000000000000C000400D4D617267696E732E526967687405000000 + 00000000C000400E4D617267696E732E426F74746F6D0500000000000000C000 + 400A53697A652E576964746805000000000000008605400B53697A652E486569 + 6768740500000000000000A003401453697A652E506C6174666F726D44656661 + 756C74080000000B54476C6F774566666563740008536F66746E657373050000 + 000000CDCCCCFC3F09476C6F77436F6C6F720709784646363543384530074F70 + 61636974790500000000006666E6FE3F0754726967676572060E4973466F6375 + 7365643D7472756507456E61626C6564080000005450463007544C61796F7574 + 00095374796C654E616D6506146672616D65647363726F6C6C626F787374796C + 650A506F736974696F6E2E580500000000000080B507400A506F736974696F6E + 2E590500000000000000DA07400A53697A652E5769647468050000000000FFFF + E905400B53697A652E48656967687405000000000000008306401453697A652E + 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 + 65720204000A5452656374616E676C6500095374796C654E616D65060A626163 + 6B67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C + 6F720709784646343834383438064C6F636B6564090748697454657374080C50 + 616464696E672E4C656674050000000000000080FF3F0B50616464696E672E54 + 6F70050000000000000080FF3F0D50616464696E672E52696768740500000000 + 00000080FF3F0E50616464696E672E426F74746F6D050000000000000080FF3F + 0A53697A652E5769647468050000000000FFFFE905400B53697A652E48656967 + 687405000000000000008306401453697A652E506C6174666F726D4465666175 + 6C74080C5374726F6B652E436F6C6F720709784646314331433143000A545265 + 6374616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E64 + 07044E6F6E650748697454657374080A53697A652E5769647468050000000000 + FFFFE505400B53697A652E48656967687405000000000000008106401453697A + 652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207 + 09784646353935393539000007544C61796F75740005416C69676E0706436C69 + 656E740A53697A652E5769647468050000000000FFFFE505400B53697A652E48 + 656967687405000000000000008106401453697A652E506C6174666F726D4465 + 6661756C74080007544C61796F757400095374796C654E616D650607636F6E74 + 656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500 + 00000000FFFFC305400B53697A652E4865696768740500000000000000E00540 + 1453697A652E506C6174666F726D44656661756C740800000A545363726F6C6C + 42617200095374796C654E616D65060A767363726F6C6C62617205416C69676E + 070552696768740B536D616C6C4368616E676505000000000000000000000B4F + 7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E5805 + 0000000000FFFFC705400A53697A652E57696474680500000000000000F00240 + 0B53697A652E4865696768740500000000000000E405401453697A652E506C61 + 74666F726D44656661756C740800000A545363726F6C6C42617200095374796C + 654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F6D0B + 536D616C6C4368616E676505000000000000000000000B4F7269656E74617469 + 6F6E070A486F72697A6F6E74616C0A506F736974696F6E2E5905000000000000 + 00E405400A53697A652E5769647468050000000000FFFFE505400B53697A652E + 4865696768740500000000000000F002401453697A652E506C6174666F726D44 + 656661756C740800000F54536D616C6C5363726F6C6C42617200095374796C65 + 4E616D65060F76736D616C6C7363726F6C6C62617205416C69676E0705526967 + 68740B536D616C6C4368616E676505000000000000000000000B4F7269656E74 + 6174696F6E0708566572746963616C0B4D617267696E732E546F700500000000 + 00000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E + 4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73697469 + 6F6E2E580500000000000000C605400A506F736974696F6E2E59050000000000 + 00008000400A53697A652E576964746805000000000000008002400B53697A65 + 2E48656967687405000000000000008002401453697A652E506C6174666F726D + 44656661756C74080756697369626C650800000F54536D616C6C5363726F6C6C + 42617200095374796C654E616D65060F68736D616C6C7363726F6C6C62617205 + 416C69676E0706426F74746F6D0B536D616C6C4368616E676505000000000000 + 000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0C4D6172 + 67696E732E4C656674050000000000000080FF3F0D4D617267696E732E526967 + 6874050000000000000080FF3F0E4D617267696E732E426F74746F6D05000000 + 0000000080FF3F0A506F736974696F6E2E5805000000000000008000400A506F + 736974696F6E2E590500000000000000E205400A53697A652E57696474680500 + 0000000000009606400B53697A652E4865696768740500000000000000800240 + 1453697A652E506C6174666F726D44656661756C74080756697369626C650800 + 0007544C61796F75740005416C69676E0708436F6E74656E74730A53697A652E + 5769647468050000000000FFFFE505400B53697A652E48656967687405000000 + 000000008106401453697A652E506C6174666F726D44656661756C7408000754 + 4C61796F75740005416C69676E0706426F74746F6D0A506F736974696F6E2E59 + 0500000000000000DA05400A53697A652E5769647468050000000000FFFFE505 + 400B53697A652E4865696768740500000000000000A003401453697A652E506C + 6174666F726D44656661756C740800095453697A654772697000095374796C65 + 4E616D65060873697A656772697005416C69676E07055269676874064C6F636B + 6564090A506F736974696F6E2E58050000000000FFFFBD05400A53697A652E57 + 696474680500000000000000A003400B53697A652E4865696768740500000000 + 000000A003401453697A652E506C6174666F726D44656661756C740800000000 + 000000545046300A5452656374616E676C6500095374796C654E616D65060F62 + 61636B67726F756E647374796C650A46696C6C2E436F6C6F7207097846463334 + 333433340748697454657374080A506F736974696F6E2E580500000000000000 + C607400A506F736974696F6E2E590500000000000000EE07400A53697A652E57 + 696474680500000000000000C804400B53697A652E4865696768740500000000 + 000000C804401453697A652E506C6174666F726D44656661756C74080B537472 + 6F6B652E4B696E6407044E6F6E650756697369626C65080000545046300A5452 + 656374616E676C6500095374796C654E616D65060E6D756C7469766965777374 + 796C650A46696C6C2E436F6C6F72070978464634383438343807486974546573 + 74080A53697A652E57696474680500000000000000C804400B53697A652E4865 + 696768740500000000000000C804401453697A652E506C6174666F726D446566 + 61756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C6508 + 000C5442727573684F626A65637400095374796C654E616D65060864726F706C + 696E650B42727573682E436F6C6F720709784646314331433143000000545046 + 300A5452656374616E676C6500095374796C654E616D65060A70616E656C7374 + 796C650A46696C6C2E436F6C6F72070978464634383438343807486974546573 + 74080A506F736974696F6E2E580500000000000000C607400A506F736974696F + 6E2E590500000000000000EE07400A53697A652E576964746805000000000000 + 00C804400B53697A652E4865696768740500000000000000C804401453697A65 + 2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709 + 7846463143314331430756697369626C6508000A5452656374616E676C650005 + 416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869 + 7454657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D + 617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269 + 676874050000000000000080FF3F0E4D617267696E732E426F74746F6D050000 + 000000000080FF3F0A53697A652E57696474680500000000000000C004400B53 + 697A652E4865696768740500000000000000C004401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646353935 + 39353900000054504630115443616C6C6F757452656374616E676C6500095374 + 796C654E616D65061163616C6C6F757470616E656C7374796C650A46696C6C2E + 436F6C6F7207097846463438343834380748697454657374080A506F73697469 + 6F6E2E580500000000000000C607400A506F736974696F6E2E59050000000000 + 0000EE07400A53697A652E57696474680500000000000000C804400B53697A65 + 2E4865696768740500000000000000C804401453697A652E506C6174666F726D + 44656661756C74080C5374726F6B652E436F6C6F720709784646314331433143 + 0756697369626C65080C43616C6C6F757457696474680500000000000000B803 + 400D43616C6C6F75744C656E6774680500000000000000B00240000054504630 + 0A5452656374616E676C6500095374796C654E616D65060E7374617475736261 + 727374796C650C436C69704368696C6472656E090A46696C6C2E436F6C6F7207 + 097846463438343834380A506F736974696F6E2E580500000000000000C60740 + 0A506F736974696F6E2E590500000000000000EE07400A53697A652E57696474 + 680500000000000000C804400B53697A652E4865696768740500000000000000 + C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65 + 2E436F6C6F7207097846463143314331430756697369626C6508000A54526563 + 74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407 + 044E6F6E650C4D617267696E732E4C656674050000000000000080FF3F0B4D61 + 7267696E732E546F70050000000000000080FF3F0D4D617267696E732E526967 + 6874050000000000000080FF3F0E4D617267696E732E426F74746F6D05000000 + 0000000080FF3F0A53697A652E57696474680500000000000000C004400B5369 + 7A652E4865696768740500000000000000C004401453697A652E506C6174666F + 726D44656661756C74080C5374726F6B652E436F6C6F72070978464635393539 + 353900095453697A654772697000095374796C654E616D65060873697A656772 + 697005416C69676E07055269676874064C6F636B656409074869745465737408 + 0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73 + 2E546F7005000000000000008000400D4D617267696E732E5269676874050000 + 00000000008000400E4D617267696E732E426F74746F6D050000000000000080 + 00400A506F736974696F6E2E580500000000000000D003400A506F736974696F + 6E2E5905000000000000008000400A53697A652E576964746805000000000000 + 00A003400B53697A652E4865696768740500000000000000B004401453697A65 + 2E506C6174666F726D44656661756C740800000000545046300A545265637461 + 6E676C6500095374796C654E616D65060C746F6F6C6261727374796C650C436C + 69704368696C6472656E090A46696C6C2E436F6C6F7207097846463438343834 + 380748697454657374080A506F736974696F6E2E580500000000000000C60740 + 0A506F736974696F6E2E590500000000000000EE07400A53697A652E57696474 + 680500000000000000C804400B53697A652E4865696768740500000000000000 + C804401453697A652E506C6174666F726D44656661756C74080C5374726F6B65 + 2E436F6C6F7207097846463143314331430756697369626C6508000A54526563 + 74616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407 + 044E6F6E650748697454657374080C4D617267696E732E4C6566740500000000 + 00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61 + 7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42 + 6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000 + 000000C004400B53697A652E4865696768740500000000000000C00440145369 + 7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72 + 07097846463539353935390000005450463007544C61796F757400095374796C + 654E616D650613457870616E646572427574746F6E5374796C650C5061646469 + 6E672E4C65667405000000000000008000400B50616464696E672E546F700500 + 0000000000008000400D50616464696E672E5269676874050000000000000080 + 00400E50616464696E672E426F74746F6D05000000000000008000400C4D6172 + 67696E732E4C65667405000000000000008001400B4D617267696E732E546F70 + 05000000000000008001400D4D617267696E732E526967687405000000000000 + 008001400E4D617267696E732E426F74746F6D05000000000000008001400A50 + 6F736974696F6E2E580500000000000000C007400A506F736974696F6E2E5905 + 00000000000000F407400A53697A652E57696474680500000000000000920540 + 0B53697A652E4865696768740500000000000000D003401453697A652E506C61 + 74666F726D44656661756C74080756697369626C6508085461624F7264657202 + 0B000854456C6C6970736500095374796C654E616D65060A6261636B67726F75 + 6E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407084772 + 616469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F + 6C6F720709784646353835383538064F66667365740500000000000000000000 + 000105436F6C6F720709784646353135313531064F6666736574050000000000 + A01BF3FD3F000105436F6C6F720709784646343934393439064F666673657405 + 0000000000000080FF3F0000064C6F636B6564090748697454657374080A5369 + 7A652E576964746805000000000000009205400B53697A652E48656967687405 + 00000000000000D003401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F720709784646364136413641000F54436F6C6F72 + 416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50 + 726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C + 756507097846463538353835380953746F7056616C7565070978464634383438 + 34380754726967676572062049734D6F7573654F7665723D747275653B497350 + 7265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E0008 + 4475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65 + 060A46696C6C2E436F6C6F720A537461727456616C7565070978464634383438 + 34380953746F7056616C75650709784646353835383538075472696767657206 + 2149734D6F7573654F7665723D66616C73653B4973507265737365643D66616C + 736500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C + 6F720A537461727456616C756507097846463438343834380953746F7056616C + 756507097846463432343234320754726967676572062049734D6F7573654F76 + 65723D66616C73653B4973507265737365643D7472756500000F54436F6C6F72 + 416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50 + 726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C + 756507097846463432343234320953746F7056616C7565070978464634383438 + 34380754726967676572061F49734D6F7573654F7665723D747275653B497350 + 7265737365643D7472756500000854456C6C697073650005416C69676E070643 + 6C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D + 617267696E732E4C65667405000000000000008000C00B4D617267696E732E54 + 6F7005000000000000008000C00D4D617267696E732E52696768740500000000 + 0000008000C00E4D617267696E732E426F74746F6D05000000000000008000C0 + 0A53697A652E576964746805000000000000009A05400B53697A652E48656967 + 68740500000000000000F003401453697A652E506C6174666F726D4465666175 + 6C74080C5374726F6B652E436F6C6F720709784646353135313531000854456C + 6C697073650005416C69676E0706436C69656E740946696C6C2E4B696E640704 + 4E6F6E650748697454657374080C4D617267696E732E4C656674050000000000 + 000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172 + 67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F + 74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000 + 00009605400B53697A652E4865696768740500000000000000E003401453697A + 652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207 + 09784646314331433143000000000554506174680005416C69676E0708436F6E + 74656E747309446174612E506174680A6400000008000000000000001DFA7743 + 664E0D4401000000B032464364C3034401000000F668B94375C3A84301000000 + 4E92084464C303440100000019A4F74319940E4401000000A4D0B9434E12D043 + 010000001DFA7743664E0D44030000000000000000000000064C6F636B656409 + 0748697454657374080C4D617267696E732E4C65667405000000000000008001 + 400B4D617267696E732E546F700500000000000000C001400D4D617267696E73 + 2E526967687405000000000000008001400E4D617267696E732E426F74746F6D + 0500000000000000C001400A53697A652E576964746805000000000000008205 + 400B53697A652E4865696768740500000000000000E002401453697A652E506C + 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 + 000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000 + 0017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A + 537461727456616C756507097830304530453045300953746F7056616C756507 + 097846464530453045300754726967676572060F4973457870616E6465643D74 + 72756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05 + 000000000017B7D1F13F07496E7665727365090C50726F70657274794E616D65 + 060A46696C6C2E436F6C6F720A537461727456616C7565070978303045304530 + 45300953746F7056616C75650709784646453045304530075472696767657206 + 104973457870616E6465643D66616C73650000000554506174680005416C6967 + 6E0708436F6E74656E747309446174612E506174680A64000000080000000000 + 0000C540F843D94EAB43010000004E920844DD64BE4301000000FED4BA431994 + 0E4401000000B0324643DD64BE4301000000B633794375C3A84301000000506D + BA4358D9F54301000000C540F843D94EAB430300000000000000000000000A46 + 696C6C2E436F6C6F720709783030453045304530064C6F636B65640907486974 + 54657374080C4D617267696E732E4C65667405000000000000008001400B4D61 + 7267696E732E546F700500000000000000C001400D4D617267696E732E526967 + 687405000000000000008001400E4D617267696E732E426F74746F6D05000000 + 00000000C001400A53697A652E576964746805000000000000008205400B5369 + 7A652E4865696768740500000000000000E002401453697A652E506C6174666F + 726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F5443 + 6F6C6F72416E696D6174696F6E00084475726174696F6E05000000000017B7D1 + F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 + 7456616C756507097830304530453045300953746F7056616C75650709784646 + 453045304530075472696767657206104973457870616E6465643D66616C7365 + 00000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000 + 000017B7D1F13F07496E7665727365090C50726F70657274794E616D65060A46 + 696C6C2E436F6C6F720A537461727456616C7565070978303045304530453009 + 53746F7056616C756507097846464530453045300754726967676572060F4973 + 457870616E6465643D74727565000000005450463007544C61796F7574000953 + 74796C654E616D65060D657870616E6465727374796C650A506F736974696F6E + 2E580500000000000000AB07400A506F736974696F6E2E590500000000000000 + DC07400A53697A652E576964746805000000000000009F06400B53697A652E48 + 65696768740500000000000000F205401453697A652E506C6174666F726D4465 + 6661756C74080756697369626C6508085461624F72646572020C000A54526563 + 74616E676C650005416C69676E0708436F6E74656E74730A46696C6C2E436F6C + 6F7207097846463438343834380748697454657374080A53697A652E57696474 + 6805000000000000009F06400B53697A652E4865696768740500000000000000 + F205401453697A652E506C6174666F726D44656661756C74080C5374726F6B65 + 2E436F6C6F720709784646314331433143000A5452656374616E676C65000541 + 6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650C4D6172 + 67696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F70 + 050000000000000080FF3F0D4D617267696E732E526967687405000000000000 + 0080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53 + 697A652E576964746805000000000000009D06400B53697A652E486569676874 + 0500000000000000EE05401453697A652E506C6174666F726D44656661756C74 + 080C5374726F6B652E436F6C6F72070978464635393539353900000005545465 + 787400095374796C654E616D6506047465787405416C69676E0703546F70064C + 6F636B6564090748697454657374080C4D617267696E732E4C65667405000000 + 00000000C803400A506F736974696F6E2E580500000000000000C803400A5369 + 7A652E576964746805000000000000008606400B53697A652E48656967687405 + 00000000000000C803401453697A652E506C6174666F726D44656661756C7408 + 04546578740608457870616E646572165465787453657474696E67732E466F6E + 74436F6C6F720709784646463146314631155465787453657474696E67732E57 + 6F72645772617008000F54457870616E646572427574746F6E00095374796C65 + 4E616D650606627574746F6E05416C69676E07044C656674064C6F636B656409 + 0C4D617267696E732E4C6566740500000000000000C803C00A506F736974696F + 6E2E580500000000000000C803C00A53697A652E576964746805000000000000 + 00C803400B53697A652E4865696768740500000000000000C803401453697A65 + 2E506C6174666F726D44656661756C740800000954436865636B426F78000953 + 74796C654E616D650608636865636B626F7805416C69676E0705526967687408 + 43616E466F63757308064C6F636B6564090A506F736974696F6E2E5805000000 + 00000000DA05400A53697A652E57696474680500000000000000C803400B5369 + 7A652E4865696768740500000000000000C803401453697A652E506C6174666F + 726D44656661756C7408000000005450463007544C61796F757400095374796C + 654E616D65060D67726F7570626F787374796C650C50616464696E672E4C6566 + 7405000000000000008000400B50616464696E672E546F700500000000000000 + 8002400D50616464696E672E526967687405000000000000008000400E506164 + 64696E672E426F74746F6D05000000000000008000400A506F736974696F6E2E + 580500000000000000B107400A506F736974696F6E2E590500000000000000E1 + 07400A53697A652E576964746805000000000000008706400B53697A652E4865 + 696768740500000000000000CC05401453697A652E506C6174666F726D446566 + 61756C74080756697369626C6508085461624F72646572020D000A5452656374 + 616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C69 + 676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65064C6F636B65 + 64090748697454657374080A53697A652E576964746805000000000000008306 + 400B53697A652E4865696768740500000000000000B805401453697A652E506C + 6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646 + 3539353935390005545465787400095374796C654E616D650604746578740841 + 75746F53697A65090A436C6970506172656E7409064C6F636B65640907486974 + 54657374080A506F736974696F6E2E580500000000000000F002400A506F7369 + 74696F6E2E5905000000000000008002C00A53697A652E576964746805000000 + 00000080E304400B53697A652E4865696768740500000000000060FF02401453 + 697A652E506C6174666F726D44656661756C74080454657874060847726F7570 + 626F78165465787453657474696E67732E466F6E74436F6C6F72070978464646 + 3846384638155465787453657474696E67732E576F7264577261700800000000 + 5450463007544C61796F757400095374796C654E616D65061073706565646275 + 74746F6E7374796C650A506F736974696F6E2E580500000000000000C007400A + 506F736974696F6E2E590500000000000000F407400A53697A652E5769647468 + 05000000000000009205400B53697A652E4865696768740500000000000000D0 + 03401453697A652E506C6174666F726D44656661756C74080756697369626C65 + 08085461624F72646572020E000A5452656374616E676C6500095374796C654E + 616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E747309 + 46696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E + 742E506F696E74730E0105436F6C6F720709784646353835383538064F666673 + 65740500000000000000000000000105436F6C6F720709784646353135313531 + 064F6666736574050000000000A01BF3FD3F000105436F6C6F72070978464634 + 3934393439064F6666736574050000000000000080FF3F0000064C6F636B6564 + 090748697454657374080C4D617267696E732E4C656674050000000000000080 + 00400B4D617267696E732E546F7005000000000000008000400D4D617267696E + 732E526967687405000000000000008000400E4D617267696E732E426F74746F + 6D05000000000000008000400A53697A652E576964746805000000000000008A + 05400B53697A652E4865696768740500000000000000B003401453697A652E50 + 6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846 + 46364136413641000F54436F6C6F72416E696D6174696F6E0008447572617469 + 6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C + 2E436F6C6F720A537461727456616C756507097846463538353835380953746F + 7056616C756507097846463438343834380754726967676572062049734D6F75 + 73654F7665723D747275653B4973507265737365643D66616C736500000F5443 + 6F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCC + FC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 + 7456616C756507097846463438343834380953746F7056616C75650709784646 + 3538353835380754726967676572062149734D6F7573654F7665723D66616C73 + 653B4973507265737365643D66616C736500000F54436F6C6F72416E696D6174 + 696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274 + 794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507097846 + 463438343834380953746F7056616C7565070978464634323432343207547269 + 67676572062049734D6F7573654F7665723D66616C73653B4973507265737365 + 643D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469 + 6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C + 2E436F6C6F720A537461727456616C756507097846463432343234320953746F + 7056616C756507097846463438343834380754726967676572061F49734D6F75 + 73654F7665723D747275653B4973507265737365643D7472756500000A545265 + 6374616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E64 + 07044E6F6E650748697454657374080C4D617267696E732E4C65667405000000 + 000000008000C00B4D617267696E732E546F7005000000000000008000C00D4D + 617267696E732E526967687405000000000000008000C00E4D617267696E732E + 426F74746F6D05000000000000008000C00A53697A652E576964746805000000 + 000000009205400B53697A652E4865696768740500000000000000D003401453 + 697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F + 720709784646353135313531000A5452656374616E676C650005416C69676E07 + 06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408 + 0C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E73 + 2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000 + 000000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080 + FF3F0A53697A652E576964746805000000000000008E05400B53697A652E4865 + 696768740500000000000000C003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646314331433143000000 + 000654476C79706800095374796C654E616D65060A676C7970687374796C650C + 4D617267696E732E4C6566740500000000000000A001400B4D617267696E732E + 546F7005000000000000008000400D4D617267696E732E526967687405000000 + 0000000080FF3F0E4D617267696E732E426F74746F6D05000000000000008000 + 4005416C69676E07044C6566740A53697A652E57696474680500000000000000 + 8003400B53697A652E48656967687405000000000000008003401453697A652E + 506C6174666F726D44656661756C7408000005545465787400095374796C654E + 616D6506047465787405416C69676E0706436C69656E74064C6F636B65640907 + 48697454657374080C4D617267696E732E4C6566740500000000000000C00140 + 0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E + 52696768740500000000000000C001400E4D617267696E732E426F74746F6D05 + 000000000000008000400A53697A652E57696474680500000000000000F40440 + 0B53697A652E4865696768740500000000000000B003401453697A652E506C61 + 74666F726D44656661756C740804546578740606627574746F6E165465787453 + 657474696E67732E466F6E74436F6C6F720708636C6157686974650000005450 + 463007544C61796F757400095374796C654E616D65060D73706C697474657273 + 74796C650A506F736974696F6E2E580500000000000000C607400A506F736974 + 696F6E2E590500000000000000EE07400A53697A652E57696474680500000000 + 000000C804400B53697A652E4865696768740500000000000000C80440145369 + 7A652E506C6174666F726D44656661756C74080756697369626C650808546162 + 4F72646572020F000854456C6C6970736500095374796C654E616D6506046772 + 697005416C69676E07034669740A46696C6C2E436F6C6F720709784646314331 + 433143064C6F636B6564090748697454657374080A53697A652E576964746805 + 00000000000000C804400B53697A652E4865696768740500000000000000C804 + 401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B + 696E6407044E6F6E650000005450463007544C61796F757400095374796C654E + 616D65060A6C6162656C7374796C650A506F736974696F6E2E58050000000000 + 0000C607400A506F736974696F6E2E590500000000000080F507400A53697A65 + 2E57696474680500000000000000C404400B53697A652E486569676874050000 + 0000000000A003401453697A652E506C6174666F726D44656661756C74080756 + 697369626C6508085461624F7264657202100005545465787400095374796C65 + 4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409 + 0748697454657374080A53697A652E57696474680500000000000000C404400B + 53697A652E4865696768740500000000000000A003401453697A652E506C6174 + 666F726D44656661756C7408045465787406056C6162656C1654657874536574 + 74696E67732E466F6E74436F6C6F720709784646464446444644000000545046 + 3007544C61796F757400095374796C654E616D65060F76616C75656C6162656C + 7374796C650A506F736974696F6E2E580500000000000000BB07400A506F7369 + 74696F6E2E590500000000000080F407400A53697A652E576964746805000000 + 00000000BE05400B53697A652E4865696768740500000000000000C003401453 + 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 + 624F726465720211000A5452656374616E676C650005416C69676E0708436F6E + 74656E74730A46696C6C2E436F6C6F7207097846463139313931390748697454 + 657374080A53697A652E57696474680500000000000000BE05400B53697A652E + 4865696768740500000000000000C003401453697A652E506C6174666F726D44 + 656661756C74080C5374726F6B652E436F6C6F72070978464633393339333900 + 0005545465787400095374796C654E616D6506047465787405416C69676E0706 + 436C69656E740748697454657374080C4D617267696E732E4C65667405000000 + 0000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D + 617267696E732E5269676874050000000000000080FF3F0E4D617267696E732E + 426F74746F6D050000000000000080FF3F0A53697A652E576964746805000000 + 00000000BA05400B53697A652E4865696768740500000000000000B003401453 + 697A652E506C6174666F726D44656661756C7408045465787406045465787416 + 5465787453657474696E67732E466F6E742E53697A650500000000000000A002 + 40165465787453657474696E67732E466F6E74436F6C6F720709784646454145 + 4145410000005450463007544C61796F757400095374796C654E616D65060C74 + 61626974656D7374796C650A506F736974696F6E2E580500000000000000C707 + 400A506F736974696F6E2E590500000000000080F507400A53697A652E576964 + 74680500000000000000B804400B53697A652E48656967687405000000000000 + 00A003401453697A652E506C6174666F726D44656661756C7408075669736962 + 6C6508085461624F726465720212000A5452656374616E676C6500095374796C + 654E616D650603746F7005416C69676E0708436F6E74656E74730C436C697043 + 68696C6472656E090A46696C6C2E436F6C6F720709784646343834383438064C + 6F636B6564090748697454657374080553696465730B03546F70044C65667405 + 5269676874000A53697A652E57696474680500000000000000B804400B53697A + 652E4865696768740500000000000000A003401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463143314331 + 43000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000 + 000017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72 + 0A537461727456616C756507097846463438343834380953746F7056616C7565 + 07097846463338333833380754726967676572062149734D6F7573654F766572 + 3D747275653B497353656C65637465643D66616C736500000F54436F6C6F7241 + 6E696D6174696F6E00084475726174696F6E05000000000017B7D1F13F0C5072 + 6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75 + 6507097846463338333833380953746F7056616C756507097846463438343834 + 380754726967676572062249734D6F7573654F7665723D66616C73653B497353 + 656C65637465643D66616C736500000F54436F6C6F72416E696D6174696F6E00 + 084475726174696F6E050000000000BD3786EB3F0C50726F70657274794E616D + 65060A46696C6C2E436F6C6F720A537461727456616C75650709784646333833 + 3833380953746F7056616C756507097846463438343834380754726967676572 + 0610497353656C65637465643D66616C736500000F54436F6C6F72416E696D61 + 74696F6E00084475726174696F6E050000000000ACC5A7EE3F0C50726F706572 + 74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978 + 46463438343834380953746F7056616C75650709784646353835383538075472 + 6967676572060F497353656C65637465643D7472756500000E5452656374416E + 696D6174696F6E00084475726174696F6E050000000000ACC5A7EE3F0C50726F + 70657274794E616D6506074D617267696E730E537461727456616C75652E546F + 70050000000000000080FF3F10537461727456616C75652E5269676874050000 + 000000000080FFBF0F53746F7056616C75652E52696768740500000000000000 + 80FFBF0754726967676572060F497353656C65637465643D7472756500000E54 + 52656374416E696D6174696F6E00084475726174696F6E050000000000ACC5A7 + EE3F07496E7665727365090C50726F70657274794E616D6506074D617267696E + 730E537461727456616C75652E546F70050000000000000080FF3F1053746172 + 7456616C75652E5269676874050000000000000080FFBF0F53746F7056616C75 + 652E5269676874050000000000000080FFBF0754726967676572061049735365 + 6C65637465643D66616C736500000654476C79706800095374796C654E616D65 + 060A676C7970687374796C650C4D617267696E732E4C65667405000000000000 + 008001400D4D617267696E732E526967687405000000000000008001C005416C + 69676E07044C6566740A53697A652E576964746805000000000000008003400B + 53697A652E48656967687405000000000000008003401453697A652E506C6174 + 666F726D44656661756C7408000005545465787400095374796C654E616D6506 + 047465787405416C69676E0706436C69656E74064C6F636B6564090748697454 + 657374080C4D617267696E732E4C65667405000000000000008002400B4D6172 + 67696E732E546F700500000000000000C000400D4D617267696E732E52696768 + 7405000000000000008002400E4D617267696E732E426F74746F6D0500000000 + 0000008000400A53697A652E57696474680500000000000000F003400B53697A + 652E4865696768740500000000000000F002401453697A652E506C6174666F72 + 6D44656661756C7408045465787406046974656D165465787453657474696E67 + 732E466F6E74436F6C6F72070978464644454445444515546578745365747469 + 6E67732E576F726457726170080000000A5452656374616E676C650009537479 + 6C654E616D650606626F74746F6D05416C69676E0708436F6E74656E74730C43 + 6C69704368696C6472656E090A46696C6C2E436F6C6F72070978464634383438 + 3438064C6F636B6564090748697454657374080553696465730B044C65667406 + 426F74746F6D055269676874000A53697A652E57696474680500000000000000 + B804400B53697A652E4865696768740500000000000000A003401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 4646314331433143000F54436F6C6F72416E696D6174696F6E00084475726174 + 696F6E05000000000017B7D1F13F0C50726F70657274794E616D65060A46696C + 6C2E436F6C6F720A537461727456616C75650709784646343834383438095374 + 6F7056616C756507097846463338333833380754726967676572062149734D6F + 7573654F7665723D747275653B497353656C65637465643D66616C736500000F + 54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000000017 + B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374 + 61727456616C756507097846463338333833380953746F7056616C7565070978 + 46463438343834380754726967676572062249734D6F7573654F7665723D6661 + 6C73653B497353656C65637465643D66616C736500000F54436F6C6F72416E69 + 6D6174696F6E00084475726174696F6E050000000000BD3786EB3F0C50726F70 + 657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507 + 097846463338333833380953746F7056616C7565070978464634383438343807 + 547269676765720610497353656C65637465643D66616C736500000F54436F6C + 6F72416E696D6174696F6E00084475726174696F6E050000000000ACC5A7EE3F + 0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456 + 616C756507097846463438343834380953746F7056616C756507097846463538 + 353835380754726967676572060F497353656C65637465643D7472756500000E + 5452656374416E696D6174696F6E00084475726174696F6E050000000000ACC5 + A7EE3F0C50726F70657274794E616D6506074D617267696E730F537461727456 + 616C75652E4C656674050000000000000080FFBF10537461727456616C75652E + 5269676874050000000000000080FFBF11537461727456616C75652E426F7474 + 6F6D05000000000000008000400E53746F7056616C75652E4C65667405000000 + 0000000080FFBF0F53746F7056616C75652E5269676874050000000000000080 + FFBF0754726967676572060F497353656C65637465643D547275650E54726967 + 676572496E76657273650610497353656C65637465643D66616C736500000654 + 476C79706800095374796C654E616D65060A676C7970687374796C650C4D6172 + 67696E732E4C65667405000000000000008001400D4D617267696E732E526967 + 687405000000000000008001C005416C69676E07044C6566740A53697A652E57 + 6964746805000000000000008003400B53697A652E4865696768740500000000 + 0000008003401453697A652E506C6174666F726D44656661756C740800000554 + 5465787400095374796C654E616D6506047465787405416C69676E0706436C69 + 656E74064C6F636B6564090748697454657374080C4D617267696E732E4C6566 + 7405000000000000008002400B4D617267696E732E546F700500000000000000 + C000400D4D617267696E732E526967687405000000000000008002400E4D6172 + 67696E732E426F74746F6D05000000000000008000400A53697A652E57696474 + 680500000000000000F003400B53697A652E4865696768740500000000000000 + F002401453697A652E506C6174666F726D44656661756C740804546578740604 + 6974656D165465787453657474696E67732E466F6E74436F6C6F720709784646 + 444544454445155465787453657474696E67732E576F72645772617008000000 + 00545046300A5452656374616E676C6500095374796C654E616D65060B746162 + 646F747374796C650A46696C6C2E436F6C6F7207097846463143314331430748 + 697454657374080A53697A652E57696474680500000000000000C804400B5369 + 7A652E4865696768740500000000000000C804401453697A652E506C6174666F + 726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507566973 + 69626C6508000F54436F6C6F72416E696D6174696F6E00084475726174696F6E + 05000000000018B7D1F23F0C50726F70657274794E616D65060A46696C6C2E43 + 6F6C6F720A537461727456616C756507097846463143314331430953746F7056 + 616C756507097846464644464446440754726967676572060F497353656C6563 + 7465643D747275650E54726967676572496E76657273650610497353656C6563 + 7465643D66616C73650000005450463007544C61796F757400095374796C654E + 616D65060F746162636F6E74726F6C7374796C650A506F736974696F6E2E5805 + 00000000000000AF07400A506F736974696F6E2E590500000000000080E10740 + 0A53697A652E576964746805000000000000008E06400B53697A652E48656967 + 6874050000000000FFFFC905401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F726465720214000A5452656374616E + 676C650005416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207 + 097846463438343834380748697454657374080A53697A652E57696474680500 + 0000000000008E06400B53697A652E486569676874050000000000FFFFC90540 + 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F + 6C6F720709784646314331433143000A5452656374616E676C650005416C6967 + 6E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974546573 + 74080C4D617267696E732E4C656674050000000000000080FF3F0B4D61726769 + 6E732E546F70050000000000000080FF3F0D4D617267696E732E526967687405 + 0000000000000080FF3F0E4D617267696E732E426F74746F6D05000000000000 + 0080FF3F0A53697A652E576964746805000000000000008C06400B53697A652E + 486569676874050000000000FFFFC505401453697A652E506C6174666F726D44 + 656661756C74080C5374726F6B652E436F6C6F72070978464635393539353900 + 0000005450463007544C61796F757400095374796C654E616D65060D63686563 + 6B626F787374796C650A506F736974696F6E2E580500000000000000B407400A + 506F736974696F6E2E590500000000000000F507400A53697A652E5769647468 + 0500000000000000F205400B53697A652E4865696768740500000000000000A8 + 03401453697A652E506C6174666F726D44656661756C74080756697369626C65 + 08085461624F7264657202150007544C61796F75740005416C69676E07044C65 + 66740A53697A652E57696474680500000000000000A003400B53697A652E4865 + 696768740500000000000000A803401453697A652E506C6174666F726D446566 + 61756C7408000A5452656374616E676C6500095374796C654E616D65060A6261 + 636B67726F756E6405416C69676E070643656E7465720A46696C6C2E436F6C6F + 720709784646353835383538064C6F636B6564090748697454657374080A5369 + 7A652E57696474680500000000000000D002400B53697A652E48656967687405 + 00000000000000D002401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F720709784646314331433143000B54476C6F7745 + 66666563740008536F66746E6573730500000000009A9999FD3F09476C6F7743 + 6F6C6F720709784646363543384530074F706163697479050000000000000080 + FF3F0754726967676572060E4973466F63757365643D7472756507456E61626C + 65640800000A5452656374616E676C650005416C69676E0706436C69656E7409 + 46696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E73 + 2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000 + 0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F + 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E + 57696474680500000000000000B002400B53697A652E48656967687405000000 + 00000000B002401453697A652E506C6174666F726D44656661756C74080C5374 + 726F6B652E436F6C6F72070978464635393539353900000F54436F6C6F72416E + 696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F + 70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565 + 07097846463538353835380953746F7056616C75650709784646363836383638 + 0754726967676572061049734D6F7573654F7665723D7472756500000F54436F + 6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB + 3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274 + 56616C756507097846463638363836380953746F7056616C7565070978464635 + 38353835380754726967676572061149734D6F7573654F7665723D66616C7365 + 000005545061746800095374796C654E616D650609636865636B6D61726B0541 + 6C69676E070643656E74657209446174612E506174680ADC0000001200000000 + 000000000000000000000001000000CDCC4C3E00000000010000000000003F9A + 99993E01000000CDCC4C3F00000000010000000000803F000000000100000000 + 00803FCDCC4C3E010000003333333F0000003F010000000000803FCDCC4C3F01 + 0000000000803F0000803F01000000CDCC4C3F0000803F010000000000003F33 + 33333F01000000CDCC4C3E0000803F01000000000000000000803F0100000000 + 000000CDCC4C3F010000009A99993E0000003F0100000000000000CDCC4C3E01 + 00000000000000000000000300000000000000000000000A46696C6C2E436F6C + 6F720707636C614E756C6C064C6F636B6564090748697454657374080A53697A + 652E576964746805000000000000009002400B53697A652E4865696768740500 + 0000000000009002401453697A652E506C6174666F726D44656661756C74080B + 5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D617469 + 6F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F7065727479 + 4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650707636C61 + 4E756C6C0953746F7056616C75650708636C61426C61636B0754726967676572 + 060E4973436865636B65643D7472756500000F54436F6C6F72416E696D617469 + 6F6E00084475726174696F6E05000000000018B7D1F13F0C50726F7065727479 + 4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708636C61 + 426C61636B0953746F7056616C75650707636C614E756C6C0754726967676572 + 060F4973436865636B65643D66616C7365000000000005545465787400095374 + 796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B + 6564090748697454657374080C4D617267696E732E4C65667405000000000000 + 0080FF3F0B4D617267696E732E546F7005000000000000008000400D4D617267 + 696E732E5269676874050000000000000080FF3F0A53697A652E576964746805 + 00000000000000C605400B53697A652E48656967687405000000000000009803 + 401453697A652E506C6174666F726D44656661756C7408045465787406084368 + 65636B426F78165465787453657474696E67732E466F6E74436F6C6F72070978 + 46464633463346330000005450463007544C61796F757400095374796C654E61 + 6D650610726164696F627574746F6E7374796C650A506F736974696F6E2E5805 + 00000000000000B407400A506F736974696F6E2E590500000000000000F50740 + 0A53697A652E57696474680500000000000000F205400B53697A652E48656967 + 68740500000000000000A803401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F7264657202160007544C61796F7574 + 0005416C69676E07044C6566740A53697A652E57696474680500000000000000 + A003400B53697A652E4865696768740500000000000000A803401453697A652E + 506C6174666F726D44656661756C7408000854456C6C6970736500095374796C + 654E616D65060A6261636B67726F756E6405416C69676E070643656E7465720A + 46696C6C2E436F6C6F720709784646353835383538064C6F636B656409074869 + 7454657374080A53697A652E57696474680500000000000000D002400B53697A + 652E4865696768740500000000000000D002401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463143314331 + 43000B54476C6F774566666563740008536F66746E6573730500000000009A99 + 99FD3F09476C6F77436F6C6F720709784646363543384530074F706163697479 + 050000000000000080FF3F0754726967676572060E4973466F63757365643D74 + 72756507456E61626C65640800000854456C6C697073650005416C69676E0706 + 436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C + 4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E + 546F70050000000000000080FF3F0D4D617267696E732E526967687405000000 + 0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF + 3F0A53697A652E57696474680500000000000000B002400B53697A652E486569 + 6768740500000000000000B002401453697A652E506C6174666F726D44656661 + 756C74080C5374726F6B652E436F6C6F72070978464635393539353900000F54 + 436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCC + CCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461 + 727456616C756507097846463538353835380953746F7056616C756507097846 + 463638363836380754726967676572061049734D6F7573654F7665723D747275 + 6500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000 + 000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F + 720A537461727456616C756507097846463638363836380953746F7056616C75 + 6507097846463538353835380754726967676572061149734D6F7573654F7665 + 723D66616C736500000854456C6C6970736500095374796C654E616D65060963 + 6865636B6D61726B05416C69676E0706436C69656E740A46696C6C2E436F6C6F + 720707636C614E756C6C064C6F636B6564090748697454657374080C4D617267 + 696E732E4C6566740500000000000000C000400B4D617267696E732E546F7005 + 00000000000000C000400D4D617267696E732E52696768740500000000000000 + C000400E4D617267696E732E426F74746F6D0500000000000000C000400A5369 + 7A652E57696474680500000000000000E001400B53697A652E48656967687405 + 00000000000000E001401453697A652E506C6174666F726D44656661756C7408 + 0B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174 + 696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274 + 794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650707636C + 614E756C6C0953746F7056616C75650708636C61426C61636B07547269676765 + 72060E4973436865636B65643D7472756500000F54436F6C6F72416E696D6174 + 696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274 + 794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708636C + 61426C61636B0953746F7056616C75650707636C614E756C6C07547269676765 + 72060F4973436865636B65643D66616C73650000000000055454657874000953 + 74796C654E616D6506047465787405416C69676E0706436C69656E74064C6F63 + 6B6564090748697454657374080C4D617267696E732E4C656674050000000000 + 000080FF3F0B4D617267696E732E546F7005000000000000008000400D4D6172 + 67696E732E5269676874050000000000000080FF3F0A53697A652E5769647468 + 0500000000000000C605400B53697A652E486569676874050000000000000098 + 03401453697A652E506C6174666F726D44656661756C74080454657874060B52 + 6164696F427574746F6E165465787453657474696E67732E466F6E74436F6C6F + 7207097846464633463346330000005450463007544C61796F75740009537479 + 6C654E616D65061070726F67726573736261727374796C650A506F736974696F + 6E2E580500000000000080C007400A506F736974696F6E2E5905000000000000 + 80EB07400A53697A652E576964746805000000000000009005400B53697A652E + 486569676874050000000000FFFFF304401453697A652E506C6174666F726D44 + 656661756C74080756697369626C6508085461624F726465720217000A545265 + 6374616E676C6500095374796C654E616D650605747261636B05416C69676E07 + 08436F6E74656E74730A46696C6C2E436F6C6F72070978464631463146314606 + 4C6F636B6564090748697454657374080A53697A652E57696474680500000000 + 0000009005400B53697A652E486569676874050000000000FFFFF30440145369 + 7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72 + 0709784646334433443344000A5452656374616E676C6500095374796C654E61 + 6D65060A68696E64696361746F7205416C69676E07044C6566740946696C6C2E + 4B696E6407084772616469656E741446696C6C2E4772616469656E742E506F69 + 6E74730E0105436F6C6F720709784646323637324238064F6666736574050000 + 0000000000000000000105436F6C6F720709784646303634353735064F666673 + 6574050000000000000080FF3F0000064C6F636B656409074869745465737408 + 0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73 + 2E546F7005000000000000008000400D4D617267696E732E5269676874050000 + 00000000008000400E4D617267696E732E426F74746F6D050000000000000080 + 00400A506F736974696F6E2E5805000000000000008000400A506F736974696F + 6E2E5905000000000000008000400A53697A652E576964746805000000000000 + 00C804400B53697A652E486569676874050000000000FEFFFF03401453697A65 + 2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E + 6F6E650007544C61796F75740005416C69676E0706436C69656E740C436C6970 + 4368696C6472656E09064C6F636B6564090C4D617267696E732E4C6566740500 + 0000000000008000400D4D617267696E732E5269676874050000000000000080 + 00400A53697A652E57696474680500000000000000B804400B53697A652E4865 + 69676874050000000000FEFFFF03401453697A652E506C6174666F726D446566 + 61756C7408000A5452656374616E676C650005416C69676E0708566572746963 + 616C0946696C6C2E4B696E6407084772616469656E741446696C6C2E47726164 + 69656E742E506F696E74730E0105436F6C6F720709783030323637324238064F + 66667365740500000000000000000000000105436F6C6F720709784239323038 + 314433064F6666736574050000000000000080FE3F000105436F6C6F72070978 + 3030303835313838064F6666736574050000000000000080FF3F00001C46696C + 6C2E4772616469656E742E53746F70506F736974696F6E2E5805000000000000 + 0080FF3F1C46696C6C2E4772616469656E742E53746F70506F736974696F6E2E + 590500000000000000000000064C6F636B6564090748697454657374080A5369 + 7A652E5769647468050000000000FFFFF704400B53697A652E48656967687405 + 0000000000FEFFFF03401453697A652E506C6174666F726D44656661756C7408 + 0B5374726F6B652E4B696E6407044E6F6E650758526164697573050000000000 + 000090024007595261646975730500000000000000900240000F54466C6F6174 + 416E696D6174696F6E00084475726174696F6E0500000000000000800140044C + 6F6F70090C50726F70657274794E616D65060A506F736974696F6E2E780A5374 + 61727456616C75650500000000000000C804C00953746F7056616C7565050000 + 0000000000C808400754726967676572060E497356697369626C653D74727565 + 00000000000A5452656374616E676C6500095374796C654E616D65060A76696E + 64696361746F7205416C69676E0706426F74746F6D0946696C6C2E4B696E6407 + 084772616469656E741446696C6C2E4772616469656E742E506F696E74730E01 + 05436F6C6F720709784646323637324238064F66667365740500000000000000 + 000000000105436F6C6F720709784646303634353735064F6666736574050000 + 000000000080FF3F00001C46696C6C2E4772616469656E742E53746F70506F73 + 6974696F6E2E58050000000000000080FF3F1C46696C6C2E4772616469656E74 + 2E53746F70506F736974696F6E2E590500000000000000000000064C6F636B65 + 64090748697454657374080C4D617267696E732E4C6566740500000000000000 + 8000400B4D617267696E732E546F7005000000000000008000400D4D61726769 + 6E732E526967687405000000000000008000400E4D617267696E732E426F7474 + 6F6D05000000000000008000400A506F736974696F6E2E580500000000000000 + 8000400A506F736974696F6E2E59050000000000FFFF9704400A53697A652E57 + 6964746805000000000000008805400B53697A652E4865696768740500000000 + 000000A803401453697A652E506C6174666F726D44656661756C74080B537472 + 6F6B652E4B696E6407044E6F6E650007544C61796F75740005416C69676E0706 + 436C69656E740C436C69704368696C6472656E09064C6F636B6564090B4D6172 + 67696E732E546F7005000000000000008000400E4D617267696E732E426F7474 + 6F6D05000000000000008000400A53697A652E57696474680500000000000000 + 8805400B53697A652E48656967687405000000000000008803401453697A652E + 506C6174666F726D44656661756C7408000A5452656374616E676C650005416C + 69676E070A486F72697A6F6E74616C0946696C6C2E4B696E6407084772616469 + 656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F72 + 0709783030323637324238064F66667365740500000000000000000000000105 + 436F6C6F720709784239323038314433064F6666736574050000000000000080 + FE3F000105436F6C6F720709783030303835313838064F666673657405000000 + 0000000080FF3F0000064C6F636B6564090748697454657374080C4D61726769 + 6E732E4C656674050000000000000080FF3F0B4D617267696E732E546F700500 + 00000000000080FF3F0D4D617267696E732E5269676874050000000000000080 + FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73 + 6974696F6E2E58050000000000000080FF3F0A506F736974696F6E2E59050000 + 0000000000F108400A53697A652E576964746805000000000000008405400B53 + 697A652E4865696768740500000000000000C804401453697A652E506C617466 + 6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075852 + 6164697573050000000000000090024007595261646975730500000000000000 + 900240000F54466C6F6174416E696D6174696F6E00084475726174696F6E0500 + 000000000000800140044C6F6F70090C50726F70657274794E616D65060A506F + 736974696F6E2E790A537461727456616C75650500000000000000C808400953 + 746F7056616C75650500000000000000C804C00754726967676572060E497356 + 697369626C653D74727565000000000000005450463007544C61796F75740009 + 5374796C654E616D65060D73697A65677269707374796C650A506F736974696F + 6E2E580500000000000000CD07400A506F736974696F6E2E5905000000000000 + 00F507400A53697A652E57696474680500000000000000B803400B53697A652E + 4865696768740500000000000000B803401453697A652E506C6174666F726D44 + 656661756C74080756697369626C6508085461624F726465720218000654496D + 616765000E4D756C74695265734269746D61700E01055769647468020B064865 + 69676874020B03504E470A7E00000089504E470D0A1A0A0000000D4948445200 + 00000B0000000B0806000000A9AC7726000000017352474200AECE1CE9000000 + 0467414D410000B18F0BFC61050000002849444154285363A03A101616FE0F65 + 5209C04CA49EC9E826526E322E13C9379990896498CCC00000F021124915B537 + D20000000049454E44AE426082000005416C69676E070643656E746572064C6F + 636B6564090748697454657374080A53697A652E576964746805000000000001 + 00B002400B53697A652E4865696768740500000000000100B002401453697A65 + 2E506C6174666F726D44656661756C740808577261704D6F646507084F726967 + 696E616C0000005450463007544C61796F757400095374796C654E616D65060F + 636F6D626F706F7075707374796C650C436C69704368696C6472656E09074F70 + 61636974790500000000003333F3FE3F0A506F736974696F6E2E580500000000 + 000080BB07400A506F736974696F6E2E590500000000000000EC07400A53697A + 652E57696474680500000000000000B805400B53697A652E4865696768740500 + 000000000000EC04401453697A652E506C6174666F726D44656661756C740807 + 56697369626C6508085461624F726465720219000A5452656374616E676C6500 + 095374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F + 6E74656E74730A46696C6C2E436F6C6F720709784646343834383438064C6F63 + 6B6564090748697454657374080A53697A652E57696474680500000000000000 + B805400B53697A652E4865696768740500000000000000EC04401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 4646314331433143000F54466C6F6174416E696D6174696F6E00084475726174 + 696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060E506172 + 656E742E4F7061636974790A537461727456616C756505000000000000000000 + 000953746F7056616C7565050000000000000080FF3F0754726967676572060F + 497344726F70446F776E3D747275650E54726967676572496E76657273650610 + 497344726F70446F776E3D66616C7365000000005450463007544C61796F7574 + 00095374796C654E616D65060D74726565766965777374796C650A506F736974 + 696F6E2E580500000000000080B507400A506F736974696F6E2E590500000000 + 000080D707400A53697A652E5769647468050000000000FFFFE905400B53697A + 652E48656967687405000000000000008C06401453697A652E506C6174666F72 + 6D44656661756C74080756697369626C6508085461624F72646572021A000A54 + 52656374616E676C6500095374796C654E616D65060A6261636B67726F756E64 + 05416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709784646 + 343834383438064C6F636B6564090748697454657374080C50616464696E672E + 4C656674050000000000000080FF3F0B50616464696E672E546F700500000000 + 00000080FF3F0D50616464696E672E5269676874050000000000000080FF3F0E + 50616464696E672E426F74746F6D050000000000000080FF3F0A53697A652E57 + 69647468050000000000FFFFE905400B53697A652E4865696768740500000000 + 0000008C06401453697A652E506C6174666F726D44656661756C74080C537472 + 6F6B652E436F6C6F720709784646314331433143000A5452656374616E676C65 + 0005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507 + 48697454657374080A53697A652E5769647468050000000000FFFFE505400B53 + 697A652E48656967687405000000000000008A06401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646353935 + 393539000007544C61796F75740005416C69676E0706436C69656E740A53697A + 652E5769647468050000000000FFFFE505400B53697A652E4865696768740500 + 0000000000008A06401453697A652E506C6174666F726D44656661756C740800 + 07544C61796F757400095374796C654E616D650607636F6E74656E7405416C69 + 676E0706436C69656E740C436C69704368696C6472656E090C4D617267696E73 + 2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000 + 0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F + 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E + 5769647468050000000000FFFFC305400B53697A652E48656967687405000000 + 00000000F205401453697A652E506C6174666F726D44656661756C7408000A54 + 52656374616E676C6500095374796C654E616D65060973656C656374696F6E09 + 46696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E + 742E506F696E74730E0105436F6C6F720709783830324237393843064F666673 + 65740500000000000000000000000105436F6C6F720709783830324236453746 + 064F666673657405000000000012A2F8FD3F000105436F6C6F72070978383032 + 4236343732064F6666736574050000000000000080FF3F000007486974546573 + 74080A53697A652E57696474680500000000000000C804400B53697A652E4865 + 696768740500000000000000C804401453697A652E506C6174666F726D446566 + 61756C74080B5374726F6B652E4B696E6407044E6F6E6500000A545265637461 + 6E676C6500095374796C654E616D650610666F637573656473656C656374696F + 6E0946696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469 + 656E742E506F696E74730E0105436F6C6F720709783830324237393843064F66 + 667365740500000000000000000000000105436F6C6F72070978383032423645 + 3746064F666673657405000000000012A2F8FD3F000105436F6C6F7207097838 + 30324236343732064F6666736574050000000000000080FF3F00000748697454 + 657374080A53697A652E57696474680500000000000000C804400B53697A652E + 4865696768740500000000000000C804401453697A652E506C6174666F726D44 + 656661756C74080B5374726F6B652E446173680703446F740000000A54536372 + 6F6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C + 69676E070552696768740B536D616C6C4368616E676505000000000000000000 + 000B4F7269656E746174696F6E0708566572746963616C0A506F736974696F6E + 2E58050000000000FFFFC705400A53697A652E57696474680500000000000000 + F002400B53697A652E4865696768740500000000000000F605401453697A652E + 506C6174666F726D44656661756C740800000A545363726F6C6C426172000953 + 74796C654E616D65060A687363726F6C6C62617205416C69676E0706426F7474 + 6F6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E74 + 6174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E5905000000 + 00000000F605400A53697A652E5769647468050000000000FFFFE505400B5369 + 7A652E4865696768740500000000000000F002401453697A652E506C6174666F + 726D44656661756C740800000F54536D616C6C5363726F6C6C42617200095374 + 796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E0705 + 52696768740B536D616C6C4368616E676505000000000000000000000B4F7269 + 656E746174696F6E0708566572746963616C0B4D617267696E732E546F700500 + 00000000000080FF3F0D4D617267696E732E5269676874050000000000000080 + FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F73 + 6974696F6E2E580500000000000000C605400A506F736974696F6E2E59050000 + 00000000008000400A53697A652E576964746805000000000000008002400B53 + 697A652E48656967687405000000000000008002401453697A652E506C617466 + 6F726D44656661756C74080756697369626C650800000F54536D616C6C536372 + 6F6C6C42617200095374796C654E616D65060F68736D616C6C7363726F6C6C62 + 617205416C69676E0706426F74746F6D0B536D616C6C4368616E676505000000 + 000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0C + 4D617267696E732E4C656674050000000000000080FF3F0D4D617267696E732E + 5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D05 + 0000000000000080FF3F0A506F736974696F6E2E580500000000000000800040 + 0A506F736974696F6E2E590500000000000000E205400A53697A652E57696474 + 6805000000000000009606400B53697A652E4865696768740500000000000000 + 8002401453697A652E506C6174666F726D44656661756C74080756697369626C + 6508000000000B54476C6F774566666563740008536F66746E65737305000000 + 00009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F7061 + 63697479050000000000000080FF3F0754726967676572060E4973466F637573 + 65643D7472756507456E61626C656408000000545046300A5452656374616E67 + 6C6500095374796C654E616D65061174726565766965776974656D7374796C65 + 0946696C6C2E4B696E6407044E6F6E650748697454657374080A506F73697469 + 6F6E2E580500000000000000BD07400A506F736974696F6E2E59050000000000 + 0080F007400A53697A652E57696474680500000000000000AE05400B53697A65 + 2E4865696768740500000000000000A004401453697A652E506C6174666F726D + 44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075669736962 + 6C6508000C545370656564427574746F6E00095374796C654E616D6506066275 + 74746F6E05416C69676E07044C6566740C4D617267696E732E4C656674050000 + 0000000000C000400B4D617267696E732E546F700500000000000000C000400D + 4D617267696E732E52696768740500000000000000C000400E4D617267696E73 + 2E426F74746F6D0500000000000000C000400A506F736974696F6E2E58050000 + 0000000000C000400A506F736974696F6E2E590500000000000000C000400A53 + 697A652E57696474680500000000000000A003400B53697A652E486569676874 + 05000000000000008804401453697A652E506C6174666F726D44656661756C74 + 080B5374796C654C6F6F6B7570061B7472656576696577657870616E64657262 + 7574746F6E7374796C65000007544C61796F75740005416C69676E0708436F6E + 74656E74730C4D617267696E732E4C6566740500000000000000A003400A5369 + 7A652E576964746805000000000000008605400B53697A652E48656967687405 + 00000000000000A004401453697A652E506C6174666F726D44656661756C7408 + 000954436865636B426F7800095374796C654E616D650605636865636B05416C + 69676E07044C6566740843616E466F637573081244697361626C65466F637573 + 456666656374090A53697A652E57696474680500000000000000A003400B5369 + 7A652E4865696768740500000000000000A004401453697A652E506C6174666F + 726D44656661756C740800000654476C79706800095374796C654E616D65060A + 676C7970687374796C650C4D617267696E732E4C656674050000000000000080 + 00400B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E + 732E526967687405000000000000008000400E4D617267696E732E426F74746F + 6D050000000000000080FF3F05416C69676E07044C6566740A53697A652E5769 + 64746805000000000000008003400B53697A652E486569676874050000000000 + 00008003401453697A652E506C6174666F726D44656661756C74080000055454 + 65787400095374796C654E616D6506047465787405416C69676E0706436C6965 + 6E74064C6F636B6564090748697454657374080A53697A652E57696474680500 + 000000000000BC04400B53697A652E4865696768740500000000000000A00440 + 1453697A652E506C6174666F726D44656661756C740816546578745365747469 + 6E67732E466F6E74436F6C6F720708636C615768697465155465787453657474 + 696E67732E576F72645772617008165465787453657474696E67732E486F727A + 416C69676E07074C656164696E67000000005450463007544C61796F75740009 + 5374796C654E616D65061B7472656576696577657870616E646572627574746F + 6E7374796C650B4D617267696E732E546F70050000000000000080FF3F0A506F + 736974696F6E2E580500000000000000CD07400A506F736974696F6E2E590500 + 000000000000F507400A53697A652E57696474680500000000000000B003400B + 53697A652E4865696768740500000000000000B003401453697A652E506C6174 + 666F726D44656661756C74080756697369626C6508085461624F72646572021C + 000554506174680005416C69676E070643656E74657209446174612E50617468 + 0A400000000500000000000000D36D3F431BEF4843010000001749E043BA09E5 + 4301000000D36D3F43C73B344401000000D36D3F431BEF484303000000D36D3F + 431BEF48430A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B65 + 64090748697454657374080A53697A652E576964746805000000000000008002 + 400B53697A652E48656967687405000000000000009002401453697A652E506C + 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 + 000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500000000 + 0017B7D1F13F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A + 537461727456616C75650707636C614E756C6C0953746F7056616C7565070863 + 6C61426C61636B075472696767657206104973457870616E6465643D66616C73 + 6500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000 + 00000017B7D1F13F07496E7665727365090C50726F70657274794E616D65060A + 46696C6C2E436F6C6F720A537461727456616C75650707636C614E756C6C0953 + 746F7056616C75650708636C61426C61636B0754726967676572060F49734578 + 70616E6465643D747275650000000554506174680005416C69676E070643656E + 74657209446174612E506174680A400000000500000000000000CB11CF4379E9 + 3C4301000000CB11CF4396230A44010000007DBF1E4296230A4401000000CB11 + CF4379E93C4303000000CB11CF4379E93C430A46696C6C2E436F6C6F72070763 + 6C614E756C6C064C6F636B6564090748697454657374080A53697A652E576964 + 746805000000000000008002400B53697A652E48656967687405000000000000 + 008002401453697A652E506C6174666F726D44656661756C74080B5374726F6B + 652E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174696F6E000844 + 75726174696F6E05000000000017B7D1F13F0C50726F70657274794E616D6506 + 0A46696C6C2E436F6C6F720A537461727456616C75650707636C614E756C6C09 + 53746F7056616C75650708636C61426C61636B0754726967676572060F497345 + 7870616E6465643D7472756500000F54436F6C6F72416E696D6174696F6E0008 + 4475726174696F6E05000000000017B7D1F13F07496E7665727365090C50726F + 70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565 + 0707636C614E756C6C0953746F7056616C75650708636C61426C61636B075472 + 696767657206104973457870616E6465643D66616C7365000000005450463007 + 544C61796F757400095374796C654E616D65060D747261636B6261727374796C + 650A506F736974696F6E2E580500000000000000B207400A506F736974696F6E + 2E590500000000000000F707400A53697A652E57696474680500000000000000 + 8206400B53697A652E4865696768740500000000000100E002401453697A652E + 506C6174666F726D44656661756C74080756697369626C6508085461624F7264 + 6572021D000A5452656374616E676C6500095374796C654E616D650606687472 + 61636B05416C69676E070A5665727443656E7465720A46696C6C2E436F6C6F72 + 0709784646314631463146064C6F636B6564090748697454657374080C4D6172 + 67696E732E4C65667405000000000000008001400B4D617267696E732E546F70 + 05000000000000008001400D4D617267696E732E526967687405000000000000 + 008001400E4D617267696E732E426F74746F6D05000000000000008001400A50 + 6F736974696F6E2E5805000000000000008001400A506F736974696F6E2E5905 + 000000000000008001400A53697A652E57696474680500000000000000F40540 + 0B53697A652E4865696768740500000000000200C001401453697A652E506C61 + 74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978464631 + 4331433143000B54476C6F774566666563740008536F66746E65737305000000 + 00009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F7061 + 63697479050000000000000080FF3F0754726967676572060E4973466F637573 + 65643D7472756507456E61626C6564080000000A5452656374616E676C650009 + 5374796C654E616D65060676747261636B05416C69676E070A486F727A43656E + 7465720A46696C6C2E436F6C6F720709784646314631463146064C6F636B6564 + 090748697454657374080C4D617267696E732E4C656674050000000000000080 + 01400B4D617267696E732E546F7005000000000000008001400D4D617267696E + 732E526967687405000000000000008001400E4D617267696E732E426F74746F + 6D05000000000000008001400A506F736974696F6E2E580500000000000000F8 + 04400A506F736974696F6E2E5905000000000000008001400A53697A652E5769 + 6474680500000000000000C001400B53697A652E486569676874050000000000 + 0200C001401453697A652E506C6174666F726D44656661756C74080C5374726F + 6B652E436F6C6F720709784646314331433143000B54476C6F77456666656374 + 0008536F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207 + 09784646363543384530074F706163697479050000000000000080FF3F075472 + 6967676572060E4973466F63757365643D7472756507456E61626C6564080000 + 0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65 + 64090C4D617267696E732E4C65667405000000000000008000C00B4D61726769 + 6E732E546F7005000000000000008000C00D4D617267696E732E526967687405 + 000000000000008000C00E4D617267696E732E426F74746F6D05000000000000 + 008000C00A506F736974696F6E2E580500000000000000C000400A506F736974 + 696F6E2E59050000000000000080FF3F0A53697A652E57696474680500000000 + 000000A002400B53697A652E4865696768740500000000000100E00240145369 + 7A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006 + 0D7468756D626261727374796C65085461624F72646572020100000054504630 + 07544C61796F757400095374796C654E616D65060E6E756D626572626F787374 + 796C650A506F736974696F6E2E580500000000000000BC07400A506F73697469 + 6F6E2E590500000000000080F407400A53697A652E5769647468050000000000 + 0000B605400B53697A652E4865696768740500000000000000C003401453697A + 652E506C6174666F726D44656661756C74080756697369626C6508085461624F + 72646572021E000A5452656374616E676C6500095374796C654E616D65060A62 + 61636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B + 696E6407084772616469656E741446696C6C2E4772616469656E742E506F696E + 74730E0105436F6C6F720709784646353835383538064F666673657405000000 + 00000000000000000105436F6C6F720709784646353135313531064F66667365 + 74050000000000A01BF3FD3F000105436F6C6F72070978464634393439343906 + 4F6666736574050000000000000080FF3F0000064C6F636B6564090748697454 + 657374080C4D617267696E732E4C65667405000000000000008000400B4D6172 + 67696E732E546F7005000000000000008000400D4D617267696E732E52696768 + 7405000000000000008000400E4D617267696E732E426F74746F6D0500000000 + 0000008000400A53697A652E57696474680500000000000000AE05400B53697A + 652E4865696768740500000000000000A003401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463641364136 + 41000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000 + 0000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72 + 0A537461727456616C756507097846463538353835380953746F7056616C7565 + 07097846463438343834380754726967676572061049734D6F7573654F766572 + 3D7472756500000F54436F6C6F72416E696D6174696F6E00084475726174696F + 6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E + 436F6C6F720A537461727456616C756507097846463438343834380953746F70 + 56616C756507097846463538353835380754726967676572061149734D6F7573 + 654F7665723D66616C736500000A5452656374616E676C650005416C69676E07 + 06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408 + 0C4D617267696E732E4C65667405000000000000008000C00B4D617267696E73 + 2E546F7005000000000000008000C00D4D617267696E732E5269676874050000 + 00000000008000C00E4D617267696E732E426F74746F6D050000000000000080 + 00C00A53697A652E57696474680500000000000000B605400B53697A652E4865 + 696768740500000000000000C003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646353135313531000A54 + 52656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B69 + 6E6407044E6F6E650748697454657374080C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500 + 000000000000B205400B53697A652E4865696768740500000000000000B00340 + 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F + 6C6F7207097846463143314331430000000007544C61796F757400095374796C + 654E616D650607636F6E74656E7405416C69676E0708436F6E74656E7473064C + 6F636B6564090C4D617267696E732E4C65667405000000000000008001400B4D + 617267696E732E546F7005000000000000008001400D4D617267696E732E5269 + 67687405000000000000008001400E4D617267696E732E426F74746F6D050000 + 00000000008001400A53697A652E57696474680500000000000000A605400B53 + 697A652E48656967687405000000000000008003401453697A652E506C617466 + 6F726D44656661756C740800000C5442727573684F626A65637400095374796C + 654E616D65060A666F726567726F756E640B42727573682E436F6C6F72070863 + 6C61426C61636B00000B54476C6F774566666563740008536F66746E65737305 + 00000000009A9999FD3F09476C6F77436F6C6F72070978464636354338453007 + 4F706163697479050000000000000080FF3F0754726967676572060E4973466F + 63757365643D7472756507456E61626C6564080000005450463007544C61796F + 757400095374796C654E616D650609656469747374796C650A506F736974696F + 6E2E580500000000000000BC07400A506F736974696F6E2E5905000000000000 + 80F407400A53697A652E57696474680500000000000000B605400B53697A652E + 4865696768740500000000000000C003401453697A652E506C6174666F726D44 + 656661756C74080756697369626C6508085461624F72646572021F000A545265 + 6374616E676C6500095374796C654E616D65060A6261636B67726F756E640541 + 6C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846463139 + 31393139064C6F636B6564090748697454657374080A53697A652E5769647468 + 0500000000000000B605400B53697A652E4865696768740500000000000000C0 + 03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E + 436F6C6F720709784646333933393339000F54436F6C6F72416E696D6174696F + 6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E + 616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464635 + 30353035300953746F7056616C7565070978464637303730373000000F54436F + 6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC + 3F07496E7665727365090C50726F70657274794E616D65060A46696C6C2E436F + 6C6F720A537461727456616C756507097846463530353035300953746F705661 + 6C7565070978464637303730373000000A5452656374616E676C650005416C69 + 676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465 + 7374080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267 + 696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874 + 050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000 + 000080FF3F0A53697A652E57696474680500000000000000B205400B53697A65 + 2E4865696768740500000000000000B003401453697A652E506C6174666F726D + 44656661756C74080C5374726F6B652E436F6C6F720709784646313831383138 + 00000007544C61796F757400095374796C654E616D650607636F6E74656E7405 + 416C69676E0706436C69656E74064C6F636B6564090C4D617267696E732E4C65 + 66740500000000000000C000400B4D617267696E732E546F7005000000000000 + 00C000400D4D617267696E732E52696768740500000000000000C000400E4D61 + 7267696E732E426F74746F6D0500000000000000C000400A53697A652E576964 + 746805000000000000008004400B53697A652E48656967687405000000000000 + 009003401453697A652E506C6174666F726D44656661756C7408000007544C61 + 796F757400095374796C654E616D650607627574746F6E7305416C69676E0705 + 5269676874064C6F636B6564090B4D617267696E732E546F7005000000000000 + 00C000400D4D617267696E732E52696768740500000000000000C000400E4D61 + 7267696E732E426F74746F6D0500000000000000C000400A506F736974696F6E + 2E5805000000000000009804400A506F736974696F6E2E590500000000000000 + C000400A53697A652E57696474680500000000000000C804400B53697A652E48 + 656967687405000000000000009003401453697A652E506C6174666F726D4465 + 6661756C740800000C5442727573684F626A65637400095374796C654E616D65 + 060A666F726567726F756E640B42727573682E436F6C6F720709784646454145 + 41454100000C5442727573684F626A65637400095374796C654E616D65060973 + 656C656374696F6E0A42727573682E4B696E6407084772616469656E74154272 + 7573682E4772616469656E742E506F696E74730E0105436F6C6F720709783830 + 324237393843064F66667365740500000000000000000000000105436F6C6F72 + 0709783830324236453746064F666673657405000000000012A2F8FD3F000105 + 436F6C6F720709783830324236343732064F6666736574050000000000000080 + FF3F000000000B54476C6F774566666563740008536F66746E65737305000000 + 00009A9999FD3F09476C6F77436F6C6F720709784646363543384530074F7061 + 63697479050000000000000080FF3F0754726967676572060E4973466F637573 + 65643D7472756507456E61626C6564080000005450463007544C61796F757400 + 095374796C654E616D65060C7370696E626F787374796C650A506F736974696F + 6E2E580500000000000000BC07400A506F736974696F6E2E5905000000000000 + 80F407400A53697A652E57696474680500000000000000B605400B53697A652E + 4865696768740500000000000000C003401453697A652E506C6174666F726D44 + 656661756C74080756697369626C6508085461624F726465720220000A545265 + 6374616E676C6500095374796C654E616D65060A6261636B67726F756E640541 + 6C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846463139 + 31393139064C6F636B6564090748697454657374080A53697A652E5769647468 + 0500000000000000B605400B53697A652E4865696768740500000000000000C0 + 03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E + 436F6C6F720709784646333933393339000F54436F6C6F72416E696D6174696F + 6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E + 616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464635 + 30353035300953746F7056616C7565070978464637303730373000000F54436F + 6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC + 3F07496E7665727365090C50726F70657274794E616D65060A46696C6C2E436F + 6C6F720A537461727456616C756507097846463530353035300953746F705661 + 6C7565070978464637303730373000000A5452656374616E676C650005416C69 + 676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465 + 7374080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267 + 696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874 + 050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000 + 000080FF3F0A53697A652E57696474680500000000000000B205400B53697A65 + 2E4865696768740500000000000000B003401453697A652E506C6174666F726D + 44656661756C74080C5374726F6B652E436F6C6F720709784646313831383138 + 00000007544C61796F757400095374796C654E616D650607636F6E74656E7405 + 416C69676E0706436C69656E74064C6F636B6564090C4D617267696E732E4C65 + 66740500000000000000C000400B4D617267696E732E546F7005000000000000 + 00C000400D4D617267696E732E52696768740500000000000000C000400E4D61 + 7267696E732E426F74746F6D0500000000000000C000400A53697A652E576964 + 746805000000000000009404400B53697A652E48656967687405000000000000 + 009003401453697A652E506C6174666F726D44656661756C7408000007544275 + 74746F6E00095374796C654E616D65060B6D696E7573627574746F6E05416C69 + 676E07074669744C6566740843616E466F637573080C4D617267696E732E4C65 + 667405000000000000008000400B4D617267696E732E546F7005000000000000 + 008000400D4D617267696E732E526967687405000000000000008000400E4D61 + 7267696E732E426F74746F6D05000000000000008000400A506F736974696F6E + 2E5805000000000000008000400A506F736974696F6E2E590500000000000000 + 8000400A53697A652E57696474680500000000000000A003400B53697A652E48 + 65696768740500000000000000A003401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B7570061C7472616E73706172656E7463 + 6972636C65627574746F6E7374796C65000554506174680005416C69676E0706 + 436C69656E7409446174612E506174680A400000000500000000000000000080 + 3F00000000010000000000803F0000803F01000000000000000000003F010000 + 000000803F00000000030000000000803F000000000A46696C6C2E436F6C6F72 + 0708636C6157686974650748697454657374080C4D617267696E732E4C656674 + 0500000000000000C001400B4D617267696E732E546F700500000000000000C0 + 01400D4D617267696E732E52696768740500000000000000C001400E4D617267 + 696E732E426F74746F6D0500000000000000C001400A53697A652E5769647468 + 05000000000000008002400B53697A652E486569676874050000000000000080 + 02401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E + 4B696E6407044E6F6E650000000754427574746F6E00095374796C654E616D65 + 060A706C7573627574746F6E05416C69676E070846697452696768740843616E + 466F637573080C4D617267696E732E4C65667405000000000000008000400B4D + 617267696E732E546F7005000000000000008000400D4D617267696E732E5269 + 67687405000000000000008000400E4D617267696E732E426F74746F6D050000 + 00000000008000400A506F736974696F6E2E5805000000000000008A05400A50 + 6F736974696F6E2E5905000000000000008000400A53697A652E576964746805 + 00000000000000A003400B53697A652E4865696768740500000000000000A003 + 401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F + 6B7570061C7472616E73706172656E74636972636C65627574746F6E7374796C + 65000554506174680005416C69676E0706436C69656E7409446174612E506174 + 680A340000000400000000000000000000000000000001000000000000000000 + 803F010000000000803F0000003F0300000000000000000000000A46696C6C2E + 436F6C6F720708636C6157686974650748697454657374080C4D617267696E73 + 2E4C6566740500000000000000C001400B4D617267696E732E546F7005000000 + 00000000C001400D4D617267696E732E52696768740500000000000000C00140 + 0E4D617267696E732E426F74746F6D0500000000000000C001400A53697A652E + 576964746805000000000000008002400B53697A652E48656967687405000000 + 000000008002401453697A652E506C6174666F726D44656661756C74080B5374 + 726F6B652E4B696E6407044E6F6E650000000C5442727573684F626A65637400 + 095374796C654E616D65060A666F726567726F756E640B42727573682E436F6C + 6F72070978464645414541454100000C5442727573684F626A65637400095374 + 796C654E616D65060973656C656374696F6E0A42727573682E4B696E64070847 + 72616469656E741542727573682E4772616469656E742E506F696E74730E0105 + 436F6C6F720709783830324237393843064F6666736574050000000000000000 + 0000000105436F6C6F720709783830324236453746064F666673657405000000 + 000012A2F8FD3F000105436F6C6F720709783830324236343732064F66667365 + 74050000000000000080FF3F000000000B54476C6F774566666563740008536F + 66746E6573730500000000009A9999FD3F09476C6F77436F6C6F720709784646 + 363543384530074F706163697479050000000000000080FF3F07547269676765 + 72060E4973466F63757365643D7472756507456E61626C656408000000545046 + 3007544C61796F757400095374796C654E616D650611636C656172696E676564 + 69747374796C650A506F736974696F6E2E580500000000000000BC07400A506F + 736974696F6E2E590500000000000080F407400A53697A652E57696474680500 + 000000000000B605400B53697A652E4865696768740500000000000000C00340 + 1453697A652E506C6174666F726D44656661756C74080756697369626C650808 + 5461624F726465720221000A5452656374616E676C6500095374796C654E616D + 65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A4669 + 6C6C2E436F6C6F720709784646313931393139064C6F636B6564090748697454 + 657374080A53697A652E57696474680500000000000000B605400B53697A652E + 4865696768740500000000000000C003401453697A652E506C6174666F726D44 + 656661756C74080C5374726F6B652E436F6C6F72070978464633393339333900 + 0F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000 + CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53 + 7461727456616C756507097846463530353035300953746F7056616C75650709 + 78464637303730373000000F54436F6C6F72416E696D6174696F6E0008447572 + 6174696F6E050000000000CDCCCCFC3F07496E7665727365090C50726F706572 + 74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978 + 46463530353035300953746F7056616C7565070978464637303730373000000A + 5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B + 696E6407044E6F6E650748697454657374080C4D617267696E732E4C65667405 + 0000000000000080FF3F0B4D617267696E732E546F70050000000000000080FF + 3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769 + 6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805 + 00000000000000B205400B53697A652E4865696768740500000000000000B003 + 401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43 + 6F6C6F72070978464631383138313800000007544C61796F757400095374796C + 654E616D650607636F6E74656E7405416C69676E0708436F6E74656E7473064C + 6F636B6564090C4D617267696E732E4C6566740500000000000000C000400B4D + 617267696E732E546F700500000000000000C000400D4D617267696E732E5269 + 6768740500000000000000B803400E4D617267696E732E426F74746F6D050000 + 0000000000C000400A53697A652E576964746805000000000000008205400B53 + 697A652E48656967687405000000000000009003401453697A652E506C617466 + 6F726D44656661756C740800000754427574746F6E00095374796C654E616D65 + 060B636C656172627574746F6E05416C69676E07084669745269676874084361 + 6E466F637573080C4D617267696E732E4C65667405000000000000008000400B + 4D617267696E732E546F7005000000000000008000400D4D617267696E732E52 + 6967687405000000000000008000400E4D617267696E732E426F74746F6D0500 + 0000000000008000400A506F736974696F6E2E5805000000000000008A05400A + 506F736974696F6E2E5905000000000000008000400A53697A652E5769647468 + 0500000000000000A003400B53697A652E4865696768740500000000000000A0 + 03401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F + 6F6B7570061C7472616E73706172656E74636972636C65627574746F6E737479 + 6C65000554506174680005416C69676E070346697409446174612E506174680A + C400000010000000000000000000A0C00000704101000000000070410000A0C0 + 01000000000048420000F041010000000000AA420000A0C0010000000000D242 + 000070410100000000008C4200004842010000000000D2420000B44201000000 + 0000AA420000DC42020000003BDF34429E6F8C4202000000FE547D427FAAB042 + 02000000000048420000964201000000000070410000DC42010000000000A0C0 + 0000B442010000000000F04100005C42010000000000A0C00000704103000000 + 0000000000000000064C6F636B6564090748697454657374080C4D617267696E + 732E4C65667405000000000000008001400B4D617267696E732E546F70050000 + 00000000008001400D4D617267696E732E526967687405000000000000008001 + 400E4D617267696E732E426F74746F6D05000000000000008001400A53697A65 + 2E57696474680500000000000000C002400B53697A652E486569676874050000 + 0000000000C002401453697A652E506C6174666F726D44656661756C74080B53 + 74726F6B652E4B696E6407044E6F6E650000000C5442727573684F626A656374 + 00095374796C654E616D65060A666F726567726F756E640B42727573682E436F + 6C6F72070978464645414541454100000C5442727573684F626A656374000953 + 74796C654E616D65060973656C656374696F6E0A42727573682E4B696E640708 + 4772616469656E741542727573682E4772616469656E742E506F696E74730E01 + 05436F6C6F720709783830324237393843064F66667365740500000000000000 + 000000000105436F6C6F720709783830324236453746064F6666736574050000 + 00000012A2F8FD3F000105436F6C6F720709783830324236343732064F666673 + 6574050000000000000080FF3F000000000B54476C6F77456666656374000853 + 6F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846 + 46363543384530074F706163697479050000000000000080FF3F075472696767 + 6572060E4973466F63757365643D7472756507456E61626C6564080000005450 + 463007544C61796F757400095374796C654E616D6506096D656D6F7374796C65 + 0C436C69704368696C6472656E090A506F736974696F6E2E5805000000000000 + 80B507400A506F736974696F6E2E590500000000000000DA07400A53697A652E + 5769647468050000000000FFFFE905400B53697A652E48656967687405000000 + 000000008306401453697A652E506C6174666F726D44656661756C7408075669 + 7369626C6508085461624F726465720222000A5452656374616E676C65000953 + 74796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74 + 656E74730A46696C6C2E436F6C6F720709784646313931393139064C6F636B65 + 64090748697454657374080C50616464696E672E4C6566740500000000000000 + 80FF3F0B50616464696E672E546F70050000000000000080FF3F0D5061646469 + 6E672E5269676874050000000000000080FF3F0E50616464696E672E426F7474 + 6F6D050000000000000080FF3F0A53697A652E5769647468050000000000FFFF + E905400B53697A652E48656967687405000000000000008306401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 4646333933393339000A5452656374616E676C650005416C69676E0706436C69 + 656E740946696C6C2E4B696E6407044E6F6E650748697454657374080A53697A + 652E5769647468050000000000FFFFE505400B53697A652E4865696768740500 + 0000000000008106401453697A652E506C6174666F726D44656661756C74080C + 5374726F6B652E436F6C6F720709784646353935393539000007544C61796F75 + 740005416C69676E0706436C69656E740A53697A652E57696474680500000000 + 00FFFFE505400B53697A652E4865696768740500000000000000810640145369 + 7A652E506C6174666F726D44656661756C74080007544C61796F757400095374 + 796C654E616D650607636F6E74656E7405416C69676E0706436C69656E740C4D + 617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E54 + 6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000 + 00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F + 0A53697A652E5769647468050000000000FFFFC305400B53697A652E48656967 + 68740500000000000000E005401453697A652E506C6174666F726D4465666175 + 6C740800000A545363726F6C6C42617200095374796C654E616D65060A767363 + 726F6C6C62617205416C69676E0705526967687406437572736F720707637241 + 72726F770B536D616C6C4368616E676505000000000000000000000B4F726965 + 6E746174696F6E0708566572746963616C0A506F736974696F6E2E5805000000 + 0000FFFFC705400A53697A652E57696474680500000000000000F002400B5369 + 7A652E4865696768740500000000000000E405401453697A652E506C6174666F + 726D44656661756C740800000A545363726F6C6C42617200095374796C654E61 + 6D65060A687363726F6C6C62617205416C69676E0706426F74746F6D06437572 + 736F72070763724172726F770B536D616C6C4368616E67650500000000000000 + 0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F7369 + 74696F6E2E590500000000000000E405400A53697A652E576964746805000000 + 0000FFFFE505400B53697A652E4865696768740500000000000000F002401453 + 697A652E506C6174666F726D44656661756C740800000F54536D616C6C536372 + 6F6C6C42617200095374796C654E616D65060F76736D616C6C7363726F6C6C62 + 617205416C69676E0705526967687406437572736F72070763724172726F770B + 536D616C6C4368616E676505000000000000000000000B4F7269656E74617469 + 6F6E0708566572746963616C0B4D617267696E732E546F700500000000000000 + 80FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D6172 + 67696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E + 580500000000000000C605400A506F736974696F6E2E59050000000000000080 + 00400A53697A652E576964746805000000000000008002400B53697A652E4865 + 6967687405000000000000008002401453697A652E506C6174666F726D446566 + 61756C74080756697369626C650800000F54536D616C6C5363726F6C6C426172 + 00095374796C654E616D65060F68736D616C6C7363726F6C6C62617205416C69 + 676E0706426F74746F6D06437572736F72070763724172726F770B536D616C6C + 4368616E676505000000000000000000000B4F7269656E746174696F6E070A48 + 6F72697A6F6E74616C0C4D617267696E732E4C656674050000000000000080FF + 3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769 + 6E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E5805 + 000000000000008000400A506F736974696F6E2E590500000000000000E20540 + 0A53697A652E576964746805000000000000009606400B53697A652E48656967 + 687405000000000000008002401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508000000000C5442727573684F626A656374000953 + 74796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F72 + 070978464645414541454100000C5442727573684F626A65637400095374796C + 654E616D65060973656C656374696F6E0A42727573682E4B696E640708477261 + 6469656E741542727573682E4772616469656E742E506F696E74730E0105436F + 6C6F720709783830324237393843064F66667365740500000000000000000000 + 000105436F6C6F720709783830324236453746064F6666736574050000000000 + 12A2F8FD3F000105436F6C6F720709783830324236343732064F666673657405 + 0000000000000080FF3F000000000B54476C6F774566666563740008536F6674 + 6E6573730500000000009A9999FD3F09476C6F77436F6C6F7207097846463635 + 43384530074F706163697479050000000000000080FF3F075472696767657206 + 0E4973466F63757365643D7472756507456E61626C6564080000005450463007 + 544C61796F757400095374796C654E616D65060B627574746F6E7374796C650A + 506F736974696F6E2E580500000000000000BC07400A506F736974696F6E2E59 + 0500000000000080F407400A53697A652E57696474680500000000000000B605 + 400B53697A652E4865696768740500000000000000C003401453697A652E506C + 6174666F726D44656661756C74080756697369626C6508085461624F72646572 + 0223000A5452656374616E676C6500095374796C654E616D65060A6261636B67 + 726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E6407 + 084772616469656E741446696C6C2E4772616469656E742E506F696E74730E01 + 05436F6C6F720709784646353835383538064F66667365740500000000000000 + 000000000105436F6C6F720709784646353135313531064F6666736574050000 + 000000A01BF3FD3F000105436F6C6F720709784646343934393439064F666673 + 6574050000000000000080FF3F0000064C6F636B656409074869745465737408 + 0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73 + 2E546F7005000000000000008000400D4D617267696E732E5269676874050000 + 00000000008000400E4D617267696E732E426F74746F6D050000000000000080 + 00400A53697A652E57696474680500000000000000AE05400B53697A652E4865 + 696768740500000000000000A003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646364136413641000F54 + 436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCC + CCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461 + 727456616C756507097846463538353835380953746F7056616C756507097846 + 463438343834380754726967676572062049734D6F7573654F7665723D747275 + 653B4973507265737365643D66616C736500000F54436F6C6F72416E696D6174 + 696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274 + 794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507097846 + 463438343834380953746F7056616C7565070978464635383538353807547269 + 67676572062149734D6F7573654F7665723D66616C73653B4973507265737365 + 643D66616C736500000F54436F6C6F72416E696D6174696F6E00084475726174 + 696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C + 6C2E436F6C6F720A537461727456616C75650709784646343834383438095374 + 6F7056616C756507097846463432343234320754726967676572062049734D6F + 7573654F7665723D66616C73653B4973507265737365643D7472756500000F54 + 436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCC + CCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461 + 727456616C756507097846463432343234320953746F7056616C756507097846 + 463438343834380754726967676572061F49734D6F7573654F7665723D747275 + 653B4973507265737365643D7472756500000A5452656374616E676C65000541 + 6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974 + 54657374080C4D617267696E732E4C65667405000000000000008000C00B4D61 + 7267696E732E546F7005000000000000008000C00D4D617267696E732E526967 + 687405000000000000008000C00E4D617267696E732E426F74746F6D05000000 + 000000008000C00A53697A652E57696474680500000000000000B605400B5369 + 7A652E4865696768740500000000000000C003401453697A652E506C6174666F + 726D44656661756C74080C5374726F6B652E436F6C6F72070978464635313531 + 3531000A5452656374616E676C650005416C69676E0706436C69656E74094669 + 6C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C + 656674050000000000000080FF3F0B4D617267696E732E546F70050000000000 + 000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D + 617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769 + 6474680500000000000000B205400B53697A652E486569676874050000000000 + 0000B003401453697A652E506C6174666F726D44656661756C74080C5374726F + 6B652E436F6C6F720709784646314331433143000000000654476C7970680009 + 5374796C654E616D65060A676C7970687374796C650C4D617267696E732E4C65 + 66740500000000000000A001400B4D617267696E732E546F7005000000000000 + 008000400D4D617267696E732E5269676874050000000000000080FF3F0E4D61 + 7267696E732E426F74746F6D050000000000000080004005416C69676E07044C + 6566740A53697A652E576964746805000000000000008003400B53697A652E48 + 656967687405000000000000008003401453697A652E506C6174666F726D4465 + 6661756C7408000005545465787400095374796C654E616D6506047465787405 + 416C69676E0706436C69656E74064C6F636B6564090748697454657374080C4D + 617267696E732E4C6566740500000000000000A001400B4D617267696E732E54 + 6F7005000000000000008000400D4D617267696E732E52696768740500000000 + 000000A001400E4D617267696E732E426F74746F6D0500000000000000800040 + 0A53697A652E57696474680500000000000000A205400B53697A652E48656967 + 68740500000000000000A003401453697A652E506C6174666F726D4465666175 + 6C740804546578740606627574746F6E165465787453657474696E67732E466F + 6E74436F6C6F720708636C61576869746500000B54476C6F7745666665637400 + 08536F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F720709 + 784646363543384530074F706163697479050000000000000080FF3F07547269 + 67676572060E4973466F63757365643D7472756507456E61626C656408000000 + 5450463007544C61796F757400095374796C654E616D650610636F6C6F726275 + 74746F6E7374796C650A506F736974696F6E2E580500000000000000BC07400A + 506F736974696F6E2E590500000000000080F407400A53697A652E5769647468 + 0500000000000000B605400B53697A652E4865696768740500000000000000C0 + 03401453697A652E506C6174666F726D44656661756C74080756697369626C65 + 08085461624F726465720224000A5452656374616E676C6500095374796C654E + 616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E747309 + 46696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E + 742E506F696E74730E0105436F6C6F720709784646353835383538064F666673 + 65740500000000000000000000000105436F6C6F720709784646353135313531 + 064F6666736574050000000000A01BF3FD3F000105436F6C6F72070978464634 + 3934393439064F6666736574050000000000000080FF3F0000064C6F636B6564 + 090748697454657374080C4D617267696E732E4C656674050000000000000080 + 00400B4D617267696E732E546F7005000000000000008000400D4D617267696E + 732E526967687405000000000000008000400E4D617267696E732E426F74746F + 6D05000000000000008000400A53697A652E57696474680500000000000000AE + 05400B53697A652E4865696768740500000000000000A003401453697A652E50 + 6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846 + 46364136413641000F54436F6C6F72416E696D6174696F6E0008447572617469 + 6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C + 2E436F6C6F720A537461727456616C756507097846463538353835380953746F + 7056616C756507097846463438343834380754726967676572062049734D6F75 + 73654F7665723D747275653B4973507265737365643D66616C736500000F5443 + 6F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCC + FC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 + 7456616C756507097846463438343834380953746F7056616C75650709784646 + 3538353835380754726967676572062149734D6F7573654F7665723D66616C73 + 653B4973507265737365643D66616C736500000F54436F6C6F72416E696D6174 + 696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274 + 794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507097846 + 463438343834380953746F7056616C7565070978464634323432343207547269 + 67676572062049734D6F7573654F7665723D66616C73653B4973507265737365 + 643D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469 + 6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C + 2E436F6C6F720A537461727456616C756507097846463432343234320953746F + 7056616C756507097846463438343834380754726967676572061F49734D6F75 + 73654F7665723D747275653B4973507265737365643D7472756500000A545265 + 6374616E676C650005416C69676E0706436C69656E740946696C6C2E4B696E64 + 07044E6F6E650748697454657374080C4D617267696E732E4C65667405000000 + 000000008000C00B4D617267696E732E546F7005000000000000008000C00D4D + 617267696E732E526967687405000000000000008000C00E4D617267696E732E + 426F74746F6D05000000000000008000C00A53697A652E576964746805000000 + 00000000B605400B53697A652E4865696768740500000000000000C003401453 + 697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F + 720709784646353135313531000A5452656374616E676C650005416C69676E07 + 06436C69656E740946696C6C2E4B696E6407044E6F6E65074869745465737408 + 0C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E73 + 2E546F70050000000000000080FF3F0D4D617267696E732E5269676874050000 + 000000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080 + FF3F0A53697A652E57696474680500000000000000B205400B53697A652E4865 + 696768740500000000000000B003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646314331433143000000 + 000A5452656374616E676C6500095374796C654E616D65060466696C6C05416C + 69676E0706436C69656E740A46696C6C2E436F6C6F720708636C61426C61636B + 064C6F636B6564090748697454657374080C4D617267696E732E4C6566740500 + 000000000000C001400B4D617267696E732E546F700500000000000000A00140 + 0D4D617267696E732E52696768740500000000000000C001400E4D617267696E + 732E426F74746F6D0500000000000000A001400A53697A652E57696474680500 + 0000000000009E05400B53697A652E4865696768740500000000000000E00240 + 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F + 6C6F72070978464636413641364100000B54476C6F774566666563740008536F + 66746E6573730500000000009A9999FD3F09476C6F77436F6C6F720709784646 + 363543384530074F706163697479050000000000000080FF3F07547269676765 + 72060E4973466F63757365643D7472756507456E61626C656408000000545046 + 3007544C61796F757400095374796C654E616D650611636F726E657262757474 + 6F6E7374796C650A506F736974696F6E2E580500000000000000BC07400A506F + 736974696F6E2E590500000000000080F407400A53697A652E57696474680500 + 000000000000B605400B53697A652E4865696768740500000000000000C00340 + 1453697A652E506C6174666F726D44656661756C74080756697369626C650808 + 5461624F726465720225000A5452656374616E676C6500095374796C654E616D + 65060A6261636B67726F756E6405416C69676E0708436F6E74656E7473094669 + 6C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E742E + 506F696E74730E0105436F6C6F720709784646353835383538064F6666736574 + 0500000000000000000000000105436F6C6F720709784646353135313531064F + 6666736574050000000000A01BF3FD3F000105436F6C6F720709784646343934 + 393439064F6666736574050000000000000080FF3F0000064C6F636B65640907 + 48697454657374080A53697A652E57696474680500000000000000B605400B53 + 697A652E4865696768740500000000000000C003401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646314331 + 433143000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C + 6F720A537461727456616C756507097846463538353835380953746F7056616C + 756507097846463438343834380754726967676572062049734D6F7573654F76 + 65723D747275653B4973507265737365643D66616C736500000F54436F6C6F72 + 416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50 + 726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C + 756507097846463438343834380953746F7056616C7565070978464635383538 + 35380754726967676572062149734D6F7573654F7665723D66616C73653B4973 + 507265737365643D66616C736500000F54436F6C6F72416E696D6174696F6E00 + 084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D + 65060A46696C6C2E436F6C6F720A537461727456616C75650709784646343834 + 3834380953746F7056616C756507097846463432343234320754726967676572 + 062049734D6F7573654F7665723D66616C73653B4973507265737365643D7472 + 756500000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C + 6F720A537461727456616C756507097846463432343234320953746F7056616C + 756507097846463438343834380754726967676572061F49734D6F7573654F76 + 65723D747275653B4973507265737365643D747275650000000654476C797068 + 00095374796C654E616D65060A676C7970687374796C650C4D617267696E732E + 4C65667405000000000000008000400B4D617267696E732E546F700500000000 + 0000008001400D4D617267696E732E526967687405000000000000008000400E + 4D617267696E732E426F74746F6D050000000000000080004005416C69676E07 + 044C6566740A53697A652E576964746805000000000000008003400B53697A65 + 2E48656967687405000000000000008003401453697A652E506C6174666F726D + 44656661756C7408000005545465787400095374796C654E616D650604746578 + 7405416C69676E0706436C69656E74064C6F636B656409074869745465737408 + 0C4D617267696E732E4C6566740500000000000000A001400B4D617267696E73 + 2E546F7005000000000000008000400D4D617267696E732E5269676874050000 + 0000000000A001400E4D617267696E732E426F74746F6D050000000000000080 + 00400A53697A652E57696474680500000000000000A205400B53697A652E4865 + 696768740500000000000000A003401453697A652E506C6174666F726D446566 + 61756C740804546578740606627574746F6E165465787453657474696E67732E + 466F6E74436F6C6F720708636C61576869746500000B54476C6F774566666563 + 740008536F66746E6573730500000000009A9999FD3F09476C6F77436F6C6F72 + 0709784646363543384530074F706163697479050000000000000080FF3F0754 + 726967676572060E4973466F63757365643D7472756507456E61626C65640800 + 00005450463007544C61796F757400095374796C654E616D65060D706F707570 + 626F787374796C650A506F736974696F6E2E580500000000000000B807400A50 + 6F736974696F6E2E590500000000000000F507400A53697A652E576964746805 + 00000000000000D605400B53697A652E4865696768740500000000000000B003 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 085461624F726465720226000A5452656374616E676C6500095374796C654E61 + 6D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946 + 696C6C2E4B696E6407084772616469656E741446696C6C2E4772616469656E74 + 2E506F696E74730E0105436F6C6F720709784646353835383538064F66667365 + 740500000000000000000000000105436F6C6F72070978464635313531353106 + 4F6666736574050000000000A01BF3FD3F000105436F6C6F7207097846463439 + 34393439064F6666736574050000000000000080FF3F0000064C6F636B656409 + 0748697454657374080C4D617267696E732E4C65667405000000000000008000 + 400B4D617267696E732E546F7005000000000000008000400D4D617267696E73 + 2E526967687405000000000000008000400E4D617267696E732E426F74746F6D + 05000000000000008000400A53697A652E57696474680500000000000000CE05 + 400B53697A652E48656967687405000000000000009003401453697A652E506C + 6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646 + 364136413641000F54436F6C6F72416E696D6174696F6E00084475726174696F + 6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E + 436F6C6F720A537461727456616C756507097846463538353835380953746F70 + 56616C756507097846463438343834380754726967676572061049734D6F7573 + 654F7665723D7472756500000F54436F6C6F72416E696D6174696F6E00084475 + 726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A + 46696C6C2E436F6C6F720A537461727456616C75650709784646343834383438 + 0953746F7056616C756507097846463538353835380754726967676572061149 + 734D6F7573654F7665723D66616C736500000A5452656374616E676C65000541 + 6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974 + 54657374080C4D617267696E732E4C65667405000000000000008000C00B4D61 + 7267696E732E546F7005000000000000008000C00D4D617267696E732E526967 + 687405000000000000008000C00E4D617267696E732E426F74746F6D05000000 + 000000008000C00A53697A652E57696474680500000000000000D605400B5369 + 7A652E4865696768740500000000000000B003401453697A652E506C6174666F + 726D44656661756C74080C5374726F6B652E436F6C6F72070978464635313531 + 3531000A5452656374616E676C650005416C69676E0706436C69656E74094669 + 6C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C + 656674050000000000000080FF3F0B4D617267696E732E546F70050000000000 + 000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D + 617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E5769 + 6474680500000000000000D205400B53697A652E486569676874050000000000 + 0000A003401453697A652E506C6174666F726D44656661756C74080C5374726F + 6B652E436F6C6F7207097846463143314331430000000007544C61796F757400 + 05416C69676E070552696768740A506F736974696F6E2E580500000000000000 + B805400A53697A652E57696474680500000000000000F002400B53697A652E48 + 65696768740500000000000000B003401453697A652E506C6174666F726D4465 + 6661756C7408000554506174680005416C69676E070643656E74657209446174 + 612E506174680A400000000500000000000000000000000000803F0100000000 + 00803F0000803F010000000000003F0000000001000000000000000000803F03 + 00000000000000000000000A46696C6C2E436F6C6F72070C636C614C69676874 + 677261790748697454657374080B4D617267696E732E546F7005000000000000 + 009002C00A53697A652E576964746805000000000000008002400B53697A652E + 4865696768740500000000000000A001401453697A652E506C6174666F726D44 + 656661756C74080B5374726F6B652E4B696E6407044E6F6E6500000554506174 + 680005416C69676E070643656E74657209446174612E506174680A3400000004 + 000000000000000000000000000000010000000000803F000000000100000000 + 00003F0000803F0300000000000000000000000A46696C6C2E436F6C6F720709 + 7846464430443044300748697454657374080B4D617267696E732E546F700500 + 000000000000E001400A53697A652E576964746805000000000000008002400B + 53697A652E4865696768740500000000000000A001401453697A652E506C6174 + 666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000 + 0005545465787400095374796C654E616D6506047465787405416C69676E0706 + 436C69656E74064C6F636B6564090748697454657374080C4D617267696E732E + 4C6566740500000000000000A001400B4D617267696E732E546F700500000000 + 000000A001400D4D617267696E732E52696768740500000000000000A001400E + 4D617267696E732E426F74746F6D0500000000000000A001400A53697A652E57 + 696474680500000000000000A405400B53697A652E4865696768740500000000 + 000000C002401453697A652E506C6174666F726D44656661756C740804546578 + 740606627574746F6E165465787453657474696E67732E466F6E74436F6C6F72 + 0708636C615768697465155465787453657474696E67732E576F726457726170 + 0800000B54476C6F774566666563740008536F66746E6573730500000000009A + 9999FD3F09476C6F77436F6C6F720709784646363543384530074F7061636974 + 79050000000000000080FF3F0754726967676572060E4973466F63757365643D + 7472756507456E61626C6564080000005450463007544C61796F757400095374 + 796C654E616D65060C6172636469616C7374796C650A506F736974696F6E2E58 + 0500000000000080C307400A506F736974696F6E2E590500000000000080EF07 + 400A53697A652E5769647468050000000000FFFFB304400B53697A652E486569 + 6768740500000000000000B004401453697A652E506C6174666F726D44656661 + 756C74080756697369626C6508085461624F726465720227000854456C6C6970 + 736500095374796C654E616D65060A6261636B67726F756E6405416C69676E07 + 034669740946696C6C2E4B696E6407084772616469656E741446696C6C2E4772 + 616469656E742E506F696E74730E0105436F6C6F720709784646353835383538 + 064F66667365740500000000000000000000000105436F6C6F72070978464635 + 3135313531064F6666736574050000000000A01BF3FD3F000105436F6C6F7207 + 09784646343934393439064F6666736574050000000000000080FF3F0000064C + 6F636B6564090748697454657374080C4D617267696E732E4C65667405000000 + 000000008000400B4D617267696E732E546F7005000000000000008000400D4D + 617267696E732E526967687405000000000000008000400E4D617267696E732E + 426F74746F6D05000000000000008000400A53697A652E576964746805000000 + 00000000A004400B53697A652E4865696768740500000000000000A004401453 + 697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F + 720709784646364136413641000F54436F6C6F72416E696D6174696F6E000844 + 75726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D6506 + 0A46696C6C2E436F6C6F720A537461727456616C756507097846463538353835 + 380953746F7056616C7565070978464634383438343807547269676765720610 + 49734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D617469 + 6F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F7065727479 + 4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709784646 + 3438343834380953746F7056616C756507097846463538353835380754726967 + 676572061149734D6F7573654F7665723D66616C736500000854456C6C697073 + 650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65 + 0748697454657374080C4D617267696E732E4C65667405000000000000008000 + C00B4D617267696E732E546F7005000000000000008000C00D4D617267696E73 + 2E526967687405000000000000008000C00E4D617267696E732E426F74746F6D + 05000000000000008000C00A53697A652E57696474680500000000000000B004 + 400B53697A652E4865696768740500000000000000B004401453697A652E506C + 6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646 + 353135313531000854456C6C697073650005416C69676E0706436C69656E7409 + 46696C6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E73 + 2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000 + 0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F + 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E + 57696474680500000000000000A804400B53697A652E48656967687405000000 + 00000000A804401453697A652E506C6174666F726D44656661756C74080C5374 + 726F6B652E436F6C6F72070978464631433143314300000007544C61796F7574 + 00095374796C654E616D6506047469636B05416C69676E0706436C69656E7406 + 4C6F636B6564090C4D617267696E732E4C65667405000000000000008000400B + 4D617267696E732E546F7005000000000000008000400D4D617267696E732E52 + 6967687405000000000000008000400E4D617267696E732E426F74746F6D0500 + 0000000000008000400A53697A652E576964746805000000000000009004400B + 53697A652E48656967687405000000000000009004401453697A652E506C6174 + 666F726D44656661756C74080007544C61796F75740005416C69676E07055269 + 6768740A506F736974696F6E2E580500000000000000F803400A53697A652E57 + 696474680500000000000000A001400B53697A652E4865696768740500000000 + 0000009004401453697A652E506C6174666F726D44656661756C740800085445 + 6C6C697073650005416C69676E070643656E7465720A46696C6C2E436F6C6F72 + 0709784646443044304430064C6F636B6564090748697454657374080A53697A + 652E57696474680500000000000000A001400B53697A652E4865696768740500 + 000000000000A001401453697A652E506C6174666F726D44656661756C74080B + 5374726F6B652E4B696E6407044E6F6E65000000000005545465787400095374 + 796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B + 6564090748697454657374080A53697A652E5769647468050000000000FFFFB3 + 04400B53697A652E4865696768740500000000000000B004401453697A652E50 + 6C6174666F726D44656661756C74080454657874060474657874165465787453 + 657474696E67732E466F6E742E53697A65050000000000000090024016546578 + 7453657474696E67732E466F6E74436F6C6F7207097846464530453045301554 + 65787453657474696E67732E576F726457726170080000055454657874000953 + 74796C654E616D650609747261636B7465787405416C69676E0706426F74746F + 6D064C6F636B6564090748697454657374080E4D617267696E732E426F74746F + 6D0500000000000000A002C00A506F736974696F6E2E590500000000000000B0 + 04400A53697A652E5769647468050000000000FFFFB304400B53697A652E4865 + 696768740500000000000000A002401453697A652E506C6174666F726D446566 + 61756C74080454657874060474657874165465787453657474696E67732E466F + 6E742E53697A650500000000000000900240165465787453657474696E67732E + 466F6E74436F6C6F720709784646453045304530155465787453657474696E67 + 732E576F726457726170080000005450463007544C61796F757400095374796C + 654E616D65060D7468756D626261727374796C650A506F736974696F6E2E5805 + 00000000000080CE07400A506F736974696F6E2E590500000000000080F60740 + 0A53697A652E576964746805000000000000008003400B53697A652E48656967 + 687405000000000000008003401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F726465720228000A5452656374616E + 676C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E + 070643656E7465720A46696C6C2E436F6C6F720709784646343834383438064C + 6F636B6564090748697454657374080A53697A652E5769647468050000000000 + FFFFBF02400B53697A652E486569676874050000000000FFFFBF02401453697A + 652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207 + 09784646314331433143000A5452656374616E676C650005416C69676E070643 + 6C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D + 617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E54 + 6F70050000000000000080FF3F0D4D617267696E732E52696768740500000000 + 00000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F + 0A53697A652E5769647468050000000000FFFF9F02400B53697A652E48656967 + 6874050000000000FFFF9F02401453697A652E506C6174666F726D4465666175 + 6C74080C5374726F6B652E436F6C6F72070978464635393539353900000F5443 + 6F6C6F72416E696D6174696F6E00084475726174696F6E050000000000CDCCCC + FC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172 + 7456616C756507097846463438343834380953746F7056616C75650709784646 + 3538353835380754726967676572061049734D6F7573654F7665723D74727565 + 00000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05000000 + 0000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72 + 0A537461727456616C756507097846463538353835380953746F7056616C7565 + 07097846463438343834380754726967676572061149734D6F7573654F766572 + 3D66616C736500000000545046300A5452656374616E676C6500095374796C65 + 4E616D6506147363726F6C6C62617276747261636B7374796C650946696C6C2E + 4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C656674 + 050000000000000080FF3F0D4D617267696E732E526967687405000000000000 + 0080FF3F0A506F736974696F6E2E580500000000000000CC07400A506F736974 + 696F6E2E590500000000000080EB07400A53697A652E57696474680500000000 + 000000C803400B53697A652E486569676874050000000000FFFFF30440145369 + 7A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407 + 044E6F6E650756697369626C6508000A5452656374616E676C650005416C6967 + 6E0706436C69656E740A46696C6C2E436F6C6F72070978464634383438343806 + 4C6F636B6564090748697454657374080B4D617267696E732E546F7005000000 + 000000008000C00E4D617267696E732E426F74746F6D05000000000000008000 + C00A53697A652E57696474680500000000000000C803400B53697A652E486569 + 67687405000000000000008205401453697A652E506C6174666F726D44656661 + 756C74080C5374726F6B652E436F6C6F72070978464631433143314300000654 + 5468756D6200095374796C654E616D6506057468756D62064C6F636B6564090D + 4D617267696E732E526967687405000000000000008000400A506F736974696F + 6E2E580500000000000000A001400A506F736974696F6E2E5905000000000000 + 00A001400A53697A652E57696474680500000000000000A002400B53697A652E + 4865696768740500000000000000B804401453697A652E506C6174666F726D44 + 656661756C74080B5374796C654C6F6F6B7570060B767468756D627374796C65 + 000000545046300A5452656374616E676C6500095374796C654E616D65061473 + 63726F6C6C62617268747261636B7374796C650946696C6C2E4B696E6407044E + 6F6E650748697454657374080B4D617267696E732E546F700500000000000000 + 80FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F + 736974696F6E2E580500000000000080B407400A506F736974696F6E2E590500 + 000000000080F507400A53697A652E5769647468050000000000FFFFEF05400B + 53697A652E48656967687405000000000000009803401453697A652E506C6174 + 666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650756 + 697369626C6508000A5452656374616E676C650005416C69676E0706436C6965 + 6E740A46696C6C2E436F6C6F720709784646343834383438064C6F636B656409 + 0748697454657374080C4D617267696E732E4C65667405000000000000008000 + C00D4D617267696E732E526967687405000000000000008000C00A53697A652E + 5769647468050000000000FFFFF705400B53697A652E48656967687405000000 + 000000009803401453697A652E506C6174666F726D44656661756C74080C5374 + 726F6B652E436F6C6F720709784646314331433143000006545468756D620009 + 5374796C654E616D6506057468756D62064C6F636B6564090E4D617267696E73 + 2E426F74746F6D05000000000000008000400A506F736974696F6E2E58050000 + 00000000008001400A506F736974696F6E2E5905000000000000008001400A53 + 697A652E57696474680500000000000000C804400B53697A652E486569676874 + 0500000000000000D002401453697A652E506C6174666F726D44656661756C74 + 080B5374796C654C6F6F6B7570060B687468756D627374796C65000000545046 + 300A5452656374616E676C6500095374796C654E616D6506137363726F6C6C62 + 61726C656674627574746F6E0A46696C6C2E436F6C6F72070978464634383438 + 34380748697454657374080C4D617267696E732E4C6566740500000000000000 + 8000400B4D617267696E732E546F70050000000000000080FF3F0D4D61726769 + 6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474 + 6F6D050000000000000080FF3F0A506F736974696F6E2E580500000000000000 + CE07400A506F736974696F6E2E590500000000000000F607400A53697A652E57 + 6964746805000000000000009803400B53697A652E4865696768740500000000 + 0000009003401453697A652E506C6174666F726D44656661756C74080C537472 + 6F6B652E436F6C6F7207097846463143314331430756697369626C6508000A54 + 52656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B69 + 6E6407044E6F6E650748697454657374080C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500 + 0000000000008803400B53697A652E4865696768740500000000000000800340 + 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F + 6C6F72070978464635393539353900000F54436F6C6F72416E696D6174696F6E + 00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E61 + 6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463438 + 343834380953746F7056616C7565070978464635383538353807547269676765 + 72061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D + 6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F7065 + 7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709 + 7846463538353835380953746F7056616C756507097846463438343834380754 + 726967676572061149734D6F7573654F7665723D66616C736500000554506174 + 680005416C69676E070643656E74657209446174612E506174680A4000000005 + 000000000000000000803F00000000010000000000803F0000803F0100000000 + 0000000000003F010000000000803F000000000300000000000000000000000A + 46696C6C2E436F6C6F720708636C61426C61636B064C6F636B65640907486974 + 54657374080A53697A652E57696474680500000000000000E001400B53697A65 + 2E48656967687405000000000000008002401453697A652E506C6174666F726D + 44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000000545046 + 300A5452656374616E676C6500095374796C654E616D6506147363726F6C6C62 + 61727269676874627574746F6E0A46696C6C2E436F6C6F720709784646343834 + 3834380748697454657374080C4D617267696E732E4C65667405000000000000 + 0080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267 + 696E732E526967687405000000000000008000400E4D617267696E732E426F74 + 746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000000000 + 00CE07400A506F736974696F6E2E590500000000000000F607400A53697A652E + 576964746805000000000000008803400B53697A652E48656967687405000000 + 000000009003401453697A652E506C6174666F726D44656661756C74080C5374 + 726F6B652E436F6C6F7207097846463143314331430756697369626C6508000A + 5452656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B + 696E6407044E6F6E650748697454657374080C4D617267696E732E4C65667405 + 0000000000000080FF3F0B4D617267696E732E546F70050000000000000080FF + 3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61726769 + 6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805 + 00000000000000F002400B53697A652E48656967687405000000000000008003 + 401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43 + 6F6C6F72070978464635393539353900000F54436F6C6F72416E696D6174696F + 6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E + 616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978464634 + 38343834380953746F7056616C75650709784646353835383538075472696767 + 6572061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E69 + 6D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50726F70 + 657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507 + 097846463538353835380953746F7056616C7565070978464634383438343807 + 54726967676572061149734D6F7573654F7665723D66616C7365000005545061 + 74680005416C69676E070643656E74657209446174612E506174680A34000000 + 0400000000000000000000000000000001000000000000000000803F01000000 + 0000803F0000003F0300000000000000000000000A46696C6C2E436F6C6F7207 + 08636C61426C61636B064C6F636B6564090748697454657374080A53697A652E + 57696474680500000000000000E001400B53697A652E48656967687405000000 + 000000008002401453697A652E506C6174666F726D44656661756C74080B5374 + 726F6B652E4B696E6407044E6F6E65000000545046300A5452656374616E676C + 6500095374796C654E616D6506127363726F6C6C626172746F70627574746F6E + 0A46696C6C2E436F6C6F7207097846463438343834380748697454657374080C + 4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E + 546F7005000000000000008000400D4D617267696E732E526967687405000000 + 0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF + 3F0A506F736974696F6E2E580500000000000080CE07400A506F736974696F6E + 2E590500000000000000F607400A53697A652E57696474680500000000000000 + 8003400B53697A652E48656967687405000000000000009803401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 46463143314331430756697369626C6508000A5452656374616E676C65000541 + 6C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E6507486974 + 54657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D61 + 7267696E732E546F70050000000000000080FF3F0D4D617267696E732E526967 + 6874050000000000000080FF3F0E4D617267696E732E426F74746F6D05000000 + 0000000080FF3F0A53697A652E57696474680500000000000000E002400B5369 + 7A652E48656967687405000000000000008803401453697A652E506C6174666F + 726D44656661756C74080C5374726F6B652E436F6C6F72070978464635393539 + 353900000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E436F6C + 6F720A537461727456616C756507097846463438343834380953746F7056616C + 756507097846463538353835380754726967676572061049734D6F7573654F76 + 65723D7472756500000F54436F6C6F72416E696D6174696F6E00084475726174 + 696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C + 6C2E436F6C6F720A537461727456616C75650709784646353835383538095374 + 6F7056616C756507097846463438343834380754726967676572061149734D6F + 7573654F7665723D66616C736500000554506174680005416C69676E07064365 + 6E74657209446174612E506174680A4000000005000000000000000000000000 + 00803F010000000000803F0000803F010000000000003F000000000100000000 + 0000000000803F0300000000000000000000000A46696C6C2E436F6C6F720708 + 636C61426C61636B064C6F636B6564090748697454657374080A53697A652E57 + 6964746805000000000000008002400B53697A652E4865696768740500000000 + 000000E001401453697A652E506C6174666F726D44656661756C74080B537472 + 6F6B652E4B696E6407044E6F6E65000000545046300A5452656374616E676C65 + 00095374796C654E616D6506157363726F6C6C626172626F74746F6D62757474 + 6F6E0A46696C6C2E436F6C6F7207097846463438343834380748697454657374 + 080C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E + 732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500 + 00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000 + 8000400A506F736974696F6E2E580500000000000000CE07400A506F73697469 + 6F6E2E590500000000000000F607400A53697A652E5769647468050000000000 + 00008803400B53697A652E48656967687405000000000000008803401453697A + 652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207 + 097846463143314331430756697369626C6508000A5452656374616E676C6500 + 05416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748 + 697454657374080C4D617267696E732E4C656674050000000000000080FF3F0B + 4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E52 + 69676874050000000000000080FF3F0E4D617267696E732E426F74746F6D0500 + 00000000000080FF3F0A53697A652E57696474680500000000000000F002400B + 53697A652E4865696768740500000000000000F002401453697A652E506C6174 + 666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463539 + 3539353900000F54436F6C6F72416E696D6174696F6E00084475726174696F6E + 050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46696C6C2E43 + 6F6C6F720A537461727456616C756507097846463438343834380953746F7056 + 616C756507097846463538353835380754726967676572061049734D6F757365 + 4F7665723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572 + 6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46 + 696C6C2E436F6C6F720A537461727456616C7565070978464635383538353809 + 53746F7056616C75650709784646343834383438075472696767657206114973 + 4D6F7573654F7665723D66616C736500000554506174680005416C69676E0706 + 43656E74657209446174612E506174680A340000000400000000000000000000 + 0000000000010000000000803F00000000010000000000003F0000803F030000 + 0000000000000000000A46696C6C2E436F6C6F720708636C61426C61636B064C + 6F636B6564090748697454657374080A53697A652E5769647468050000000000 + 00008002400B53697A652E4865696768740500000000000000E001401453697A + 652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704 + 4E6F6E650000005450463007544C61796F757400095374796C654E616D65060B + 687468756D627374796C650A506F736974696F6E2E580500000000000080C307 + 400A506F736974696F6E2E590500000000000000F707400A53697A652E576964 + 7468050000000000FFFFF304400B53697A652E48656967687405000000000001 + 00E002401453697A652E506C6174666F726D44656661756C7408075669736962 + 6C6508085461624F72646572022F000A5452656374616E676C6500095374796C + 654E616D65060A6261636B67726F756E6405416C69676E0706436C69656E740A + 46696C6C2E436F6C6F720709784646343834383438064C6F636B656409074869 + 7454657374080C4D617267696E732E4C656674050000000000000080FFBF0D4D + 617267696E732E5269676874050000000000000080FFBF0A53697A652E576964 + 7468050000000000FFFFFB04400B53697A652E48656967687405000000000001 + 00E002401453697A652E506C6174666F726D44656661756C74080C5374726F6B + 652E436F6C6F720709784646314331433143000A5452656374616E676C650005 + 416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869 + 7454657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D + 617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269 + 676874050000000000000080FF3F0E4D617267696E732E426F74746F6D050000 + 000000000080FF3F0A53697A652E5769647468050000000000FFFFF304400B53 + 697A652E4865696768740500000000000100C002401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646353935 + 39353900000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05 + 0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F + 6C6F720A537461727456616C756507097846463438343834380953746F705661 + 6C756507097846463538353835380754726967676572061049734D6F7573654F + 7665723D7472756500000F54436F6C6F72416E696D6174696F6E000844757261 + 74696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A4669 + 6C6C2E436F6C6F720A537461727456616C756507097846463538353835380953 + 746F7056616C756507097846463438343834380754726967676572061149734D + 6F7573654F7665723D66616C7365000000005450463007544C61796F75740009 + 5374796C654E616D65060B767468756D627374796C650A506F736974696F6E2E + 580500000000000080CF07400A506F736974696F6E2E590500000000000000EF + 07400A53697A652E5769647468050000000000FFFFBF02400B53697A652E4865 + 696768740500000000000000BC04401453697A652E506C6174666F726D446566 + 61756C74080756697369626C6508085461624F726465720230000A5452656374 + 616E676C6500095374796C654E616D65060A6261636B67726F756E6405416C69 + 676E0706436C69656E740A46696C6C2E436F6C6F720709784646343834383438 + 064C6F636B6564090748697454657374080B4D617267696E732E546F70050000 + 000000000080FFBF0E4D617267696E732E426F74746F6D050000000000000080 + FFBF0A53697A652E5769647468050000000000FFFFBF02400B53697A652E4865 + 696768740500000000000000C404401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646314331433143000A54 + 52656374616E676C650005416C69676E0706436C69656E740946696C6C2E4B69 + 6E6407044E6F6E650748697454657374080C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500 + 00000000FFFF9F02400B53697A652E4865696768740500000000000000BC0440 + 1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F + 6C6F72070978464635393539353900000F54436F6C6F72416E696D6174696F6E + 00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E61 + 6D65060A46696C6C2E436F6C6F720A537461727456616C756507097846463438 + 343834380953746F7056616C7565070978464635383538353807547269676765 + 72061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D + 6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F7065 + 7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709 + 7846463538353835380953746F7056616C756507097846463438343834380754 + 726967676572061149734D6F7573654F7665723D66616C736500000000545046 + 3007544C61796F757400095374796C654E616D65060D636F6D626F626F787374 + 796C650A506F736974696F6E2E580500000000000000BC07400A506F73697469 + 6F6E2E590500000000000000F407400A53697A652E5769647468050000000000 + 0000B205400B53697A652E4865696768740500000000000000D003401453697A + 652E506C6174666F726D44656661756C74080756697369626C6508085461624F + 726465720231000A5452656374616E676C6500095374796C654E616D65060A62 + 61636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B + 696E6407084772616469656E741446696C6C2E4772616469656E742E506F696E + 74730E0105436F6C6F720709784646353835383538064F666673657405000000 + 00000000000000000105436F6C6F720709784646353135313531064F66667365 + 74050000000000A01BF3FD3F000105436F6C6F72070978464634393439343906 + 4F6666736574050000000000000080FF3F0000064C6F636B6564090748697454 + 657374080C4D617267696E732E4C65667405000000000000008000400B4D6172 + 67696E732E546F7005000000000000008000400D4D617267696E732E52696768 + 7405000000000000008000400E4D617267696E732E426F74746F6D0500000000 + 0000008000400A53697A652E57696474680500000000000000AA05400B53697A + 652E4865696768740500000000000000B003401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463641364136 + 41000A5452656374616E676C650005416C69676E0706436C69656E740946696C + 6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C65 + 667405000000000000008000C00B4D617267696E732E546F7005000000000000 + 008000C00D4D617267696E732E526967687405000000000000008000C00E4D61 + 7267696E732E426F74746F6D05000000000000008000C00A53697A652E576964 + 74680500000000000000B205400B53697A652E48656967687405000000000000 + 00D003401453697A652E506C6174666F726D44656661756C74080C5374726F6B + 652E436F6C6F720709784646353135313531000A5452656374616E676C650005 + 416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E65074869 + 7454657374080C4D617267696E732E4C656674050000000000000080FF3F0B4D + 617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269 + 676874050000000000000080FF3F0E4D617267696E732E426F74746F6D050000 + 000000000080FF3F0A53697A652E57696474680500000000000000AE05400B53 + 697A652E4865696768740500000000000000C003401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646314331 + 4331430000000007544C61796F75740005416C69676E07055269676874064C6F + 636B6564090A506F736974696F6E2E5805000000000000008E05400A53697A65 + 2E576964746805000000000000009003400B53697A652E486569676874050000 + 0000000000D003401453697A652E506C6174666F726D44656661756C74080005 + 54506174680005416C69676E070643656E74657209446174612E506174680A64 + 0000000800000000000000E5D01C414A0CF241010000005839EB41D7A36E4101 + 00000054E35B42AC1C344201000000BE5F9F425EBA774101000000B448C842A8 + C6EF410100000054E35B424CB7954201000000E5D01C414A0CF2410300000000 + 000000000000000A46696C6C2E436F6C6F720709784646434143414341064C6F + 636B6564090748697454657374080A53697A652E576964746805000000000000 + 00A002400B53697A652E4865696768740500000000000000E001401453697A65 + 2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E + 6F6E650000000C5442727573684F626A65637400095374796C654E616D65060A + 666F726567726F756E640B42727573682E436F6C6F7207097846464536453645 + 36000007544C61796F757400095374796C654E616D650607636F6E74656E7405 + 416C69676E0708436F6E74656E7473064C6F636B6564090C4D617267696E732E + 4C65667405000000000000008000400B4D617267696E732E546F700500000000 + 0000008000400D4D617267696E732E52696768740500000000000000B803400E + 4D617267696E732E426F74746F6D05000000000000008000400A53697A652E57 + 6964746805000000000000008005400B53697A652E4865696768740500000000 + 000000B003401453697A652E506C6174666F726D44656661756C740800000B54 + 476C6F774566666563740008536F66746E6573730500000000009A9999FD3F09 + 476C6F77436F6C6F720709784646363543384530074F70616369747905000000 + 0000000080FF3F0754726967676572060E4973466F63757365643D7472756507 + 456E61626C6564080000005450463007544C61796F757400095374796C654E61 + 6D65060E636F6D626F656469747374796C650A506F736974696F6E2E58050000 + 0000000000BC07400A506F736974696F6E2E590500000000000000F407400A53 + 697A652E57696474680500000000000000B205400B53697A652E486569676874 + 0500000000000000D003401453697A652E506C6174666F726D44656661756C74 + 080756697369626C6508085461624F726465720232000A5452656374616E676C + 6500095374796C654E616D65060A6261636B67726F756E6405416C69676E0708 + 436F6E74656E74730946696C6C2E4B696E6407084772616469656E741446696C + 6C2E4772616469656E742E506F696E74730E0105436F6C6F7207097846463538 + 35383538064F66667365740500000000000000000000000105436F6C6F720709 + 784646353135313531064F6666736574050000000000A01BF3FD3F000105436F + 6C6F720709784646343934393439064F6666736574050000000000000080FF3F + 0000064C6F636B6564090748697454657374080C4D617267696E732E4C656674 + 05000000000000008000400B4D617267696E732E546F70050000000000000080 + 00400D4D617267696E732E526967687405000000000000008000400E4D617267 + 696E732E426F74746F6D05000000000000008000400A53697A652E5769647468 + 0500000000000000AA05400B53697A652E4865696768740500000000000000B0 + 03401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E + 436F6C6F720709784646364136413641000A5452656374616E676C650005416C + 69676E0706436C69656E740946696C6C2E4B696E6407044E6F6E650748697454 + 657374080C4D617267696E732E4C65667405000000000000008000C00B4D6172 + 67696E732E546F7005000000000000008000C00D4D617267696E732E52696768 + 7405000000000000008000C00E4D617267696E732E426F74746F6D0500000000 + 0000008000C00A53697A652E57696474680500000000000000B205400B53697A + 652E4865696768740500000000000000D003401453697A652E506C6174666F72 + 6D44656661756C74080C5374726F6B652E436F6C6F7207097846463531353135 + 31000A5452656374616E676C650005416C69676E0706436C69656E740946696C + 6C2E4B696E6407044E6F6E650748697454657374080C4D617267696E732E4C65 + 6674050000000000000080FF3F0B4D617267696E732E546F7005000000000000 + 0080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D61 + 7267696E732E426F74746F6D050000000000000080FF3F0A53697A652E576964 + 74680500000000000000AE05400B53697A652E48656967687405000000000000 + 00C003401453697A652E506C6174666F726D44656661756C74080C5374726F6B + 652E436F6C6F7207097846463143314331430000000007544C61796F75740009 + 5374796C654E616D6506056172726F7705416C69676E07055269676874064C6F + 636B6564090A506F736974696F6E2E5805000000000000008E05400A53697A65 + 2E576964746805000000000000009003400B53697A652E486569676874050000 + 0000000000D003401453697A652E506C6174666F726D44656661756C74080005 + 54506174680005416C69676E070643656E74657209446174612E506174680A64 + 0000000800000000000000E5D01C414A0CF241010000005839EB41D7A36E4101 + 00000054E35B42AC1C344201000000BE5F9F425EBA774101000000B448C842A8 + C6EF410100000054E35B424CB7954201000000E5D01C414A0CF2410300000000 + 000000000000000A46696C6C2E436F6C6F720709784646434143414341064C6F + 636B6564090748697454657374080A53697A652E576964746805000000000000 + 00A002400B53697A652E4865696768740500000000000000E001401453697A65 + 2E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E + 6F6E650000000C5442727573684F626A65637400095374796C654E616D65060A + 666F726567726F756E640B42727573682E436F6C6F7207097846464541454145 + 4100000C5442727573684F626A65637400095374796C654E616D65060973656C + 656374696F6E0A42727573682E4B696E6407084772616469656E741542727573 + 682E4772616469656E742E506F696E74730E0105436F6C6F7207097838303242 + 37393843064F66667365740500000000000000000000000105436F6C6F720709 + 783830324236453746064F666673657405000000000012A2F8FD3F000105436F + 6C6F720709783830324236343732064F6666736574050000000000000080FF3F + 0000000007544C61796F757400095374796C654E616D650607636F6E74656E74 + 05416C69676E0708436F6E74656E7473064C6F636B6564090C4D617267696E73 + 2E4C65667405000000000000008001400B4D617267696E732E546F7005000000 + 00000000C000400D4D617267696E732E52696768740500000000000000B80340 + 0E4D617267696E732E426F74746F6D0500000000000000C000400A53697A652E + 57696474680500000000000000F804400B53697A652E48656967687405000000 + 00000000A003401453697A652E506C6174666F726D44656661756C740800000B + 54476C6F774566666563740008536F66746E6573730500000000009A9999FD3F + 09476C6F77436F6C6F720709784646363543384530074F706163697479050000 + 000000000080FF3F0754726967676572060E4973466F63757365643D74727565 + 07456E61626C656408000000545046300A5452656374616E676C650009537479 + 6C654E616D65060A747261636B7374796C650A46696C6C2E436F6C6F72070978 + 46463438343834380748697454657374080A506F736974696F6E2E5805000000 + 00000080B407400A506F736974696F6E2E590500000000000000F607400A5369 + 7A652E5769647468050000000000FFFFEF05400B53697A652E48656967687405 + 000000000000009803401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F7207097846463143314331430756697369626C65 + 08000A5452656374616E676C650005416C69676E0706436C69656E740946696C + 6C2E4B696E6407044E6F6E65064C6F636B6564090748697454657374080C4D61 + 7267696E732E4C65667405000000000000008000400B4D617267696E732E546F + 7005000000000000008000400D4D617267696E732E5269676874050000000000 + 00008000400E4D617267696E732E426F74746F6D05000000000000008000400A + 53697A652E5769647468050000000000FFFFE705400B53697A652E4865696768 + 740500000000000000F002401453697A652E506C6174666F726D44656661756C + 74080B5374726F6B652E4B696E6407044E6F6E65075852616469757305000000 + 00000000E0014007595261646975730500000000000000E00140000006545468 + 756D6200095374796C654E616D6506057468756D62064C6F636B6564090C4D61 + 7267696E732E4C6566740500000000000000C000400B4D617267696E732E546F + 7005000000000000008000400D4D617267696E732E5269676874050000000000 + 0000C000400E4D617267696E732E426F74746F6D05000000000000008000400A + 506F736974696F6E2E5805000000000000008001400A506F736974696F6E2E59 + 05000000000000008001400A53697A652E57696474680500000000000000CC04 + 400B53697A652E48656967687405000000000000008003401453697A652E506C + 6174666F726D44656661756C74080B5374796C654C6F6F6B7570060B68746875 + 6D627374796C650000005450463007544C61796F757400095374796C654E616D + 65060C6C697374626F787374796C650A506F736974696F6E2E58050000000000 + 0080B507400A506F736974696F6E2E590500000000000000DA07400A53697A65 + 2E5769647468050000000000FFFFE905400B53697A652E486569676874050000 + 00000000008306401453697A652E506C6174666F726D44656661756C74080756 + 697369626C6508085461624F726465720234000A5452656374616E676C650009 + 5374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E + 74656E74730A46696C6C2E436F6C6F720709784646343834383438064C6F636B + 6564090748697454657374080C50616464696E672E4C65667405000000000000 + 0080FF3F0B50616464696E672E546F70050000000000000080FF3F0D50616464 + 696E672E5269676874050000000000000080FF3F0E50616464696E672E426F74 + 746F6D050000000000000080FF3F0A53697A652E5769647468050000000000FF + FFE905400B53697A652E48656967687405000000000000008306401453697A65 + 2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709 + 784646314331433143000A5452656374616E676C650005416C69676E0706436C + 69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080A5369 + 7A652E5769647468050000000000FFFFE505400B53697A652E48656967687405 + 000000000000008106401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F720709784646353935393539000007544C61796F + 75740005416C69676E0706436C69656E740A53697A652E576964746805000000 + 0000FFFFE505400B53697A652E48656967687405000000000000008106401453 + 697A652E506C6174666F726D44656661756C74080007544C61796F7574000953 + 74796C654E616D650607636F6E74656E7405416C69676E0706436C69656E740C + 436C69704368696C6472656E090C4D617267696E732E4C656674050000000000 + 000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D6172 + 67696E732E5269676874050000000000000080FF3F0E4D617267696E732E426F + 74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000 + FFFFC305400B53697A652E4865696768740500000000000000E005401453697A + 652E506C6174666F726D44656661756C7408000A5452656374616E676C650009 + 5374796C654E616D65060973656C656374696F6E0946696C6C2E4B696E640708 + 4772616469656E741446696C6C2E4772616469656E742E506F696E74730E0105 + 436F6C6F720709783830324237393843064F6666736574050000000000000000 + 0000000105436F6C6F720709783830324236453746064F666673657405000000 + 000012A2F8FD3F000105436F6C6F720709783830324236343732064F66667365 + 74050000000000000080FF3F00000748697454657374080A53697A652E576964 + 74680500000000000000C804400B53697A652E48656967687405000000000000 + 00C804401453697A652E506C6174666F726D44656661756C74080B5374726F6B + 652E4B696E6407044E6F6E6500000A5452656374616E676C6500095374796C65 + 4E616D650610666F637573656473656C656374696F6E0946696C6C2E4B696E64 + 07084772616469656E741446696C6C2E4772616469656E742E506F696E74730E + 0105436F6C6F720709783830324237393843064F666673657405000000000000 + 00000000000105436F6C6F720709783830324236453746064F66667365740500 + 0000000012A2F8FD3F000105436F6C6F720709783830324236343732064F6666 + 736574050000000000000080FF3F00000748697454657374080A53697A652E57 + 696474680500000000000000C804400B53697A652E4865696768740500000000 + 000000C804401453697A652E506C6174666F726D44656661756C74080B537472 + 6F6B652E446173680703446F740000000A545363726F6C6C4261720009537479 + 6C654E616D65060A767363726F6C6C62617205416C69676E070552696768740B + 536D616C6C4368616E676505000000000000000000000B4F7269656E74617469 + 6F6E0708566572746963616C0A506F736974696F6E2E58050000000000FFFFC7 + 05400A53697A652E57696474680500000000000000F002400B53697A652E4865 + 696768740500000000000000E405401453697A652E506C6174666F726D446566 + 61756C740800000A545363726F6C6C42617200095374796C654E616D65060A68 + 7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C436861 + 6E676505000000000000000000000B4F7269656E746174696F6E070A486F7269 + 7A6F6E74616C0A506F736974696F6E2E590500000000000000E405400A53697A + 652E5769647468050000000000FFFFE505400B53697A652E4865696768740500 + 000000000000F002401453697A652E506C6174666F726D44656661756C740800 + 000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F7673 + 6D616C6C7363726F6C6C62617205416C69676E070552696768740B536D616C6C + 4368616E676505000000000000000000000B4F7269656E746174696F6E070856 + 6572746963616C0B4D617267696E732E546F70050000000000000080FF3F0D4D + 617267696E732E5269676874050000000000000080FF3F0E4D617267696E732E + 426F74746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000 + 00000000C605400A506F736974696F6E2E5905000000000000008000400A5369 + 7A652E576964746805000000000000008002400B53697A652E48656967687405 + 000000000000008002401453697A652E506C6174666F726D44656661756C7408 + 0756697369626C650800000F54536D616C6C5363726F6C6C4261720009537479 + 6C654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E070642 + 6F74746F6D0B536D616C6C4368616E676505000000000000000000000B4F7269 + 656E746174696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C6566 + 74050000000000000080FF3F0D4D617267696E732E5269676874050000000000 + 000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A + 506F736974696F6E2E5805000000000000008000400A506F736974696F6E2E59 + 0500000000000000E205400A53697A652E576964746805000000000000009606 + 400B53697A652E48656967687405000000000000008002401453697A652E506C + 6174666F726D44656661756C74080756697369626C6508000000000B54476C6F + 774566666563740008536F66746E6573730500000000009A9999FD3F09476C6F + 77436F6C6F720709784646363543384530074F70616369747905000000000000 + 0080FF3F0754726967676572060E4973466F63757365643D7472756507456E61 + 626C6564080000005450463007544C61796F757400095374796C654E616D6506 + 126C697374626F78706C61696E6865616465720A506F736974696F6E2E580500 + 000000000000BC07400A506F736974696F6E2E590500000000000080F407400A + 53697A652E57696474680500000000000000B605400B53697A652E4865696768 + 740500000000000000C003401453697A652E506C6174666F726D44656661756C + 74080756697369626C6508085461624F726465720235000A5452656374616E67 + 6C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E07 + 08436F6E74656E74730946696C6C2E4B696E6407084772616469656E74144669 + 6C6C2E4772616469656E742E506F696E74730E0105436F6C6F72070978464635 + 3835383538064F66667365740500000000000000000000000105436F6C6F7207 + 09784646353135313531064F6666736574050000000000A01BF3FD3F00010543 + 6F6C6F720709784646343934393439064F6666736574050000000000000080FF + 3F0000064C6F636B6564090748697454657374080A53697A652E576964746805 + 00000000000000B605400B53697A652E4865696768740500000000000000C003 + 401453697A652E506C6174666F726D44656661756C74080C5374726F6B652E43 + 6F6C6F720709784646314331433143001054496E6E6572476C6F774566666563 + 740008536F66746E657373050000000000CDCCCCFD3F09476C6F77436F6C6F72 + 0709784646344634383438074F7061636974790500000000006666E6FE3F0754 + 726967676572060E4973507265737365643D7472756507456E61626C65640800 + 000005545465787400095374796C654E616D6506047465787405416C69676E07 + 06436C69656E74064C6F636B6564090748697454657374080C4D617267696E73 + 2E4C6566740500000000000000A001400B4D617267696E732E546F7005000000 + 000000008000400D4D617267696E732E52696768740500000000000000A00140 + 0E4D617267696E732E426F74746F6D05000000000000008000400A53697A652E + 57696474680500000000000000A205400B53697A652E48656967687405000000 + 00000000A003401453697A652E506C6174666F726D44656661756C7408045465 + 78740606627574746F6E165465787453657474696E67732E466F6E74436F6C6F + 720708636C6157686974650000005450463007544C61796F757400095374796C + 654E616D65060D6C697374626F78666F6F7465720A506F736974696F6E2E5805 + 00000000000000BC07400A506F736974696F6E2E590500000000000080F40740 + 0A53697A652E57696474680500000000000000B605400B53697A652E48656967 + 68740500000000000000C003401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F726465720236000554546578740009 + 5374796C654E616D6506047465787405416C69676E0706436C69656E74064C6F + 636B6564090748697454657374080C4D617267696E732E4C6566740500000000 + 000000A001400B4D617267696E732E546F7005000000000000008000400D4D61 + 7267696E732E52696768740500000000000000A001400E4D617267696E732E42 + 6F74746F6D05000000000000008000400A53697A652E57696474680500000000 + 000000A205400B53697A652E4865696768740500000000000000A00340145369 + 7A652E506C6174666F726D44656661756C740804546578740606627574746F6E + 165465787453657474696E67732E466F6E74436F6C6F720708636C6157686974 + 650000005450463007544C61796F757400095374796C654E616D650617747261 + 6E73706172656E746C697374626F787374796C650A506F736974696F6E2E5805 + 00000000000080B507400A506F736974696F6E2E590500000000000000DA0740 + 0A53697A652E5769647468050000000000FFFFE905400B53697A652E48656967 + 687405000000000000008306401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F7264657202370007544C61796F7574 + 00095374796C654E616D65060A6261636B67726F756E6405416C69676E070843 + 6F6E74656E7473064C6F636B6564090A53697A652E5769647468050000000000 + FFFFE905400B53697A652E48656967687405000000000000008306401453697A + 652E506C6174666F726D44656661756C74080007544C61796F75740005416C69 + 676E0706436C69656E740A53697A652E5769647468050000000000FFFFE90540 + 0B53697A652E48656967687405000000000000008306401453697A652E506C61 + 74666F726D44656661756C74080007544C61796F757400095374796C654E616D + 650607636F6E74656E7405416C69676E0706436C69656E740C436C6970436869 + 6C6472656E090C4D617267696E732E4C656674050000000000000080FF3F0B4D + 617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269 + 676874050000000000000080FF3F0E4D617267696E732E426F74746F6D050000 + 000000000080FF3F0A53697A652E5769647468050000000000FFFFC705400B53 + 697A652E4865696768740500000000000000E405401453697A652E506C617466 + 6F726D44656661756C7408000A5452656374616E676C6500095374796C654E61 + 6D65060973656C656374696F6E0946696C6C2E4B696E6407084772616469656E + 741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F720709 + 783830324237393843064F66667365740500000000000000000000000105436F + 6C6F720709783830324236453746064F666673657405000000000012A2F8FD3F + 000105436F6C6F720709783830324236343732064F6666736574050000000000 + 000080FF3F00000748697454657374080A53697A652E57696474680500000000 + 000000C804400B53697A652E4865696768740500000000000000C80440145369 + 7A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407 + 044E6F6E6500000A5452656374616E676C6500095374796C654E616D65061066 + 6F637573656473656C656374696F6E0946696C6C2E4B696E6407084772616469 + 656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F72 + 0709783830324237393843064F66667365740500000000000000000000000105 + 436F6C6F720709783830324236453746064F666673657405000000000012A2F8 + FD3F000105436F6C6F720709783830324236343732064F666673657405000000 + 0000000080FF3F00000748697454657374080A53697A652E5769647468050000 + 0000000000C804400B53697A652E4865696768740500000000000000C8044014 + 53697A652E506C6174666F726D44656661756C74080B5374726F6B652E446173 + 680703446F740000000A545363726F6C6C42617200095374796C654E616D6506 + 0A767363726F6C6C62617205416C69676E070552696768740B536D616C6C4368 + 616E676505000000000000000000000B4F7269656E746174696F6E0708566572 + 746963616C0A506F736974696F6E2E58050000000000FFFFCB05400A53697A65 + 2E57696474680500000000000000F002400B53697A652E486569676874050000 + 0000000000E805401453697A652E506C6174666F726D44656661756C74080000 + 0A545363726F6C6C42617200095374796C654E616D65060A687363726F6C6C62 + 617205416C69676E0706426F74746F6D0B536D616C6C4368616E676505000000 + 000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A + 506F736974696F6E2E590500000000000000E805400A53697A652E5769647468 + 050000000000FFFFE905400B53697A652E4865696768740500000000000000F0 + 02401453697A652E506C6174666F726D44656661756C740800000F54536D616C + 6C5363726F6C6C42617200095374796C654E616D65060F76736D616C6C736372 + 6F6C6C62617205416C69676E070552696768740B536D616C6C4368616E676505 + 000000000000000000000B4F7269656E746174696F6E0708566572746963616C + 0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E732E + 5269676874050000000000000080FF3F0E4D617267696E732E426F74746F6D05 + 0000000000000080FF3F0A506F736974696F6E2E580500000000000000C60540 + 0A506F736974696F6E2E5905000000000000008000400A53697A652E57696474 + 6805000000000000008002400B53697A652E4865696768740500000000000000 + 8002401453697A652E506C6174666F726D44656661756C74080756697369626C + 650800000F54536D616C6C5363726F6C6C42617200095374796C654E616D6506 + 0F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B53 + 6D616C6C4368616E676505000000000000000000000B4F7269656E746174696F + 6E070A486F72697A6F6E74616C0C4D617267696E732E4C656674050000000000 + 000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F0E4D + 617267696E732E426F74746F6D050000000000000080FF3F0A506F736974696F + 6E2E5805000000000000008000400A506F736974696F6E2E5905000000000000 + 00E205400A53697A652E576964746805000000000000009606400B53697A652E + 48656967687405000000000000008002401453697A652E506C6174666F726D44 + 656661756C74080756697369626C65080000000000545046300A545265637461 + 6E676C6500095374796C654E616D6506167472616E73706172656E7462757474 + 6F6E7374796C650A46696C6C2E436F6C6F720709783030383038303830074869 + 7454657374080A506F736974696F6E2E580500000000000080CE07400A506F73 + 6974696F6E2E590500000000000080F607400A53697A652E5769647468050000 + 0000000000F002400B53697A652E4865696768740500000000000000F0024014 + 53697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E + 6407044E6F6E650756697369626C6508000F54436F6C6F72416E696D6174696F + 6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E + 616D65060A46696C6C2E436F6C6F720A537461727456616C7565070978303038 + 30383038300953746F7056616C75650709784146383038303830075472696767 + 6572061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E69 + 6D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F70 + 657274794E616D65060A46696C6C2E636F6C6F720A537461727456616C756507 + 097841463830383038300953746F7056616C7565070978303038303830383007 + 54726967676572061149734D6F7573654F7665723D66616C736500000F54466C + 6F6174416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB + 3F0C50726F70657274794E616D65060E506172656E742E4F7061636974790A53 + 7461727456616C7565050000000000000080FF3F0953746F7056616C75650500 + 00000000000080FE3F0754726967676572061049734D6F7573654F7665723D74 + 72756500000F54466C6F6174416E696D6174696F6E00084475726174696F6E05 + 0000000000CDCCCCFB3F0C50726F70657274794E616D65060E506172656E742E + 4F7061636974790A537461727456616C7565050000000000000080FE3F095374 + 6F7056616C7565050000000000000080FF3F0754726967676572061149734D6F + 7573654F7665723D66616C7365000000545046300854456C6C69707365000953 + 74796C654E616D65061C7472616E73706172656E74636972636C65627574746F + 6E7374796C650A46696C6C2E436F6C6F72070978303038303830383007486974 + 54657374080A506F736974696F6E2E580500000000000080CE07400A506F7369 + 74696F6E2E590500000000000080F607400A53697A652E576964746805000000 + 00000000F002400B53697A652E4865696768740500000000000000F002401453 + 697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64 + 07044E6F6E650756697369626C6508000F54436F6C6F72416E696D6174696F6E + 00084475726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E61 + 6D65060A46696C6C2E436F6C6F720A537461727456616C756507097830303830 + 383038300953746F7056616C7565070978414638303830383007547269676765 + 72061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E696D + 6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F7065 + 7274794E616D65060A46696C6C2E636F6C6F720A537461727456616C75650709 + 7841463830383038300953746F7056616C756507097830303830383038300754 + 726967676572061149734D6F7573654F7665723D66616C736500000F54466C6F + 6174416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F + 0C50726F70657274794E616D65060E506172656E742E4F7061636974790A5374 + 61727456616C7565050000000000000080FF3F0953746F7056616C7565050000 + 000000000080FE3F0754726967676572061049734D6F7573654F7665723D7472 + 756500000F54466C6F6174416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFB3F0C50726F70657274794E616D65060E506172656E742E4F + 7061636974790A537461727456616C7565050000000000000080FE3F0953746F + 7056616C7565050000000000000080FF3F0754726967676572061149734D6F75 + 73654F7665723D66616C73650000005450463007544C61796F75740009537479 + 6C654E616D6506106C697374626F786974656D7374796C650A506F736974696F + 6E2E580500000000000080BC07400A506F736974696F6E2E5905000000000000 + 80F407400A53697A652E57696474680500000000000000B005400B53697A652E + 4865696768740500000000000000C003401453697A652E506C6174666F726D44 + 656661756C74080756697369626C6508085461624F72646572023A000654476C + 79706800095374796C654E616D65060A676C7970687374796C650C4D61726769 + 6E732E4C65667405000000000000008000400B4D617267696E732E546F700500 + 00000000000080FF3F0D4D617267696E732E5269676874050000000000000080 + 00400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C69 + 676E07044C6566740A53697A652E576964746805000000000000008003400B53 + 697A652E48656967687405000000000000008003401453697A652E506C617466 + 6F726D44656661756C7408000005545465787400095374796C654E616D650604 + 7465787405416C69676E0706436C69656E740748697454657374080C4D617267 + 696E732E4C6566740500000000000000C000400B4D617267696E732E546F7005 + 0000000000000080FF3F0D4D617267696E732E52696768740500000000000000 + C000400E4D617267696E732E426F74746F6D050000000000000080FF3F0A5369 + 7A652E57696474680500000000000000A405400B53697A652E48656967687405 + 00000000000000B003401453697A652E506C6174666F726D44656661756C7408 + 165465787453657474696E67732E466F6E74436F6C6F72070978464645384538 + 4538155465787453657474696E67732E576F7264577261700816546578745365 + 7474696E67732E486F727A416C69676E07074C656164696E6700000954436865 + 636B426F7800095374796C654E616D650605636865636B05416C69676E07084D + 6F73744C6566740843616E466F637573081244697361626C65466F6375734566 + 66656374090A53697A652E57696474680500000000000000A003400B53697A65 + 2E4865696768740500000000000000C003401453697A652E506C6174666F726D + 44656661756C74080756697369626C65080000005450463007544C61796F7574 + 00095374796C654E616D650615636F6C6F726C697374626F786974656D737479 + 6C650A506F736974696F6E2E580500000000000080BC07400A506F736974696F + 6E2E590500000000000080F407400A53697A652E576964746805000000000000 + 00B005400B53697A652E4865696768740500000000000000C003401453697A65 + 2E506C6174666F726D44656661756C74080756697369626C6508085461624F72 + 646572023B000954436865636B426F7800095374796C654E616D650605636865 + 636B05416C69676E07044C6566740843616E466F637573081244697361626C65 + 466F637573456666656374090A53697A652E57696474680500000000000000A0 + 03400B53697A652E4865696768740500000000000000C003401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C650800000A5452656374 + 616E676C6500095374796C654E616D650605636F6C6F7205416C69676E07044C + 656674064C6F636B6564090748697454657374080C4D617267696E732E4C6566 + 7405000000000000008000400B4D617267696E732E546F700500000000000000 + 8000400D4D617267696E732E526967687405000000000000008000400E4D6172 + 67696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E + 5805000000000000008000400A506F736974696F6E2E59050000000000000080 + 00400A53697A652E576964746805000000000000008003400B53697A652E4865 + 696768740500000000000000A003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646364136413641000005 + 545465787400095374796C654E616D6506047465787405416C69676E0706436C + 69656E740748697454657374080C4D617267696E732E4C656674050000000000 + 0000C000400B4D617267696E732E546F70050000000000000080FF3F0D4D6172 + 67696E732E52696768740500000000000000C000400E4D617267696E732E426F + 74746F6D050000000000000080FF3F0A53697A652E5769647468050000000000 + 0000F804400B53697A652E4865696768740500000000000000B003401453697A + 652E506C6174666F726D44656661756C74080454657874060454657874165465 + 787453657474696E67732E466F6E74436F6C6F72070978464645384538453815 + 5465787453657474696E67732E576F7264577261700816546578745365747469 + 6E67732E486F727A416C69676E07074C656164696E670000005450463007544C + 61796F757400095374796C654E616D65060E7363726F6C6C6261727374796C65 + 0A506F736974696F6E2E580500000000000080A607400A506F736974696F6E2E + 590500000000000000ED07400A53697A652E57696474680500000000000000B0 + 06400B53697A652E4865696768740500000000000000D404401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C6508085461624F726465 + 72023C000A5452656374616E676C6500095374796C654E616D65060A6261636B + 67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E64 + 07044E6F6E65064C6F636B6564090748697454657374080A53697A652E576964 + 74680500000000000000B006400B53697A652E48656967687405000000000000 + 00D404401453697A652E506C6174666F726D44656661756C74080B5374726F6B + 652E4B696E6407044E6F6E6500000C545370656564427574746F6E0009537479 + 6C654E616D65060A6C656674627574746F6E05416C69676E07044C656674064C + 6F636B6564090A506F736974696F6E2E5905000000000000009003400A53697A + 652E576964746805000000000000009003400B53697A652E4865696768740500 + 0000000000008803401453697A652E506C6174666F726D44656661756C74080B + 5374796C654C6F6F6B757006137363726F6C6C6261726C656674627574746F6E + 00000654547261636B00095374796C654E616D65060668747261636B05416C69 + 676E0706436C69656E74064C6F636B656409034D6178050000000000000080FF + 3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A652E57 + 6964746805000000000000008C06400B53697A652E4865696768740500000000 + 0000008803401453697A652E506C6174666F726D44656661756C74080B537479 + 6C654C6F6F6B757006147363726F6C6C62617268747261636B7374796C650C56 + 696577706F727453697A65050000000000CDCCCCFB3F00000C54537065656442 + 7574746F6E00095374796C654E616D65060B7269676874627574746F6E05416C + 69676E07055269676874064C6F636B6564090A506F736974696F6E2E58050000 + 00000000009E06400A506F736974696F6E2E5905000000000000009003400A53 + 697A652E576964746805000000000000009003400B53697A652E486569676874 + 05000000000000008803401453697A652E506C6174666F726D44656661756C74 + 080B5374796C654C6F6F6B757006147363726F6C6C6261727269676874627574 + 746F6E00000654547261636B00095374796C654E616D65060676747261636B05 + 416C69676E0706436C69656E74064C6F636B656409034D617805000000000000 + 0080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A + 652E576964746805000000000000008C06400B53697A652E4865696768740500 + 0000000000008803401453697A652E506C6174666F726D44656661756C74080B + 5374796C654C6F6F6B757006147363726F6C6C62617276747261636B7374796C + 650C56696577706F727453697A65050000000000CDCCCCFB3F00000C54537065 + 6564427574746F6E00095374796C654E616D650609746F70627574746F6E0541 + 6C69676E0703546F70064C6F636B6564090A53697A652E576964746805000000 + 00000000B006400B53697A652E48656967687405000000000000009003401453 + 697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570 + 06127363726F6C6C626172746F70627574746F6E00000C545370656564427574 + 746F6E00095374796C654E616D65060C626F74746F6D627574746F6E05416C69 + 676E0706426F74746F6D064C6F636B6564090A506F736974696F6E2E59050000 + 00000000008C04400A53697A652E57696474680500000000000000B006400B53 + 697A652E48656967687405000000000000009003401453697A652E506C617466 + 6F726D44656661756C74080B5374796C654C6F6F6B757006157363726F6C6C62 + 6172626F74746F6D627574746F6E000000545046300A5452656374616E676C65 + 00095374796C654E616D650619736D616C6C7363726F6C6C6261727674726163 + 6B7374796C650946696C6C2E4B696E6407044E6F6E650748697454657374080A + 506F736974696F6E2E580500000000000000CC07400A506F736974696F6E2E59 + 0500000000000080EB07400A53697A652E57696474680500000000000000C803 + 400B53697A652E486569676874050000000000FFFFF304401453697A652E506C + 6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65 + 0756697369626C6508000A5452656374616E676C650005416C69676E0706436C + 69656E740A46696C6C2E436F6C6F720709784646343834383438064C6F636B65 + 64090748697454657374080A53697A652E57696474680500000000000000C803 + 400B53697A652E486569676874050000000000FFFFF304401453697A652E506C + 6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709784646 + 314331433143000006545468756D6200095374796C654E616D6506057468756D + 62064C6F636B6564090B4D617267696E732E546F70050000000000000080FF3F + 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974 + 696F6E2E580500000000000000A001400A506F736974696F6E2E590500000000 + 000000A001400A53697A652E57696474680500000000000000A002400B53697A + 652E4865696768740500000000000000B804401453697A652E506C6174666F72 + 6D44656661756C74080B5374796C654C6F6F6B7570060B767468756D62737479 + 6C65000000545046300A5452656374616E676C6500095374796C654E616D6506 + 19736D616C6C7363726F6C6C62617268747261636B7374796C650946696C6C2E + 4B696E6407044E6F6E650748697454657374080A506F736974696F6E2E580500 + 000000000080B407400A506F736974696F6E2E590500000000000000F607400A + 53697A652E5769647468050000000000FFFFEF05400B53697A652E4865696768 + 7405000000000000009803401453697A652E506C6174666F726D44656661756C + 74080B5374726F6B652E4B696E6407044E6F6E650756697369626C6508000A54 + 52656374616E676C650005416C69676E0706436C69656E740A46696C6C2E436F + 6C6F720709784646343834383438064C6F636B6564090748697454657374080A + 53697A652E5769647468050000000000FFFFEF05400B53697A652E4865696768 + 7405000000000000009803401453697A652E506C6174666F726D44656661756C + 74080C5374726F6B652E436F6C6F720709784646314331433143000006545468 + 756D6200095374796C654E616D6506057468756D62064C6F636B6564090C4D61 + 7267696E732E4C656674050000000000000080FF3F0D4D617267696E732E5269 + 676874050000000000000080FF3F0A506F736974696F6E2E5805000000000000 + 008001400A506F736974696F6E2E5905000000000000008001400A53697A652E + 57696474680500000000000000C804400B53697A652E48656967687405000000 + 00000000D002401453697A652E506C6174666F726D44656661756C74080B5374 + 796C654C6F6F6B7570060B687468756D627374796C650000005450463007544C + 61796F757400095374796C654E616D650613736D616C6C7363726F6C6C626172 + 7374796C650A506F736974696F6E2E580500000000000080A607400A506F7369 + 74696F6E2E590500000000000000ED07400A53697A652E576964746805000000 + 00000000B006400B53697A652E4865696768740500000000000000D404401453 + 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 + 624F72646572023F000654547261636B00095374796C654E616D650606687472 + 61636B05416C69676E0706436C69656E74064C6F636B656409034D6178050000 + 000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C + 0A53697A652E57696474680500000000000000B006400B53697A652E48656967 + 68740500000000000000D404401453697A652E506C6174666F726D4465666175 + 6C74080B5374796C654C6F6F6B75700619736D616C6C7363726F6C6C62617268 + 747261636B7374796C650C56696577706F727453697A65050000000000CDCCCC + FB3F00000654547261636B00095374796C654E616D65060676747261636B0541 + 6C69676E0706436C69656E74064C6F636B656409034D61780500000000000000 + 80FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A65 + 2E57696474680500000000000000B006400B53697A652E486569676874050000 + 0000000000D404401453697A652E506C6174666F726D44656661756C74080B53 + 74796C654C6F6F6B75700619736D616C6C7363726F6C6C62617276747261636B + 7374796C650C56696577706F727453697A65050000000000CDCCCCFB3F000000 + 5450463007544C61796F757400095374796C654E616D65060F64726F70746172 + 6765747374796C650A506F736974696F6E2E580500000000000000B007400A50 + 6F736974696F6E2E590500000000000000D907400A53697A652E576964746805 + 000000000000008906400B53697A652E48656967687405000000000000008706 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 085461624F726465720240000A5452656374616E676C650005416C69676E0708 + 436F6E74656E74730946696C6C2E4B696E6407044E6F6E650748697454657374 + 080A53697A652E576964746805000000000000008906400B53697A652E486569 + 67687405000000000000008706401453697A652E506C6174666F726D44656661 + 756C74080C5374726F6B652E436F6C6F72070978464645364536453610537472 + 6F6B652E546869636B6E6573730500000000000000C000400B5374726F6B652E + 4461736807044461736807585261646975730500000000000000800040075952 + 616469757305000000000000008000400005545465787400095374796C654E61 + 6D6506047465787405416C69676E0706426F74746F6D0748697454657374080C + 4D617267696E732E4C6566740500000000000000A002400D4D617267696E732E + 52696768740500000000000000A002400A506F736974696F6E2E580500000000 + 000000A002400A506F736974696F6E2E590500000000000000AA05400A53697A + 652E57696474680500000000000000EA05400B53697A652E4865696768740500 + 000000000000C804401453697A652E506C6174666F726D44656661756C740804 + 54657874060474657874165465787453657474696E67732E466F6E74436F6C6F + 7207097846464633463346330000001254466C6F61744B6579416E696D617469 + 6F6E00084475726174696F6E050000000000999999FE3F044B6579730E010001 + 034B6579050000000000000080FE3F0556616C75650500000000000000A003C0 + 0001034B6579050000000000000080FF3F0000044C6F6F70090C50726F706572 + 74794E616D65060B50616464696E672E546F7010537461727446726F6D437572 + 72656E74080754726967676572060F4973447261674F7665723D747275650000 + 0554506174680005416C69676E070643656E74657209446174612E506174680A + C4000000100000000000000008EC8343F087A4430100000008EC8343083CFB43 + 0200000035BE7143504DF9430200000012835C43A8E6F54302000000F0674943 + F803F1430100000008EC8343FC0116440100000008EC8343FC51164401000000 + 00408443FC5116440100000010689A43FC412B4401000000081CD043F803F143 + 02000000915DC64321E0F54302000000919DBB439643F94302000000087CB043 + F833FB4301000000087CB043F087A4430100000008EC8343F087A44303000000 + 00000000000000000A46696C6C2E436F6C6F720708636C615768697465074869 + 7454657374080A53697A652E57696474680500000000000000C804400B53697A + 652E4865696768740500000000000100C804401453697A652E506C6174666F72 + 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650000005450 + 463007544C61796F757400095374796C654E616D650609677269647374796C65 + 0C436C69704368696C6472656E090A506F736974696F6E2E5805000000000000 + 80B507400A506F736974696F6E2E590500000000000000DA07400A53697A652E + 5769647468050000000000FFFFE905400B53697A652E48656967687405000000 + 000000008306401453697A652E506C6174666F726D44656661756C7408075669 + 7369626C6508085461624F726465720241000C5442727573684F626A65637400 + 095374796C654E616D6506086C696E6566696C6C0B42727573682E436F6C6F72 + 070978464632303230323000000A5452656374616E676C6500095374796C654E + 616D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A + 46696C6C2E436F6C6F720709784646343834383438064C6F636B656409074869 + 7454657374080C50616464696E672E4C656674050000000000000080FF3F0B50 + 616464696E672E546F70050000000000000080FF3F0D50616464696E672E5269 + 676874050000000000000080FF3F0E50616464696E672E426F74746F6D050000 + 000000000080FF3F0A53697A652E5769647468050000000000FFFFE905400B53 + 697A652E48656967687405000000000000008306401453697A652E506C617466 + 6F726D44656661756C74080C5374726F6B652E436F6C6F720709784646314331 + 4331430007544C61796F75740005416C69676E0706436C69656E740A53697A65 + 2E5769647468050000000000FFFFE505400B53697A652E486569676874050000 + 00000000008106401453697A652E506C6174666F726D44656661756C74080007 + 5448656164657200095374796C654E616D650606686561646572055369646573 + 0B06426F74746F6D0005416C69676E0703546F700A53697A652E576964746805 + 0000000000FFFFE505400B53697A652E4865696768740500000000000000A803 + 401453697A652E506C6174666F726D44656661756C7408000007544C61796F75 + 7400095374796C654E616D650607636F6E74656E7405416C69676E0706436C69 + 656E740C436C69704368696C6472656E090C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A53697A652E57696474680500 + 00000000FFFFC305400B53697A652E4865696768740500000000000000B60540 + 1453697A652E506C6174666F726D44656661756C7408000A5452656374616E67 + 6C6500095374796C654E616D65060973656C656374696F6E0946696C6C2E4B69 + 6E6407084772616469656E741446696C6C2E4772616469656E742E506F696E74 + 730E0105436F6C6F720709783830324237393843064F66667365740500000000 + 000000000000000105436F6C6F720709783830324236453746064F6666736574 + 05000000000012A2F8FD3F000105436F6C6F720709783830324236343732064F + 6666736574050000000000000080FF3F00000748697454657374080A53697A65 + 2E57696474680500000000000000C804400B53697A652E486569676874050000 + 0000000000C804401453697A652E506C6174666F726D44656661756C74080B53 + 74726F6B652E4B696E6407044E6F6E6500000A5452656374616E676C65000953 + 74796C654E616D650605666F6375730A46696C6C2E436F6C6F72070978464631 + 39313931390748697454657374080C4D617267696E732E4C6566740500000000 + 00000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61 + 7267696E732E5269676874050000000000000080FF3F0E4D617267696E732E42 + 6F74746F6D050000000000000080FF3F0A53697A652E57696474680500000000 + 000000C804400B53697A652E4865696768740500000000000000C80440145369 + 7A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72 + 07097846463339333933390000000A545363726F6C6C42617200095374796C65 + 4E616D65060A767363726F6C6C62617205416C69676E070552696768740B536D + 616C6C4368616E676505000000000000000000000B4F7269656E746174696F6E + 0708566572746963616C0A506F736974696F6E2E58050000000000FFFFC70540 + 0A506F736974696F6E2E590500000000000000A803400A53697A652E57696474 + 680500000000000000F002400B53697A652E4865696768740500000000000000 + BA05401453697A652E506C6174666F726D44656661756C740800000A54536372 + 6F6C6C42617200095374796C654E616D65060A687363726F6C6C62617205416C + 69676E0706426F74746F6D0B536D616C6C4368616E6765050000000000000000 + 00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974 + 696F6E2E590500000000000000E405400A53697A652E57696474680500000000 + 00FFFFE505400B53697A652E4865696768740500000000000000F00240145369 + 7A652E506C6174666F726D44656661756C740800000F54536D616C6C5363726F + 6C6C42617200095374796C654E616D65060F76736D616C6C7363726F6C6C6261 + 7205416C69676E070552696768740B536D616C6C4368616E6765050000000000 + 00000000000B4F7269656E746174696F6E0708566572746963616C0B4D617267 + 696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874 + 050000000000000080FF3F0E4D617267696E732E426F74746F6D050000000000 + 000080FF3F0A506F736974696F6E2E580500000000000000C605400A506F7369 + 74696F6E2E5905000000000000008000400A53697A652E576964746805000000 + 000000008002400B53697A652E48656967687405000000000000008002401453 + 697A652E506C6174666F726D44656661756C74080756697369626C650800000F + 54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D61 + 6C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C43 + 68616E676505000000000000000000000B4F7269656E746174696F6E070A486F + 72697A6F6E74616C0C4D617267696E732E4C656674050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E580500 + 0000000000008000400A506F736974696F6E2E590500000000000000E205400A + 53697A652E576964746805000000000000009606400B53697A652E4865696768 + 7405000000000000008002401453697A652E506C6174666F726D44656661756C + 74080756697369626C6508000000000B54476C6F774566666563740008536F66 + 746E6573730500000000009A9999FD3F09476C6F77436F6C6F72070978464636 + 3543384530074F706163697479050000000000000080FF3F0754726967676572 + 060E4973466F63757365643D7472756507456E61626C65640800000054504630 + 07544C61796F757400095374796C654E616D65060F6865616465726974656D73 + 74796C650A506F736974696F6E2E580500000000000000BC07400A506F736974 + 696F6E2E590500000000000080F407400A53697A652E57696474680500000000 + 000000B605400B53697A652E4865696768740500000000000000C00340145369 + 7A652E506C6174666F726D44656661756C74080756697369626C650808546162 + 4F726465720242000A5452656374616E676C6500095374796C654E616D65060A + 6261636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E + 4B696E6407084772616469656E741446696C6C2E4772616469656E742E506F69 + 6E74730E0105436F6C6F720709784646353835383538064F6666736574050000 + 0000000000000000000105436F6C6F720709784646353135313531064F666673 + 6574050000000000A01BF3FD3F000105436F6C6F720709784646343934393439 + 064F6666736574050000000000000080FF3F0000064C6F636B65640907486974 + 54657374080A53697A652E57696474680500000000000000B605400B53697A65 + 2E4865696768740500000000000000C003401453697A652E506C6174666F726D + 44656661756C74080C5374726F6B652E436F6C6F720709784646314331433143 + 001054496E6E6572476C6F774566666563740008536F66746E65737305000000 + 0000CDCCCCFD3F09476C6F77436F6C6F720709784646344634383438074F7061 + 636974790500000000006666E6FE3F0754726967676572060E49735072657373 + 65643D7472756507456E61626C65640800000005545465787400095374796C65 + 4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409 + 0748697454657374080C4D617267696E732E4C6566740500000000000000A001 + 400B4D617267696E732E546F7005000000000000008000400D4D617267696E73 + 2E52696768740500000000000000A001400E4D617267696E732E426F74746F6D + 05000000000000008000400A53697A652E57696474680500000000000000A205 + 400B53697A652E4865696768740500000000000000A003401453697A652E506C + 6174666F726D44656661756C740804546578740606627574746F6E1654657874 + 53657474696E67732E466F6E74436F6C6F720708636C61576869746500000054 + 50463007544C61796F757400095374796C654E616D65060D7465787463656C6C + 7374796C650A506F736974696F6E2E580500000000000000B807400A506F7369 + 74696F6E2E590500000000000000F507400A53697A652E576964746805000000 + 00000000D605400B53697A652E4865696768740500000000000000B003401453 + 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 + 624F726465720243000C5442727573684F626A65637400095374796C654E616D + 65060A666F726567726F756E640B42727573682E436F6C6F7207097846464541 + 4541454100000C5442727573684F626A65637400095374796C654E616D650609 + 73656C656374696F6E0A42727573682E4B696E6407084772616469656E741542 + 727573682E4772616469656E742E506F696E74730E0105436F6C6F7207097838 + 30324237393843064F66667365740500000000000000000000000105436F6C6F + 720709783830324236453746064F666673657405000000000012A2F8FD3F0001 + 05436F6C6F720709783830324236343732064F66667365740500000000000000 + 80FF3F0000000007544C61796F757400095374796C654E616D650607636F6E74 + 656E7405416C69676E0708436F6E74656E7473064C6F636B6564090C4D617267 + 696E732E4C6566740500000000000000C000400B4D617267696E732E546F7005 + 00000000000000C000400D4D617267696E732E52696768740500000000000000 + C000400E4D617267696E732E426F74746F6D0500000000000000C000400A5369 + 7A652E57696474680500000000000000CA05400B53697A652E48656967687405 + 000000000000008003401453697A652E506C6174666F726D44656661756C7408 + 0000005450463007544C61796F757400095374796C654E616D65060E63686563 + 6B63656C6C7374796C650A506F736974696F6E2E580500000000000000AD0740 + 0A506F736974696F6E2E590500000000000000F307400A53697A652E57696474 + 6805000000000000009506400B53697A652E4865696768740500000000000000 + F003401453697A652E506C6174666F726D44656661756C74080756697369626C + 6508085461624F7264657202440007544C61796F75740005416C69676E070643 + 656E7465720A53697A652E57696474680500000000000000A003400B53697A65 + 2E4865696768740500000000000000F003401453697A652E506C6174666F726D + 44656661756C74080007544C61796F75740005416C69676E070643656E746572 + 064C6F636B6564090A53697A652E57696474680500000000000000F002400B53 + 697A652E4865696768740500000000000000F002401453697A652E506C617466 + 6F726D44656661756C74080005545061746800095374796C654E616D65060963 + 6865636B6D61726B05416C69676E070643656E74657209446174612E50617468 + 0ADC0000001200000000000000000000000000000001000000CDCC4C3E000000 + 00010000000000003F9A99993E01000000CDCC4C3F0000000001000000000080 + 3F00000000010000000000803FCDCC4C3E010000003333333F0000003F010000 + 000000803FCDCC4C3F010000000000803F0000803F01000000CDCC4C3F000080 + 3F010000000000003F3333333F01000000CDCC4C3E0000803F01000000000000 + 000000803F0100000000000000CDCC4C3F010000009A99993E0000003F010000 + 0000000000CDCC4C3E0100000000000000000000000300000000000000000000 + 000A46696C6C2E436F6C6F720707636C614E756C6C064C6F636B656409074869 + 7454657374080A53697A652E576964746805000000000000009002400B53697A + 652E48656967687405000000000000009002401453697A652E506C6174666F72 + 6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F54436F + 6C6F72416E696D6174696F6E00084475726174696F6E0500000000006F1283F5 + 3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274 + 56616C75650707636C614E756C6C0953746F7056616C75650708636C61426C61 + 636B0754726967676572060E4973436865636B65643D7472756500000F54436F + 6C6F72416E696D6174696F6E00084475726174696F6E0500000000006F1283F5 + 3F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374617274 + 56616C75650708636C61426C61636B0953746F7056616C75650707636C614E75 + 6C6C0754726967676572060F4973436865636B65643D66616C73650000000000 + 005450463007544C61796F757400095374796C654E616D65060E706F70757063 + 656C6C7374796C650A506F736974696F6E2E580500000000000000B807400A50 + 6F736974696F6E2E590500000000000000F507400A53697A652E576964746805 + 00000000000000D605400B53697A652E4865696768740500000000000000B003 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 085461624F7264657202450007544C61796F75740005416C69676E0705526967 + 68740A506F736974696F6E2E580500000000000000B805400A53697A652E5769 + 6474680500000000000000F002400B53697A652E486569676874050000000000 + 0000B003401453697A652E506C6174666F726D44656661756C74080005545061 + 74680005416C69676E070643656E74657209446174612E506174680A40000000 + 0500000000000000000000000000803F010000000000803F0000803F01000000 + 0000003F0000000001000000000000000000803F030000000000000000000000 + 0A46696C6C2E436F6C6F7207097846464541454145410748697454657374080B + 4D617267696E732E546F7005000000000000009002C00A53697A652E57696474 + 6805000000000000008002400B53697A652E4865696768740500000000000000 + A001401453697A652E506C6174666F726D44656661756C74080B5374726F6B65 + 2E4B696E6407044E6F6E6500000554506174680005416C69676E070643656E74 + 657209446174612E506174680A34000000040000000000000000000000000000 + 00010000000000803F00000000010000000000003F0000803F03000000000000 + 00000000000A46696C6C2E436F6C6F7207097846464541454145410748697454 + 657374080B4D617267696E732E546F700500000000000000E001400A53697A65 + 2E576964746805000000000000008002400B53697A652E486569676874050000 + 0000000000A001401453697A652E506C6174666F726D44656661756C74080B53 + 74726F6B652E4B696E6407044E6F6E6500000005545465787400095374796C65 + 4E616D6506047465787405416C69676E0706436C69656E74064C6F636B656409 + 0748697454657374080C4D617267696E732E4C6566740500000000000000A001 + 400B4D617267696E732E546F700500000000000000A001400D4D617267696E73 + 2E52696768740500000000000000A001400E4D617267696E732E426F74746F6D + 0500000000000000A001400A53697A652E57696474680500000000000000A405 + 400B53697A652E4865696768740500000000000000C002401453697A652E506C + 6174666F726D44656661756C740804546578740606627574746F6E1654657874 + 53657474696E67732E466F6E74436F6C6F720708636C61576869746515546578 + 7453657474696E67732E576F726457726170080000005450463007544C61796F + 757400095374796C654E616D65061170726F677265737363656C6C7374796C65 + 0A506F736974696F6E2E580500000000000080C007400A506F736974696F6E2E + 590500000000000080EB07400A53697A652E5769647468050000000000000090 + 05400B53697A652E486569676874050000000000FFFFF304401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C6508085461624F726465 + 7202460007544C61796F757400095374796C654E616D65060668747261636B05 + 416C69676E0708436F6E74656E7473064C6F636B6564090C4D617267696E732E + 4C65667405000000000000008000400B4D617267696E732E546F700500000000 + 0000008000400D4D617267696E732E526967687405000000000000008000400E + 4D617267696E732E426F74746F6D05000000000000008000400A53697A652E57 + 6964746805000000000000008805400B53697A652E4865696768740500000000 + 00FFFFE304401453697A652E506C6174666F726D44656661756C7408000A5452 + 656374616E676C6500095374796C654E616D65060A68696E64696361746F7205 + 416C69676E07044C6566740946696C6C2E4B696E6407084772616469656E7414 + 46696C6C2E4772616469656E742E506F696E74730E0105436F6C6F7207097846 + 46323637324238064F66667365740500000000000000000000000105436F6C6F + 720709784646303634353735064F6666736574050000000000000080FF3F0000 + 064C6F636B6564090748697454657374080C4D617267696E732E4C6566740500 + 00000000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F + 0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E + 732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E580500 + 00000000000080FF3F0A506F736974696F6E2E59050000000000000080FF3F0A + 53697A652E57696474680500000000000000C804400B53697A652E4865696768 + 74050000000000FFFFDB04401453697A652E506C6174666F726D44656661756C + 7408000000005450463007544C61796F757400095374796C654E616D65060E69 + 6D61676563656C6C7374796C650A506F736974696F6E2E580500000000000000 + C007400A506F736974696F6E2E590500000000000000F407400A53697A652E57 + 6964746805000000000000009205400B53697A652E4865696768740500000000 + 000000D003401453697A652E506C6174666F726D44656661756C740807566973 + 69626C6508085461624F726465720247000654496D61676500095374796C654E + 616D650605696D6167650E4D756C74695265734269746D61700E01000005416C + 69676E0706436C69656E74064C6F636B6564090748697454657374080C4D6172 + 67696E732E4C6566740500000000000000C000400B4D617267696E732E546F70 + 0500000000000000C000400D4D617267696E732E526967687405000000000000 + 00C000400E4D617267696E732E426F74746F6D0500000000000000C000400A53 + 697A652E576964746805000000000000008605400B53697A652E486569676874 + 0500000000000000A003401453697A652E506C6174666F726D44656661756C74 + 08000000545046300A5452656374616E676C6500095374796C654E616D65060C + 6D656E756261727374796C650C436C69704368696C6472656E090A46696C6C2E + 436F6C6F7207097846463438343834380748697454657374080A506F73697469 + 6F6E2E580500000000000000C607400A506F736974696F6E2E59050000000000 + 0000EE07400A53697A652E57696474680500000000000000C804400B53697A65 + 2E4865696768740500000000000000C804401453697A652E506C6174666F726D + 44656661756C74080C5374726F6B652E436F6C6F720709784646314331433143 + 0756697369626C6508000A5452656374616E676C650005416C69676E0706436C + 69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C4D61 + 7267696E732E4C656674050000000000000080FF3F0B4D617267696E732E546F + 70050000000000000080FF3F0D4D617267696E732E5269676874050000000000 + 000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF3F0A + 53697A652E57696474680500000000000000C004400B53697A652E4865696768 + 740500000000000000C004401453697A652E506C6174666F726D44656661756C + 74080C5374726F6B652E436F6C6F720709784646353935393539000000545046 + 300A5452656374616E676C6500095374796C654E616D65060D6D656E75766965 + 777374796C650D50616464696E672E526967687405000000000000008002400E + 50616464696E672E426F74746F6D05000000000000008002400A506F73697469 + 6F6E2E580500000000000000C607400A506F736974696F6E2E59050000000000 + 0000EE07400A53697A652E57696474680500000000000000C804400B53697A65 + 2E4865696768740500000000000000C804401453697A652E506C6174666F726D + 44656661756C74080756697369626C6508000A5452656374616E676C65000541 + 6C69676E0706436C69656E740A46696C6C2E436F6C6F72070978464633333333 + 33330748697454657374080D4D617267696E732E526967687405000000000000 + 008002C00E4D617267696E732E426F74746F6D05000000000000008002C00A53 + 697A652E57696474680500000000000000C804400B53697A652E486569676874 + 0500000000000000C804401453697A652E506C6174666F726D44656661756C74 + 080C5374726F6B652E436F6C6F720709784646323232323232000D5453686164 + 6F77456666656374000844697374616E63650500000000000000800140094469 + 72656374696F6E0500000000000000B4044008536F66746E6573730500000000 + 00CECCCCFC3F074F706163697479050000000000000080FE3F0B536861646F77 + 436F6C6F720708636C61426C61636B00000007544C61796F757400095374796C + 654E616D650607636F6E74656E7405416C69676E0706436C69656E740C4D6172 + 67696E732E4C6566740500000000000000C000400B4D617267696E732E546F70 + 0500000000000000C000400D4D617267696E732E526967687405000000000000 + 00C000400E4D617267696E732E426F74746F6D0500000000000000C000400A53 + 697A652E576964746805000000000000009004400B53697A652E486569676874 + 05000000000000009004401453697A652E506C6174666F726D44656661756C74 + 080000005450463007544C61796F757400095374796C654E616D65060D6D656E + 756974656D7374796C650C4D617267696E732E4C656674050000000000000080 + FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D617267696E + 732E5269676874050000000000000080FF3F0E4D617267696E732E426F74746F + 6D050000000000000080FF3F0A506F736974696F6E2E580500000000000000C0 + 07400A506F736974696F6E2E590500000000000000F407400A53697A652E5769 + 64746805000000000000009205400B53697A652E486569676874050000000000 + 0000D003401453697A652E506C6174666F726D44656661756C74080756697369 + 626C6508085461624F72646572024A000A5452656374616E676C650005416C69 + 676E0708436F6E74656E74730946696C6C2E4B696E6407084772616469656E74 + 1446696C6C2E4772616469656E742E506F696E74730E0105436F6C6F72070978 + 4646353835383538064F66667365740500000000000000000000000105436F6C + 6F720709784646353135313531064F6666736574050000000000A01BF3FD3F00 + 0105436F6C6F720709784646343934393439064F666673657405000000000000 + 0080FF3F0000074869745465737408074F70616369747905000000000017B7D1 + F13F0A53697A652E576964746805000000000000009205400B53697A652E4865 + 696768740500000000000000D003401453697A652E506C6174666F726D446566 + 61756C74080C5374726F6B652E436F6C6F720709784646364136413641000F54 + 466C6F6174416E696D6174696F6E00084475726174696F6E05000000000018B7 + D1F23F0C50726F70657274794E616D6506074F7061636974790A537461727456 + 616C756505000000000000000000000953746F7056616C756505000000000000 + 0080FF3F0754726967676572060F497353656C65637465643D747275650E5472 + 6967676572496E76657273650610497353656C65637465643D66616C73650000 + 000A5452656374616E676C6500095374796C654E616D65060A6261636B67726F + 756E6405416C69676E0708436F6E74656E74730946696C6C2E4B696E64070847 + 72616469656E741446696C6C2E4772616469656E742E506F696E74730E010543 + 6F6C6F720709784646353835383538064F666673657405000000000000000000 + 00000105436F6C6F720709784646353135313531064F66667365740500000000 + 00A01BF3FD3F000105436F6C6F720709784646343934393439064F6666736574 + 050000000000000080FF3F0000074869745465737408074F7061636974790500 + 0000000017B7D1F13F0A53697A652E576964746805000000000000009205400B + 53697A652E4865696768740500000000000000D003401453697A652E506C6174 + 666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463641 + 36413641000F54466C6F6174416E696D6174696F6E00084475726174696F6E05 + 000000000018B7D1F23F0C50726F70657274794E616D6506074F706163697479 + 0A537461727456616C756505000000000000000000000953746F7056616C7565 + 050000000000000080FF3F0754726967676572061049734D6F7573654F766572 + 3D747275650E54726967676572496E7665727365061149734D6F7573654F7665 + 723D66616C736500000007544C61796F757400095374796C654E616D65060567 + 6C79706805416C69676E07084D6F73744C6566740A53697A652E576964746805 + 00000000000000C803400B53697A652E4865696768740500000000000000D003 + 401453697A652E506C6174666F726D44656661756C74080007544C61796F7574 + 00095374796C654E616D650609636865636B6D61726B05416C69676E0708436F + 6E74656E7473074F7061636974790500000000006F1283F53F0A53697A652E57 + 696474680500000000000000C803400B53697A652E4865696768740500000000 + 000000D003401453697A652E506C6174666F726D44656661756C740800055450 + 61746800095374796C654E616D65060E636865636B6D61726B7374796C650541 + 6C69676E070643656E74657209446174612E506174680A580000000700000000 + 00000056D9524391AE2C43010000009276664365021643010000009F3983432B + 7C3C43010000009E9AA64382D2B442010000006F1CB04375A4D1420100000026 + DF8243263F67430300000056D9524391AE2C430A46696C6C2E436F6C6F720708 + 636C6157686974650748697454657374080A53697A652E576964746805000000 + 00000000B002400B53697A652E4865696768740500000000000000B002401453 + 697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64 + 07044E6F6E6500000F54466C6F6174416E696D6174696F6E0008447572617469 + 6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D6506074F706163 + 6974790A537461727456616C756505000000000000000000000953746F705661 + 6C7565050000000000000080FF3F0754726967676572060E4973436865636B65 + 643D747275650E54726967676572496E7665727365060F4973436865636B6564 + 3D66616C73650000000654476C79706800095374796C654E616D65060A676C79 + 70687374796C650C4D617267696E732E4C656674050000000000000080FF3F0B + 4D617267696E732E546F7005000000000000008000400D4D617267696E732E52 + 696768740500000000000000C000400E4D617267696E732E426F74746F6D0500 + 00000000000080FF3F05416C69676E07044C6566740A53697A652E5769647468 + 05000000000000008003400B53697A652E486569676874050000000000000080 + 03401453697A652E506C6174666F726D44656661756C740800000654496D6167 + 6500095374796C654E616D6506066269746D61700E4D756C7469526573426974 + 6D61700E01000005416C69676E07044C6566740C4D617267696E732E4C656674 + 05000000000000008000400B4D617267696E732E546F70050000000000000080 + 00400D4D617267696E732E526967687405000000000000008000400E4D617267 + 696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E58 + 05000000000000008000400A506F736974696F6E2E5905000000000000008000 + 400A53697A652E57696474680500000000000000A803400B53697A652E486569 + 6768740500000000000000B003401453697A652E506C6174666F726D44656661 + 756C740800000005545465787400095374796C654E616D650604746578740541 + 6C69676E07044C656674064C6F636B6564090748697454657374080C4D617267 + 696E732E4C65667405000000000000008002400D4D617267696E732E52696768 + 7405000000000000008002400A506F736974696F6E2E58050000000000000084 + 04400A53697A652E57696474680500000000000000C804400B53697A652E4865 + 696768740500000000000000D003401453697A652E506C6174666F726D446566 + 61756C7408165465787453657474696E67732E466F6E74436F6C6F720708636C + 615768697465165465787453657474696E67732E486F727A416C69676E07074C + 656164696E67000005545465787400095374796C654E616D65060873686F7274 + 63757405416C69676E07055269676874064C6F636B6564090748697454657374 + 080C4D617267696E732E4C6566740500000000000000C002400D4D617267696E + 732E52696768740500000000000000C001400A506F736974696F6E2E58050000 + 0000000000C000C00A53697A652E57696474680500000000000000C804400B53 + 697A652E4865696768740500000000000000D003401453697A652E506C617466 + 6F726D44656661756C7408165465787453657474696E67732E486F727A416C69 + 676E07074C656164696E67000007544C61796F757400095374796C654E616D65 + 06077375626D61726B05416C69676E070552696768740A506F736974696F6E2E + 580500000000000000D404400A53697A652E57696474680500000000000000A0 + 03400B53697A652E4865696768740500000000000000D003401453697A652E50 + 6C6174666F726D44656661756C7408000554506174680005416C69676E070643 + 656E74657209446174612E506174680A34000000040000000000000000000000 + 0000000001000000000000000000803F010000000000803F0000003F03000000 + 00000000000000000A46696C6C2E436F6C6F720707636C6147726179064C6F63 + 6B6564090748697454657374080A53697A652E57696474680500000000000000 + E001400B53697A652E48656967687405000000000000008002401453697A652E + 506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F + 6E65000000005450463007544C61796F757400095374796C654E616D6506106D + 656E756261726974656D7374796C650C4D617267696E732E4C65667405000000 + 0000000080FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D + 617267696E732E5269676874050000000000000080FF3F0E4D617267696E732E + 426F74746F6D050000000000000080FF3F0A506F736974696F6E2E5805000000 + 00000000C007400A506F736974696F6E2E590500000000000000F407400A5369 + 7A652E576964746805000000000000009205400B53697A652E48656967687405 + 00000000000000D003401453697A652E506C6174666F726D44656661756C7408 + 0756697369626C6508085461624F72646572024B000A5452656374616E676C65 + 0005416C69676E0708436F6E74656E74730946696C6C2E4B696E640708477261 + 6469656E741446696C6C2E4772616469656E742E506F696E74730E0105436F6C + 6F720709784646353835383538064F6666736574050000000000000000000000 + 0105436F6C6F720709784646353135313531064F6666736574050000000000A0 + 1BF3FD3F000105436F6C6F720709784646343934393439064F66667365740500 + 00000000000080FF3F0000074869745465737408074F70616369747905000000 + 000017B7D1F13F0A53697A652E576964746805000000000000009205400B5369 + 7A652E4865696768740500000000000000D003401453697A652E506C6174666F + 726D44656661756C74080C5374726F6B652E436F6C6F72070978464636413641 + 3641000F54466C6F6174416E696D6174696F6E00084475726174696F6E050000 + 00000018B7D1F23F0C50726F70657274794E616D6506074F7061636974790A53 + 7461727456616C756505000000000000000000000953746F7056616C75650500 + 00000000000080FF3F0754726967676572060F497353656C65637465643D7472 + 75650E54726967676572496E76657273650610497353656C65637465643D6661 + 6C73650000000A5452656374616E676C6500095374796C654E616D65060A6261 + 636B67726F756E6405416C69676E0708436F6E74656E74730946696C6C2E4B69 + 6E6407084772616469656E741446696C6C2E4772616469656E742E506F696E74 + 730E0105436F6C6F720709784646353835383538064F66667365740500000000 + 000000000000000105436F6C6F720709784646353135313531064F6666736574 + 050000000000A01BF3FD3F000105436F6C6F720709784646343934393439064F + 6666736574050000000000000080FF3F0000074869745465737408074F706163 + 69747905000000000017B7D1F13F0A53697A652E576964746805000000000000 + 009205400B53697A652E4865696768740500000000000000D003401453697A65 + 2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709 + 784646364136413641000F54466C6F6174416E696D6174696F6E000844757261 + 74696F6E05000000000018B7D1F23F0C50726F70657274794E616D6506074F70 + 61636974790A537461727456616C756505000000000000000000000953746F70 + 56616C7565050000000000000080FF3F0754726967676572061049734D6F7573 + 654F7665723D747275650E54726967676572496E7665727365061149734D6F75 + 73654F7665723D66616C736500000007544C61796F757400095374796C654E61 + 6D650605676C79706805416C69676E07084D6F73744C6566740A53697A652E57 + 696474680500000000000000C803400B53697A652E4865696768740500000000 + 000000D003401453697A652E506C6174666F726D44656661756C74080007544C + 61796F757400095374796C654E616D650609636865636B6D61726B05416C6967 + 6E0708436F6E74656E7473074F7061636974790500000000006F1283F53F0A53 + 697A652E57696474680500000000000000C803400B53697A652E486569676874 + 0500000000000000D003401453697A652E506C6174666F726D44656661756C74 + 080005545061746800095374796C654E616D65060E636865636B6D61726B7374 + 796C6505416C69676E070643656E74657209446174612E506174680A58000000 + 070000000000000056D9524391AE2C4301000000927666436502164301000000 + 9F3983432B7C3C43010000009E9AA64382D2B442010000006F1CB04375A4D142 + 0100000026DF8243263F67430300000056D9524391AE2C430A46696C6C2E436F + 6C6F720708636C6157686974650748697454657374080A53697A652E57696474 + 680500000000000000B002400B53697A652E4865696768740500000000000000 + B002401453697A652E506C6174666F726D44656661756C74080B5374726F6B65 + 2E4B696E6407044E6F6E6500000F54466C6F6174416E696D6174696F6E000844 + 75726174696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D6506 + 074F7061636974790A537461727456616C756505000000000000000000000953 + 746F7056616C7565050000000000000080FF3F0754726967676572060E497343 + 6865636B65643D747275650E54726967676572496E7665727365060F49734368 + 65636B65643D66616C73650000000654476C79706800095374796C654E616D65 + 060A676C7970687374796C650C4D617267696E732E4C65667405000000000000 + 0080FF3F0B4D617267696E732E546F7005000000000000008000400D4D617267 + 696E732E52696768740500000000000000C000400E4D617267696E732E426F74 + 746F6D050000000000000080FF3F05416C69676E070552696768740A53697A65 + 2E576964746805000000000000008003400B53697A652E486569676874050000 + 00000000008003401453697A652E506C6174666F726D44656661756C74080000 + 0654496D61676500095374796C654E616D6506066269746D61700E4D756C7469 + 5265734269746D61700E01000005416C69676E070552696768740C4D61726769 + 6E732E4C65667405000000000000008000400B4D617267696E732E546F700500 + 0000000000008000400D4D617267696E732E5269676874050000000000000080 + 00400E4D617267696E732E426F74746F6D05000000000000008000400A506F73 + 6974696F6E2E5805000000000000008000400A506F736974696F6E2E59050000 + 00000000008000400A53697A652E57696474680500000000000000A803400B53 + 697A652E4865696768740500000000000000B003401453697A652E506C617466 + 6F726D44656661756C740800000005545465787400095374796C654E616D6506 + 047465787405416C69676E07044C656674064C6F636B65640907486974546573 + 74080C4D617267696E732E4C65667405000000000000008002400D4D61726769 + 6E732E526967687405000000000000008002400A506F736974696F6E2E580500 + 0000000000008404400A53697A652E57696474680500000000000000C804400B + 53697A652E4865696768740500000000000000D003401453697A652E506C6174 + 666F726D44656661756C7408165465787453657474696E67732E466F6E74436F + 6C6F720708636C615768697465165465787453657474696E67732E486F727A41 + 6C69676E07074C656164696E67000005545465787400095374796C654E616D65 + 060873686F727463757405416C69676E07055269676874064C6F636B65640907 + 48697454657374080C4D617267696E732E4C6566740500000000000000C00240 + 0D4D617267696E732E52696768740500000000000000C001400A506F73697469 + 6F6E2E580500000000000000C000C00A53697A652E5769647468050000000000 + 0000C804400B53697A652E4865696768740500000000000000D003401453697A + 652E506C6174666F726D44656661756C7408165465787453657474696E67732E + 486F727A416C69676E07074C656164696E67000007544C61796F757400095374 + 796C654E616D6506077375626D61726B05416C69676E070552696768740A506F + 736974696F6E2E580500000000000000D404400A53697A652E57696474680500 + 000000000000A003400B53697A652E4865696768740500000000000000D00340 + 1453697A652E506C6174666F726D44656661756C740800055450617468000541 + 6C69676E070643656E74657209446174612E506174680A340000000400000000 + 000000000000000000000001000000000000000000803F010000000000803F00 + 00003F0300000000000000000000000A46696C6C2E436F6C6F720707636C6147 + 726179064C6F636B6564090748697454657374080A53697A652E576964746805 + 00000000000000E001400B53697A652E48656967687405000000000000008002 + 401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B + 696E6407044E6F6E65000000005450463007544C61796F757400095374796C65 + 4E616D6506126D656E75736570617261746F727374796C650C4D617267696E73 + 2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000 + 0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F + 0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974 + 696F6E2E580500000000000000C607400A506F736974696F6E2E590500000000 + 000000EE07400A53697A652E57696474680500000000000000C804400B53697A + 652E4865696768740500000000000000C804401453697A652E506C6174666F72 + 6D44656661756C74080756697369626C6508085461624F72646572024C000554 + 4C696E650005416C69676E0703546F70084C696E65547970650703546F700C4D + 617267696E732E4C6566740500000000000000C000400B4D617267696E732E54 + 6F7005000000000000008000400D4D617267696E732E52696768740500000000 + 000000C000400A506F736974696F6E2E580500000000000000C000400A506F73 + 6974696F6E2E5905000000000000008000400A53697A652E5769647468050000 + 0000000000B004400B53697A652E486569676874050000000000000080FF3F14 + 53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C + 6F720709636C6153696C766572000000545046300654496D6167650009537479 + 6C654E616D650611616E69696E64696361746F727374796C650E4D756C746952 + 65734269746D61700E0100000A53697A652E57696474680500000000000000C8 + 04400B53697A652E4865696768740500000000000000C804401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C6508000C544272757368 + 4F626A65637400095374796C654E616D65060466696C6C000000545046300754 + 4C61796F757400095374796C654E616D65060D74696D65656469747374796C65 + 0A53697A652E57696474680500000000000000C804400B53697A652E48656967 + 68740500000000000000C804401453697A652E506C6174666F726D4465666175 + 6C74080756697369626C6508085461624F72646572024E000B54476C6F774566 + 666563740008536F66746E6573730500000000009A9999FD3F09476C6F77436F + 6C6F720709784646363543384530074F706163697479050000000000000080FF + 3F0754726967676572060E4973466F63757365643D7472756507456E61626C65 + 640800000A5452656374616E676C6500095374796C654E616D65060A6261636B + 67726F756E6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F + 720709784646313931393139064C6F636B6564090748697454657374080A5369 + 7A652E57696474680500000000000000C804400B53697A652E48656967687405 + 00000000000000C804401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F720709784646333933393339000F54436F6C6F72 + 416E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F0C50 + 726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C + 756507097846463530353035300953746F7056616C7565070978464637303730 + 373000000F54436F6C6F72416E696D6174696F6E00084475726174696F6E0500 + 00000000CDCCCCFC3F07496E7665727365090C50726F70657274794E616D6506 + 0A46696C6C2E436F6C6F720A537461727456616C756507097846463530353035 + 300953746F7056616C7565070978464637303730373000000A5452656374616E + 676C650005416C69676E0706436C69656E740946696C6C2E4B696E6407044E6F + 6E650748697454657374080C4D617267696E732E4C6566740500000000000000 + 80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769 + 6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474 + 6F6D050000000000000080FF3F0A53697A652E57696474680500000000000000 + C004400B53697A652E4865696768740500000000000000C004401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 46463138313831380000000B54477269644C61796F75740005416C69676E0709 + 4D6F737452696768740A4974656D486569676874050000000000000080FFBF09 + 4974656D576964746805000000000000008005400B4F7269656E746174696F6E + 0708566572746963616C0C4D617267696E732E4C656674050000000000000080 + 00400B4D617267696E732E546F7005000000000000008000400D4D617267696E + 732E526967687405000000000000008000400E4D617267696E732E426F74746F + 6D05000000000000008000400A506F736974696F6E2E580500000000000000E0 + 03400A506F736974696F6E2E5905000000000000008000400A53697A652E5769 + 6474680500000000000000A003400B53697A652E486569676874050000000000 + 0000B804401453697A652E506C6174666F726D44656661756C74080007544C61 + 796F7574000A53697A652E57696474680500000000000000A003400B53697A65 + 2E4865696768740500000000000000B803401453697A652E506C6174666F726D + 44656661756C7408000754427574746F6E00095374796C654E616D6506087570 + 627574746F6E05416C69676E0706436C69656E740843616E466F637573080A53 + 697A652E57696474680500000000000000A003400B53697A652E486569676874 + 0500000000000000B803401453697A652E506C6174666F726D44656661756C74 + 080B5374796C654C6F6F6B757006127363726F6C6C626172746F70627574746F + 6E085461624F72646572020000000007544C61796F7574000A506F736974696F + 6E2E590500000000000000B803400A53697A652E576964746805000000000000 + 00A003400B53697A652E4865696768740500000000000000B803401453697A65 + 2E506C6174666F726D44656661756C7408000754427574746F6E00095374796C + 654E616D65060A646F776E627574746F6E05416C69676E0706436C69656E7408 + 43616E466F637573080A53697A652E57696474680500000000000000A003400B + 53697A652E4865696768740500000000000000B803401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B757006157363726F6C6C + 626172626F74746F6D627574746F6E085461624F726465720200000000001054 + 5374796C65546578744F626A65637400095374796C654E616D65060454657874 + 05416C69676E0706436C69656E74064C6F636B6564090C4D617267696E732E4C + 65667405000000000000008000400B4D617267696E732E546F70050000000000 + 00008000400D4D617267696E732E526967687405000000000000008000400E4D + 617267696E732E426F74746F6D05000000000000008000400A53697A652E5769 + 64746805000000000000000000000B53697A652E486569676874050000000000 + 0000B804401453697A652E506C6174666F726D44656661756C74081654657874 + 53657474696E67732E466F6E74436F6C6F7207097846464541454145410D5368 + 61646F7756697369626C650800000C5442727573684F626A6563740009537479 + 6C654E616D65060973656C656374696F6E0A42727573682E4B696E6407084772 + 616469656E741542727573682E4772616469656E742E506F696E74730E010543 + 6F6C6F720709783830324237393843064F666673657405000000000000000000 + 00000105436F6C6F720709783830324236453746064F66667365740500000000 + 0012A2F8FD3F000105436F6C6F720709783830324236343732064F6666736574 + 050000000000000080FF3F000000000954436865636B426F7800095374796C65 + 4E616D650605636865636B05416C69676E07084D6F73744C6566740843616E46 + 6F637573081244697361626C65466F637573456666656374090C4D617267696E + 732E4C65667405000000000000008000400A53697A652E576964746805000000 + 00000000A003400B53697A652E48656967687405000000000000009803401453 + 697A652E506C6174666F726D44656661756C7408085461624F72646572020307 + 56697369626C650800000754427574746F6E00095374796C654E616D65060B63 + 6C656172627574746F6E05416C69676E070552696768740843616E466F637573 + 080C4D617267696E732E4C65667405000000000000008000400B4D617267696E + 732E546F7005000000000000008000400D4D617267696E732E52696768740500 + 0000000000008000400E4D617267696E732E426F74746F6D0500000000000000 + 8000400A506F736974696F6E2E5805000000000000008001400A506F73697469 + 6F6E2E5905000000000000008000400A53697A652E5769647468050000000000 + 0000A003400B53697A652E4865696768740500000000000000B804401453697A + 652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570061C + 7472616E73706172656E74636972636C65627574746F6E7374796C6500055450 + 6174680005416C69676E070346697409446174612E506174680AC40000001000 + 0000000000000000A0C00000704101000000000070410000A0C0010000000000 + 48420000F041010000000000AA420000A0C0010000000000D242000070410100 + 000000008C4200004842010000000000D2420000B442010000000000AA420000 + DC42020000003BDF34429E6F8C4202000000FE547D427FAAB042020000000000 + 48420000964201000000000070410000DC42010000000000A0C00000B4420100 + 00000000F04100005C42010000000000A0C00000704103000000000000000000 + 0000064C6F636B6564090748697454657374080C4D617267696E732E4C656674 + 05000000000000008001400B4D617267696E732E546F70050000000000000080 + 01400D4D617267696E732E526967687405000000000000008001400E4D617267 + 696E732E426F74746F6D05000000000000008001400A53697A652E5769647468 + 0500000000000000C002400B53697A652E4865696768740500000000000000C0 + 02401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E + 4B696E6407044E6F6E65000000005450463007544C61796F757400095374796C + 654E616D65060D64617465656469747374796C650A53697A652E576964746805 + 00000000000000C804400B53697A652E4865696768740500000000000000C804 + 401453697A652E506C6174666F726D44656661756C74080756697369626C6508 + 085461624F72646572024F000B54476C6F774566666563740008536F66746E65 + 73730500000000009A9999FD3F09476C6F77436F6C6F72070978464636354338 + 4530074F706163697479050000000000000080FF3F0754726967676572060E49 + 73466F63757365643D7472756507456E61626C65640800000A5452656374616E + 676C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E + 0708436F6E74656E74730A46696C6C2E436F6C6F720709784646313931393139 + 064C6F636B6564090748697454657374080A53697A652E576964746805000000 + 00000000C804400B53697A652E4865696768740500000000000000C804401453 + 697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F + 720709784646333933393339000F54436F6C6F72416E696D6174696F6E000844 + 75726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D6506 + 0A46696C6C2E436F6C6F720A537461727456616C756507097846463530353035 + 300953746F7056616C7565070978464637303730373000000F54436F6C6F7241 + 6E696D6174696F6E00084475726174696F6E050000000000CDCCCCFC3F07496E + 7665727365090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A + 537461727456616C756507097846463530353035300953746F7056616C756507 + 0978464637303730373000000A5452656374616E676C650005416C69676E0706 + 436C69656E740946696C6C2E4B696E6407044E6F6E650748697454657374080C + 4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E + 546F70050000000000000080FF3F0D4D617267696E732E526967687405000000 + 0000000080FF3F0E4D617267696E732E426F74746F6D050000000000000080FF + 3F0A53697A652E57696474680500000000000000C004400B53697A652E486569 + 6768740500000000000000C004401453697A652E506C6174666F726D44656661 + 756C74080C5374726F6B652E436F6C6F72070978464631383138313800000007 + 54427574746F6E00095374796C654E616D6506056172726F7705416C69676E07 + 094D6F737452696768740843616E466F637573080C4D617267696E732E4C6566 + 7405000000000000008000400B4D617267696E732E546F700500000000000000 + 8000400D4D617267696E732E526967687405000000000000008000400E4D6172 + 67696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E + 580500000000000000E003400A506F736974696F6E2E59050000000000000080 + 00400A53697A652E57696474680500000000000000A003400B53697A652E4865 + 696768740500000000000000B804401453697A652E506C6174666F726D446566 + 61756C74080B5374796C654C6F6F6B757006157363726F6C6C626172626F7474 + 6F6D627574746F6E000010545374796C65546578744F626A6563740009537479 + 6C654E616D6506045465787405416C69676E0706436C69656E74064C6F636B65 + 64090C4D617267696E732E4C65667405000000000000008000400B4D61726769 + 6E732E546F7005000000000000008000400D4D617267696E732E526967687405 + 000000000000008000400E4D617267696E732E426F74746F6D05000000000000 + 008000400A53697A652E576964746805000000000000000000000B53697A652E + 4865696768740500000000000000B804401453697A652E506C6174666F726D44 + 656661756C7408165465787453657474696E67732E466F6E74436F6C6F720709 + 7846464541454145410D536861646F7756697369626C650800000C5442727573 + 684F626A65637400095374796C654E616D65060973656C656374696F6E0A4272 + 7573682E4B696E6407084772616469656E741542727573682E4772616469656E + 742E506F696E74730E0105436F6C6F720709783830324237393843064F666673 + 65740500000000000000000000000105436F6C6F720709783830324236453746 + 064F666673657405000000000012A2F8FD3F000105436F6C6F72070978383032 + 4236343732064F6666736574050000000000000080FF3F000000000954436865 + 636B426F7800095374796C654E616D650605636865636B05416C69676E07084D + 6F73744C6566740843616E466F637573081244697361626C65466F6375734566 + 66656374090C4D617267696E732E4C65667405000000000000008000400A5369 + 7A652E57696474680500000000000000A003400B53697A652E48656967687405 + 000000000000009803401453697A652E506C6174666F726D44656661756C7408 + 085461624F7264657202030756697369626C650800000754427574746F6E0009 + 5374796C654E616D65060B636C656172627574746F6E05416C69676E07055269 + 6768740843616E466F637573080C4D617267696E732E4C656674050000000000 + 00008000400B4D617267696E732E546F7005000000000000008000400D4D6172 + 67696E732E526967687405000000000000008000400E4D617267696E732E426F + 74746F6D05000000000000008000400A506F736974696F6E2E58050000000000 + 00008001400A506F736974696F6E2E5905000000000000008000400A53697A65 + 2E57696474680500000000000000A003400B53697A652E486569676874050000 + 0000000000B804401453697A652E506C6174666F726D44656661756C74080B53 + 74796C654C6F6F6B7570061C7472616E73706172656E74636972636C65627574 + 746F6E7374796C65000554506174680005416C69676E07034669740944617461 + 2E506174680AC400000010000000000000000000A0C000007041010000000000 + 70410000A0C001000000000048420000F041010000000000AA420000A0C00100 + 00000000D242000070410100000000008C4200004842010000000000D2420000 + B442010000000000AA420000DC42020000003BDF34429E6F8C4202000000FE54 + 7D427FAAB04202000000000048420000964201000000000070410000DC420100 + 00000000A0C00000B442010000000000F04100005C42010000000000A0C00000 + 7041030000000000000000000000064C6F636B6564090748697454657374080C + 4D617267696E732E4C65667405000000000000008001400B4D617267696E732E + 546F7005000000000000008001400D4D617267696E732E526967687405000000 + 000000008001400E4D617267696E732E426F74746F6D05000000000000008001 + 400A53697A652E57696474680500000000000000C002400B53697A652E486569 + 6768740500000000000000C002401453697A652E506C6174666F726D44656661 + 756C74080B5374726F6B652E4B696E6407044E6F6E6500000000545046300B54 + 477269644C61796F757400095374796C654E616D65060E7370696E6564697462 + 7574746F6E0A4974656D486569676874050000000000000080FFBF094974656D + 576964746805000000000000008005400B4F7269656E746174696F6E07085665 + 72746963616C0A53697A652E57696474680500000000000000C804400B53697A + 652E4865696768740500000000000000C804401453697A652E506C6174666F72 + 6D44656661756C74080756697369626C6508085461624F726465720250000754 + 4C61796F7574000A53697A652E57696474680500000000000000C804400B5369 + 7A652E4865696768740500000000000000C803401453697A652E506C6174666F + 726D44656661756C7408000754427574746F6E00095374796C654E616D650608 + 7570627574746F6E05416C69676E0706436C69656E740843616E466F63757308 + 0A53697A652E57696474680500000000000000C804400B53697A652E48656967 + 68740500000000000000C803401453697A652E506C6174666F726D4465666175 + 6C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F70627574 + 746F6E085461624F72646572020000000007544C61796F7574000A506F736974 + 696F6E2E590500000000000000C803400A53697A652E57696474680500000000 + 000000C804400B53697A652E4865696768740500000000000000C80340145369 + 7A652E506C6174666F726D44656661756C7408000754427574746F6E00095374 + 796C654E616D65060A646F776E627574746F6E05416C69676E0706436C69656E + 740843616E466F637573080A53697A652E57696474680500000000000000C804 + 400B53697A652E4865696768740500000000000000C803401453697A652E506C + 6174666F726D44656661756C74080B5374796C654C6F6F6B757006157363726F + 6C6C626172626F74746F6D627574746F6E085461624F72646572020000000000} + end> + Left = 472 + Top = 72 + end + object SaveDialog1: TSaveDialog + Left = 368 + Top = 56 + end + object OpenDialog1: TOpenDialog + Left = 208 + Top = 96 + end + object Layout4: TLayout + Align = Bottom + Margins.Bottom = 8.000000000000000000 + Position.Y = 382.000000000000000000 + Size.Width = 592.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + object Button1: TButton + Align = Right + ModalResult = 1 + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 504.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Start' + OnClick = Button1Click + end + end + object PopupMenu1: TPopupMenu + Left = 368 + Top = 450 + object MenuItem1: TMenuItem + Text = 'MenuItem1' + end + end + object VertScrollBox1: TVertScrollBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 576.000000000000000000 + Size.Height = 366.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Viewport.Width = 560.000000000000000000 + Viewport.Height = 366.000000000000000000 + object GroupBox1: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Input' + TabOrder = 7 + object Layout1: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Edit1: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Client + TabOrder = 0 + ReadOnly = True + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 440.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + object SearchEditButton1: TSearchEditButton + CanFocus = False + Cursor = crArrow + Size.Width = 28.000000000000000000 + Size.Height = 14.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnClick = SearchEditButton1Click + end + end + object ComboBox2: TComboBox + Align = Left + Items.Strings = ( + 'File' + 'Directory' + 'URL') + ItemIndex = 0 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + OnChange = ComboBox2Change + end + end + end + object GroupBox2: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 108.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 90.000000000000000000 + Size.PlatformDefault = False + Text = 'Options' + TabOrder = 3 + object Layout3: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 15 + object Label1: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Chunk size (MB)' + TabOrder = 1 + end + object SpinBox1: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 3 + Cursor = crIBeam + DecimalDigits = 0 + Min = 16.000000000000000000 + Max = 1792.000000000000000000 + Value = 16.000000000000000000 + Increment = 16.000000000000000000 + Position.X = 116.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object Label2: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 224.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Threads' + TabOrder = 0 + end + object SpinBox2: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 2 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 1.000000000000000000 + Value = 1.000000000000000000 + Position.X = 332.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox1: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 440.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 4 + Text = 'Low memory' + end + end + object Layout2: TLayout + Align = Top + Position.Y = 52.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Label3: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Depth' + TabOrder = 0 + end + object SpinBox3: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 1 + Cursor = crIBeam + DecimalDigits = 0 + Max = 63.000000000000000000 + Position.X = 116.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox2: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 224.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 140.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 5 + Text = 'Skip verification' + end + object CheckBox6: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 372.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 140.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 4 + Text = 'Verbose' + end + end + end + object GroupBox3: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 54.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Output' + TabOrder = 0 + object Layout7: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Edit3: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Client + TabOrder = 0 + ReadOnly = True + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 440.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + object SearchEditButton3: TSearchEditButton + CanFocus = False + Cursor = crArrow + Size.Width = 28.000000000000000000 + Size.Height = 14.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnClick = SearchEditButton3Click + end + end + object ComboBox3: TComboBox + Align = Left + Items.Strings = ( + 'File' + 'None') + ItemIndex = 0 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + OnChange = ComboBox3Change + end + end + end + object GroupBox4: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 360.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Deduplication' + TabOrder = 2 + object Layout6: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 12 + object CheckBox3: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Enable' + end + object Label4: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 116.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Srep method' + TabOrder = 1 + end + object SpinBox4: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Max = 5.000000000000000000 + Value = 3.000000000000000000 + Position.X = 224.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + end + object GroupBox5: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 414.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Compression' + TabOrder = 1 + object Layout8: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 13 + object Label7: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 116.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Compression level' + TabOrder = 0 + end + object SpinBox7: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 1 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 10.000000000000000000 + Value = 6.000000000000000000 + Position.X = 224.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox5: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 332.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 160.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'High compression mode' + end + object CheckBox4: TCheckBox + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Enable' + end + end + end + object GroupBox6: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 198.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Method' + TabOrder = 4 + object Layout5: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Edit2: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Client + TabOrder = 0 + ReadOnly = True + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 440.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object Button2: TButton + Align = Right + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 456.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Configure' + OnClick = Button2Click + end + end + end + object GroupBox7: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 306.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Database' + TabOrder = 6 + object Layout9: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Edit4: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Client + TabOrder = 0 + ReadOnly = True + Enabled = False + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 440.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + object SearchEditButton2: TSearchEditButton + CanFocus = False + Cursor = crArrow + Size.Width = 28.000000000000000000 + Size.Height = 14.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnClick = SearchEditButton2Click + end + end + object ComboBox1: TComboBox + Align = Left + Items.Strings = ( + 'Disabled' + 'Internal' + 'Generate' + 'Load') + ItemIndex = 0 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + OnChange = ComboBox1Change + end + end + end + object GroupBox8: TGroupBox + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 252.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 54.000000000000000000 + Size.PlatformDefault = False + Text = 'Library checker' + TabOrder = 5 + object Layout10: TLayout + Align = Top + Margins.Top = 16.000000000000000000 + Position.Y = 16.000000000000000000 + Size.Width = 544.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 14 + object Edit5: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Client + TabOrder = 0 + ReadOnly = True + Enabled = False + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 440.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + object SearchEditButton4: TSearchEditButton + CanFocus = False + Cursor = crArrow + Size.Width = 28.000000000000000000 + Size.Height = 14.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnClick = SearchEditButton4Click + end + end + object ComboBox4: TComboBox + Align = Left + Items.Strings = ( + 'Disabled' + 'LZ4' + 'ZSTD' + 'Oodle') + ItemIndex = 0 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + OnChange = ComboBox4Change + end + end + end + end +end diff --git a/Unit1.pas b/Unit1.pas new file mode 100644 index 0000000..ab71f7c --- /dev/null +++ b/Unit1.pas @@ -0,0 +1,221 @@ +unit Unit1; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, + System.Variants, System.Math, System.StrUtils, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl, + FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit, + FMX.EditBox, FMX.SpinBox, FMX.Menus; + +type + TForm1 = class(TForm) + StyleBook1: TStyleBook; + SaveDialog1: TSaveDialog; + OpenDialog1: TOpenDialog; + Layout4: TLayout; + Button1: TButton; + GroupBox1: TGroupBox; + ComboBox2: TComboBox; + Edit1: TEdit; + SearchEditButton1: TSearchEditButton; + Layout1: TLayout; + GroupBox2: TGroupBox; + Layout3: TLayout; + VertScrollBox1: TVertScrollBox; + GroupBox3: TGroupBox; + Layout7: TLayout; + Edit3: TEdit; + SearchEditButton3: TSearchEditButton; + ComboBox3: TComboBox; + Label1: TLabel; + SpinBox1: TSpinBox; + Label2: TLabel; + SpinBox2: TSpinBox; + CheckBox1: TCheckBox; + Layout2: TLayout; + Label3: TLabel; + SpinBox3: TSpinBox; + GroupBox4: TGroupBox; + Layout6: TLayout; + GroupBox5: TGroupBox; + Layout8: TLayout; + Label7: TLabel; + SpinBox7: TSpinBox; + CheckBox5: TCheckBox; + CheckBox3: TCheckBox; + Label4: TLabel; + SpinBox4: TSpinBox; + CheckBox4: TCheckBox; + PopupMenu1: TPopupMenu; + MenuItem1: TMenuItem; + GroupBox6: TGroupBox; + Layout5: TLayout; + Edit2: TEdit; + Button2: TButton; + GroupBox7: TGroupBox; + Layout9: TLayout; + Edit4: TEdit; + SearchEditButton2: TSearchEditButton; + ComboBox1: TComboBox; + CheckBox2: TCheckBox; + CheckBox6: TCheckBox; + GroupBox8: TGroupBox; + Layout10: TLayout; + Edit5: TEdit; + SearchEditButton4: TSearchEditButton; + ComboBox4: TComboBox; + procedure FormShow(Sender: TObject); + procedure SearchEditButton1Click(Sender: TObject); + procedure SearchEditButton3Click(Sender: TObject); + procedure ComboBox3Change(Sender: TObject); + procedure Button2Click(Sender: TObject); + procedure ComboBox2Change(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure ComboBox1Change(Sender: TObject); + procedure SearchEditButton2Click(Sender: TObject); + procedure ComboBox4Change(Sender: TObject); + procedure SearchEditButton4Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + CmdStr: TArray; + +implementation + +{$R *.fmx} + +uses + Unit2; + +procedure TForm1.Button1Click(Sender: TObject); +begin + SetLength(CmdStr, 0); + Insert(ParamStr(0), CmdStr, Length(CmdStr)); + Insert('precomp', CmdStr, Length(CmdStr)); + Insert('-c' + SpinBox1.Text + 'mb', CmdStr, Length(CmdStr)); + Insert('-t' + SpinBox2.Text, CmdStr, Length(CmdStr)); + if CheckBox1.IsChecked then + Insert('-lm', CmdStr, Length(CmdStr)); + Insert('-d' + SpinBox3.Text, CmdStr, Length(CmdStr)); + if CheckBox2.IsChecked then + Insert('-s', CmdStr, Length(CmdStr)); + if CheckBox6.IsChecked then + Insert('-v', CmdStr, Length(CmdStr)); + Insert('-m' + Edit2.Text, CmdStr, Length(CmdStr)); + if ComboBox1.ItemIndex = 1 then + Insert('-db', CmdStr, Length(CmdStr)) + else if ComboBox1.ItemIndex > 1 then + Insert('-db' + Edit4.Text, CmdStr, Length(CmdStr)); + if CheckBox3.IsChecked then + Insert('-dd' + IfThen(SpinBox4.Enabled, SpinBox4.Text, ''), CmdStr, + Length(CmdStr)); + if CheckBox4.IsChecked then + Insert('--compress=' + 't' + SpinBox2.Text + ':l' + SpinBox7.Text + ':hi' + + IfThen(CheckBox5.IsChecked, '1', '0'), CmdStr, Length(CmdStr)); + Insert(Edit1.Text, CmdStr, Length(CmdStr)); + if ComboBox3.ItemIndex = 0 then + Insert(Edit3.Text, CmdStr, Length(CmdStr)); +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + Form2.Left := Form1.Left + (Form1.Width div 2) - (Form2.Width div 2); + Form2.Top := Form1.Top + (Form1.Height div 2) - (Form2.Height div 2); + Form2.ShowModal; + Form2.Close; +end; + +procedure TForm1.ComboBox1Change(Sender: TObject); +begin + Edit4.Enabled := ComboBox1.ItemIndex in [2, 3]; + Edit4.Text := ''; +end; + +procedure TForm1.ComboBox2Change(Sender: TObject); +begin + SearchEditButton1.Enabled := ComboBox2.ItemIndex <> 2; + Edit1.ReadOnly := ComboBox2.ItemIndex <> 2; + if ComboBox2.ItemIndex = 2 then + Edit1.Text := 'http://mattmahoney.net/dc/silesia.zip' + else + Edit1.Text := ''; +end; + +procedure TForm1.ComboBox3Change(Sender: TObject); +begin + Edit3.Enabled := ComboBox3.ItemIndex <> 1; +end; + +procedure TForm1.ComboBox4Change(Sender: TObject); +begin + Edit5.Enabled := ComboBox4.ItemIndex > 0; + Edit5.Text := ''; +end; + +procedure TForm1.FormShow(Sender: TObject); +var + I: Integer; +begin + for I := 0 to ComponentCount - 1 do + if Components[I] is TSpinBox then + TSpinBox(Components[I]).Cursor := crDefault; + SpinBox2.Max := CPUCount * 2; + SpinBox2.Value := Max(1, CPUCount div 2); +end; + +procedure TForm1.SearchEditButton1Click(Sender: TObject); +var + Dir: string; +begin + case ComboBox2.ItemIndex of + 0: + begin + OpenDialog1.FileName := ''; + if OpenDialog1.Execute then + Edit1.Text := OpenDialog1.FileName; + end; + 1: + if SelectDirectory('', '', Dir) then + Edit1.Text := Dir; + end; +end; + +procedure TForm1.SearchEditButton2Click(Sender: TObject); +begin + if ComboBox1.ItemIndex = 2 then + begin + SaveDialog1.FileName := ''; + if SaveDialog1.Execute then + Edit4.Text := SaveDialog1.FileName; + end + else if ComboBox1.ItemIndex = 3 then + begin + OpenDialog1.FileName := ''; + if OpenDialog1.Execute then + Edit4.Text := OpenDialog1.FileName; + end; +end; + +procedure TForm1.SearchEditButton3Click(Sender: TObject); +begin + SaveDialog1.FileName := ''; + if SaveDialog1.Execute then + Edit3.Text := SaveDialog1.FileName; +end; + +procedure TForm1.SearchEditButton4Click(Sender: TObject); +var + Dir: string; +begin + if SelectDirectory('', '', Dir) then + Edit5.Text := Dir; +end; + +end. diff --git a/Unit2.fmx b/Unit2.fmx new file mode 100644 index 0000000..2ce35f6 --- /dev/null +++ b/Unit2.fmx @@ -0,0 +1,1287 @@ +object Form2: TForm2 + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = Single + Caption = 'XTool' + ClientHeight = 420 + ClientWidth = 300 + Position = OwnerFormCenter + StyleBook = Form1.StyleBook1 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnShow = FormShow + DesignerMasterStyle = 0 + object TabControl1: TTabControl + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 284.000000000000000000 + Size.Height = 376.000000000000000000 + Size.PlatformDefault = False + TabIndex = 0 + TabOrder = 0 + TabPosition = PlatformDefault + Sizes = ( + 284s + 354s + 284s + 354s) + object TabItem1: TTabItem + CustomIcon = < + item + end> + IsSelected = True + Size.Width = 101.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + StyleLookup = '' + TabOrder = 0 + Text = 'Internal codecs' + ExplicitSize.cx = 101.000000000000000000 + ExplicitSize.cy = 26.000000000000000000 + object VertScrollBox1: TVertScrollBox + Align = Client + Size.Width = 284.000000000000000000 + Size.Height = 354.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Viewport.Width = 268.000000000000000000 + Viewport.Height = 354.000000000000000000 + object Expander1: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 242.000000000000000000 + Size.PlatformDefault = False + Text = 'ZLib' + TabOrder = 5 + ContentSize = '217' + object Layout6: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 37 + object CheckBox3: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'ZLib' + OnChange = CheckBox3Change + end + end + object Layout1: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object Label4: TLabel + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Window bits' + TabOrder = 1 + end + object SpinBox4: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 8.000000000000000000 + Max = 15.000000000000000000 + Value = 15.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + object Layout2: TLayout + Align = Top + Position.Y = 72.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 36 + object CheckBox1: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Reflate' + OnChange = CheckBox1Change + end + end + object Layout3: TLayout + Align = Top + Position.Y = 108.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object Label1: TLabel + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Level' + TabOrder = 1 + end + object SpinBox1: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 6.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + object Layout4: TLayout + Align = Top + Position.Y = 144.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 35 + object CheckBox2: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Preflate' + end + end + object Layout28: TLayout + Align = Top + Position.Y = 180.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 34 + object CheckBox20: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'PNG Preprocessor (Depth +1)' + end + end + end + object Expander2: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 258.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 278.000000000000000000 + Size.PlatformDefault = False + Text = 'LZ4' + TabOrder = 0 + ContentSize = '253' + object Layout5: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 38 + object CheckBox4: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'LZ4 (Experimental)' + OnChange = CheckBox4Change + end + end + object Layout7: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 35 + object Label2: TLabel + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Acceleration' + TabOrder = 1 + end + object SpinBox2: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 16.000000000000000000 + Value = 1.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + object Layout8: TLayout + Align = Top + Position.Y = 72.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 37 + object CheckBox5: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'LZ4HC (Experimental)' + OnChange = CheckBox5Change + end + end + object Layout9: TLayout + Align = Top + Position.Y = 108.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 34 + object SpinBox3: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 2.000000000000000000 + Max = 12.000000000000000000 + Value = 9.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox24: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox24Change + end + end + object Layout10: TLayout + Align = Top + Position.Y = 144.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 36 + object CheckBox6: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'LZ4F' + OnChange = CheckBox6Change + end + end + object Layout11: TLayout + Align = Top + Position.Y = 216.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object SpinBox5: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 2.000000000000000000 + Max = 12.000000000000000000 + Value = 9.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox23: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox23Change + end + end + object Layout12: TLayout + Align = Top + Position.Y = 180.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object Label6: TLabel + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Block dependency' + TabOrder = 1 + end + object SpinBox6: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Max = 1.000000000000000000 + Value = 1.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + end + object Expander3: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 544.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 134.000000000000000000 + Size.PlatformDefault = False + Text = 'LZO' + TabOrder = 4 + ContentSize = '109' + object Layout13: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 34 + object CheckBox7: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'LZO1X' + OnChange = CheckBox7Change + end + end + object Layout14: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object Label7: TLabel + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Mode' + TabOrder = 0 + end + object ComboBox1: TComboBox + Align = Left + Items.Strings = ( + 'LZO1X-999') + ItemIndex = 0 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + end + end + object Layout15: TLayout + Align = Top + Position.Y = 72.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object SpinBox8: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 9.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox25: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox25Change + end + end + end + object Expander4: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 686.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 98.000000000000000000 + Size.PlatformDefault = False + Text = 'ZSTD' + TabOrder = 3 + ContentSize = '73' + object Layout16: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object CheckBox8: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'ZSTD' + OnChange = CheckBox8Change + end + end + object Layout18: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object SpinBox7: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 22.000000000000000000 + Value = 19.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox9: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox9Change + end + end + end + object Expander5: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 792.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 456.000000000000000000 + Size.PlatformDefault = False + Text = 'Oodle' + TabOrder = 1 + ContentSize = '431' + object Layout17: TLayout + Align = Top + Position.Y = 72.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 43 + object CheckBox10: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Kraken' + OnChange = CheckBox10Change + end + end + object Layout19: TLayout + Align = Top + Position.Y = 108.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 38 + object SpinBox9: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 4.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox11: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox11Change + end + end + object Layout20: TLayout + Align = Top + Position.Y = 144.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 42 + object CheckBox12: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Mermaid' + OnChange = CheckBox12Change + end + end + object Layout21: TLayout + Align = Top + Position.Y = 180.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 37 + object SpinBox10: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 4.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox13: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox13Change + end + end + object Layout22: TLayout + Align = Top + Position.Y = 216.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 41 + object CheckBox14: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Selkie' + OnChange = CheckBox14Change + end + end + object Layout23: TLayout + Align = Top + Position.Y = 252.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 36 + object SpinBox11: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 4.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox15: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox15Change + end + end + object Layout24: TLayout + Align = Top + Position.Y = 288.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 40 + object CheckBox16: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Hydra (Experimental)' + OnChange = CheckBox16Change + end + end + object Layout25: TLayout + Align = Top + Position.Y = 324.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 35 + object SpinBox12: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 4.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox17: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox17Change + end + end + object Layout26: TLayout + Align = Top + Position.Y = 360.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 39 + object CheckBox18: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Leviathan (Experimental)' + OnChange = CheckBox18Change + end + end + object Layout27: TLayout + Align = Top + Position.Y = 396.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 34 + object SpinBox13: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 9.000000000000000000 + Value = 4.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object CheckBox19: TCheckBox + Align = Left + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Level' + OnChange = CheckBox19Change + end + end + object Layout31: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object Label3: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 122.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'No. of scan iterations' + TabOrder = 1 + end + object SpinBox15: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 32.000000000000000000 + Max = 1024.000000000000000000 + Value = 32.000000000000000000 + Increment = 32.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + object Layout36: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object Label5: TLabel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 122.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + Text = 'Speed/size tradeoff' + TabOrder = 1 + end + object SpinBox16: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 32.000000000000000000 + Max = 1024.000000000000000000 + Value = 256.000000000000000000 + Increment = 64.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + end + end + object Expander6: TExpander + Align = Top + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 1256.000000000000000000 + ShowCheck = False + Size.Width = 252.000000000000000000 + Size.Height = 240.000000000000000000 + Size.PlatformDefault = False + Text = 'Media' + TabOrder = 2 + ContentSize = '215' + object Layout29: TLayout + Align = Top + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 37 + object CheckBox21: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'WAV audio compression' + OnChange = CheckBox21Change + end + end + object Layout30: TLayout + Align = Top + Position.Y = 36.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 35 + object SpinBox14: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + Align = Left + TabOrder = 0 + Cursor = crIBeam + DecimalDigits = 0 + Min = 1.000000000000000000 + Max = 8.000000000000000000 + Value = 5.000000000000000000 + Position.X = 138.000000000000000000 + Position.Y = 8.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + end + object RadioButton4: TRadioButton + Align = Left + GroupName = 'WAV' + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 30.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 100.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'FLAC' + OnChange = RadioButton4Change + end + end + object Layout32: TLayout + Align = Top + Position.Y = 72.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 36 + object CheckBox26: TCheckBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 236.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'JPG image compression' + OnChange = CheckBox26Change + end + end + object Layout33: TLayout + Align = Top + Position.Y = 108.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 34 + object RadioButton1: TRadioButton + Align = Client + GroupName = 'JPG' + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 214.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Brunsli' + end + end + object Layout34: TLayout + Align = Top + Position.Y = 144.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 33 + object RadioButton2: TRadioButton + Align = Client + GroupName = 'JPG' + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 214.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'PackJPG' + end + end + object Layout35: TLayout + Align = Top + Position.Y = 180.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 36.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + object RadioButton3: TRadioButton + Align = Client + GroupName = 'JPG' + Margins.Left = 30.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 214.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'JoJpeg (Experimental)' + end + end + end + end + end + object TabItem2: TTabItem + CustomIcon = < + item + end> + IsSelected = False + Size.Width = 102.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + StyleLookup = '' + TabOrder = 0 + Text = 'External codecs' + ExplicitSize.cx = 102.000000000000000000 + ExplicitSize.cy = 26.000000000000000000 + object VertScrollBox3: TVertScrollBox + Align = Client + Size.Width = 284.000000000000000000 + Size.Height = 354.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Viewport.Width = 284.000000000000000000 + Viewport.Height = 354.000000000000000000 + object Expander10: TExpander + Align = MostTop + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + ShowCheck = False + Size.Width = 268.000000000000000000 + Size.Height = 130.000000000000000000 + Size.PlatformDefault = False + Text = 'Databases (*.xtl)' + TabOrder = 2 + ContentSize = '105' + object ListBox2: TListBox + Align = Client + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Size.Width = 252.000000000000000000 + Size.Height = 97.000000000000000000 + Size.PlatformDefault = False + TabOrder = 32 + DisableFocusEffect = True + DefaultItemStyles.ItemStyle = '' + DefaultItemStyles.GroupHeaderStyle = '' + DefaultItemStyles.GroupFooterStyle = '' + ShowCheckboxes = True + Viewport.Width = 248.000000000000000000 + Viewport.Height = 93.000000000000000000 + end + end + end + end + end + object Layout37: TLayout + Align = Bottom + Margins.Bottom = 8.000000000000000000 + Position.Y = 392.000000000000000000 + Size.Width = 300.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + object Button1: TButton + Align = Right + ModalResult = 1 + Margins.Left = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Position.X = 212.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 20.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Ok' + OnClick = Button1Click + end + end +end diff --git a/Unit2.pas b/Unit2.pas new file mode 100644 index 0000000..3131eb0 --- /dev/null +++ b/Unit2.pas @@ -0,0 +1,562 @@ +unit Unit2; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, + System.Variants, System.Math, System.StrUtils, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl, + FMX.StdCtrls, FMX.Edit, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation, + FMX.Layouts, FMX.ListBox; + +type + TForm2 = class(TForm) + TabControl1: TTabControl; + TabItem1: TTabItem; + TabItem2: TTabItem; + Expander1: TExpander; + Layout6: TLayout; + CheckBox3: TCheckBox; + Layout1: TLayout; + Label4: TLabel; + SpinBox4: TSpinBox; + Layout2: TLayout; + CheckBox1: TCheckBox; + Layout3: TLayout; + Label1: TLabel; + SpinBox1: TSpinBox; + Layout4: TLayout; + CheckBox2: TCheckBox; + Expander2: TExpander; + Layout5: TLayout; + CheckBox4: TCheckBox; + Layout7: TLayout; + Label2: TLabel; + SpinBox2: TSpinBox; + Layout8: TLayout; + CheckBox5: TCheckBox; + Layout9: TLayout; + SpinBox3: TSpinBox; + Layout10: TLayout; + CheckBox6: TCheckBox; + VertScrollBox1: TVertScrollBox; + Layout11: TLayout; + SpinBox5: TSpinBox; + Layout12: TLayout; + Label6: TLabel; + SpinBox6: TSpinBox; + Expander3: TExpander; + Layout13: TLayout; + CheckBox7: TCheckBox; + Layout14: TLayout; + Label7: TLabel; + Layout15: TLayout; + SpinBox8: TSpinBox; + ComboBox1: TComboBox; + Expander4: TExpander; + Layout16: TLayout; + CheckBox8: TCheckBox; + Layout18: TLayout; + SpinBox7: TSpinBox; + CheckBox9: TCheckBox; + Expander5: TExpander; + Layout17: TLayout; + CheckBox10: TCheckBox; + Layout19: TLayout; + SpinBox9: TSpinBox; + CheckBox11: TCheckBox; + Layout20: TLayout; + CheckBox12: TCheckBox; + Layout21: TLayout; + SpinBox10: TSpinBox; + CheckBox13: TCheckBox; + Layout22: TLayout; + CheckBox14: TCheckBox; + Layout23: TLayout; + SpinBox11: TSpinBox; + CheckBox15: TCheckBox; + Layout24: TLayout; + CheckBox16: TCheckBox; + Layout25: TLayout; + SpinBox12: TSpinBox; + CheckBox17: TCheckBox; + Layout26: TLayout; + CheckBox18: TCheckBox; + Layout27: TLayout; + SpinBox13: TSpinBox; + CheckBox19: TCheckBox; + Layout28: TLayout; + CheckBox20: TCheckBox; + Expander6: TExpander; + Layout29: TLayout; + CheckBox21: TCheckBox; + Layout30: TLayout; + SpinBox14: TSpinBox; + CheckBox23: TCheckBox; + CheckBox24: TCheckBox; + CheckBox25: TCheckBox; + Layout31: TLayout; + Label3: TLabel; + SpinBox15: TSpinBox; + Layout32: TLayout; + CheckBox26: TCheckBox; + Layout33: TLayout; + RadioButton1: TRadioButton; + Layout34: TLayout; + RadioButton2: TRadioButton; + Layout35: TLayout; + RadioButton3: TRadioButton; + Layout36: TLayout; + Label5: TLabel; + SpinBox16: TSpinBox; + Layout37: TLayout; + Button1: TButton; + RadioButton4: TRadioButton; + VertScrollBox3: TVertScrollBox; + Expander10: TExpander; + ListBox2: TListBox; + procedure FormShow(Sender: TObject); + procedure CheckBox3Change(Sender: TObject); + procedure CheckBox1Change(Sender: TObject); + procedure CheckBox4Change(Sender: TObject); + procedure CheckBox5Change(Sender: TObject); + procedure CheckBox6Change(Sender: TObject); + procedure CheckBox7Change(Sender: TObject); + procedure CheckBox10Change(Sender: TObject); + procedure CheckBox8Change(Sender: TObject); + procedure CheckBox12Change(Sender: TObject); + procedure CheckBox14Change(Sender: TObject); + procedure CheckBox16Change(Sender: TObject); + procedure CheckBox18Change(Sender: TObject); + procedure CheckBox21Change(Sender: TObject); + procedure CheckBox26Change(Sender: TObject); + procedure CheckBox24Change(Sender: TObject); + procedure CheckBox23Change(Sender: TObject); + procedure CheckBox25Change(Sender: TObject); + procedure CheckBox9Change(Sender: TObject); + procedure CheckBox11Change(Sender: TObject); + procedure CheckBox13Change(Sender: TObject); + procedure CheckBox15Change(Sender: TObject); + procedure CheckBox17Change(Sender: TObject); + procedure CheckBox19Change(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure RadioButton4Change(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + + TMethod = record + FName: String; + FType: Integer; + Codecs: TArray; + end; + + TConfigCtrl = class(TObject) + private + FOwner, FParent: TFmxObject; + FExpander: TExpander; + FListBox: TListBox; + public + constructor Create(AOwner, AParent: TFmxObject); + destructor Destroy; override; + procedure SetText(AText: String); + procedure AddCodec(ACodec: String); + function GetCodec(out Codec: String): Boolean; + end; + + TLibraryCtrl = class(TObject) + private + FOwner, FParent: TFmxObject; + FExpander: TExpander; + FCheckBox: TArray; + FLayout1, FLayout2: TArray; + FLabel: TArray; + FEdit: TArray; + procedure OnCheckBoxChange(Sender: TObject); + public + constructor Create(AOwner, AParent: TFmxObject); + destructor Destroy; override; + procedure SetText(AText: String); + procedure AddCodec(ACodec: String); + function GetCodec(out Codec: String): Boolean; + end; + +var + Form2: TForm2; + Methods: TArray; + CfgCtrls: TArray; + LibCtrls: TArray; + +implementation + +{$R *.fmx} + +uses Unit1; + +procedure AddMethod(const SubStr: String; var ResStr: String; + ParamStr: TArray; ParamBool: TArray); +var + I: Integer; + S: String; +begin + if ResStr = '' then + ResStr := SubStr + else + ResStr := ResStr + '+' + SubStr; + S := ''; + for I := Low(ParamStr) to High(ParamStr) do + if ParamBool[I] then + S := S + ':' + ParamStr[I]; + ResStr := ResStr + S; +end; + +constructor TConfigCtrl.Create(AOwner, AParent: TFmxObject); +begin + inherited Create; + FOwner := AOwner; + FParent := AParent; + FExpander := TExpander.Create(FOwner); + FExpander.Parent := FParent; + FExpander.Height := 130; + FExpander.Margins.Top := 8; + FExpander.Margins.Left := 8; + FExpander.Margins.Right := 8; + FExpander.Align := TAlignLayout.Top; + FListBox := TListBox.Create(FExpander); + FListBox.Parent := FExpander; + FListBox.Margins.Bottom := 8; + FListBox.Margins.Left := 8; + FListBox.Margins.Right := 8; + FListBox.Align := TAlignLayout.Client; + FListBox.ShowCheckboxes := True; +end; + +destructor TConfigCtrl.Destroy; +begin + FListBox.Free; + FExpander.Free; + inherited Destroy; +end; + +procedure TConfigCtrl.SetText(AText: String); +begin + FExpander.Text := AText; +end; + +procedure TConfigCtrl.AddCodec(ACodec: String); +begin + FListBox.Items.Add(ACodec); +end; + +function TConfigCtrl.GetCodec(out Codec: String): Boolean; +var + I: Integer; + S: String; +begin + Result := False; + S := ''; + for I := 0 to FListBox.Items.Count - 1 do + if FListBox.ItemByIndex(I).IsChecked then + begin + S := S + ':' + FListBox.Items[I]; + Result := True; + end; + if Result then + Codec := FExpander.Text + S; +end; + +constructor TLibraryCtrl.Create(AOwner, AParent: TFmxObject); +begin + inherited Create; + FOwner := AOwner; + FParent := AParent; + FExpander := TExpander.Create(FOwner); + FExpander.Parent := FParent; + FExpander.Height := 25; + FExpander.Margins.Top := 8; + FExpander.Margins.Left := 8; + FExpander.Margins.Right := 8; + FExpander.Align := TAlignLayout.Top; +end; + +destructor TLibraryCtrl.Destroy; +begin + FExpander.Free; + inherited Destroy; +end; + +procedure TLibraryCtrl.OnCheckBoxChange(Sender: TObject); +var + I: Integer; +begin + for I := Low(FCheckBox) to High(FCheckBox) do + if Sender = FCheckBox[I] then + FEdit[I].Enabled := FCheckBox[I].IsChecked; +end; + +procedure TLibraryCtrl.SetText(AText: String); +begin + FExpander.Text := AText; +end; + +procedure TLibraryCtrl.AddCodec(ACodec: String); +var + I: Integer; +begin + I := Length(FLayout1); + Insert(TLayout.Create(FExpander), FLayout1, Length(FLayout1)); + FLayout1[I].Parent := FExpander; + FLayout1[I].Height := 64; + FLayout1[I].Align := TAlignLayout.Top; + Insert(TCheckBox.Create(FLayout1[I]), FCheckBox, Length(FCheckBox)); + FCheckBox[I].Parent := FLayout1[I]; + FCheckBox[I].Height := 20; + FCheckBox[I].Margins.Top := 8; + FCheckBox[I].Margins.Left := 8; + FCheckBox[I].Margins.Right := 8; + FCheckBox[I].Align := TAlignLayout.Top; + FCheckBox[I].Text := ACodec; + FCheckBox[I].OnChange := OnCheckBoxChange; + Insert(TLayout.Create(FLayout1[I]), FLayout2, Length(FLayout2)); + FLayout2[I].Parent := FLayout1[I]; + FLayout2[I].Align := TAlignLayout.Client; + Insert(TLabel.Create(FLayout2[I]), FLabel, Length(FLabel)); + FLabel[I].Parent := FLayout2[I]; + FLabel[I].Width := 40; + FLabel[I].Margins.Top := 8; + FLabel[I].Margins.Bottom := 8; + FLabel[I].Margins.Left := 8; + FLabel[I].Align := TAlignLayout.Left; + FLabel[I].Text := 'Param'; + Insert(TEdit.Create(FLayout2[I]), FEdit, Length(FEdit)); + FEdit[I].Parent := FLayout2[I]; + FEdit[I].Enabled := False; + FEdit[I].Margins.Top := 8; + FEdit[I].Margins.Bottom := 8; + FEdit[I].Margins.Left := 8; + FEdit[I].Margins.Right := 8; + FEdit[I].Align := TAlignLayout.Client; + FExpander.Height := FExpander.Height + 64; +end; + +function TLibraryCtrl.GetCodec(out Codec: String): Boolean; +var + I: Integer; + S: String; +begin + Result := False; + S := ''; + for I := Low(FCheckBox) to High(FCheckBox) do + if FCheckBox[I].IsChecked then + begin + AddMethod(FCheckBox[I].Text, S, [FEdit[I].Text], [FEdit[I].Text <> '']); + Result := True; + end; + if Result then + Codec := S; +end; + +procedure TForm2.Button1Click(Sender: TObject); +var + I: Integer; + S, Res: String; +begin + Res := ''; + if CheckBox3.IsChecked then + AddMethod('zlib', Res, ['w' + SpinBox4.Text], [True]); + if CheckBox1.IsChecked then + AddMethod('reflate', Res, ['l' + SpinBox1.Text], [True]); + if CheckBox2.IsChecked then + AddMethod('preflate', Res, [], []); + if CheckBox20.IsChecked then + AddMethod('png', Res, [], []); + if CheckBox4.IsChecked then + AddMethod('lz4', Res, ['a' + SpinBox2.Text], [True]); + if CheckBox5.IsChecked then + AddMethod('lz4hc', Res, ['l' + SpinBox3.Text], [CheckBox24.IsChecked]); + if CheckBox6.IsChecked then + AddMethod('lz4f', Res, ['l' + SpinBox5.Text, 'd' + SpinBox6.Text], + [CheckBox23.IsChecked, True]); + if CheckBox7.IsChecked then + AddMethod('lzo1x', Res, ['l' + SpinBox8.Text], [CheckBox25.IsChecked]); + if CheckBox8.IsChecked then + AddMethod('zstd', Res, ['l' + SpinBox7.Text], [CheckBox9.IsChecked]); + if CheckBox10.IsChecked then + AddMethod('kraken', Res, ['l' + SpinBox9.Text, 'n' + SpinBox15.Text, + 't' + SpinBox16.Text], [CheckBox11.IsChecked, True, True]); + if CheckBox12.IsChecked then + AddMethod('mermaid', Res, ['l' + SpinBox10.Text, 'n' + SpinBox15.Text, + 't' + SpinBox16.Text], [CheckBox13.IsChecked, True, True]); + if CheckBox14.IsChecked then + AddMethod('selkie', Res, ['l' + SpinBox11.Text, 'n' + SpinBox15.Text, + 't' + SpinBox16.Text], [CheckBox15.IsChecked, True, True]); + if CheckBox16.IsChecked then + AddMethod('hydra', Res, ['l' + SpinBox12.Text, 'n' + SpinBox15.Text, + 't' + SpinBox16.Text], [CheckBox17.IsChecked, True, True]); + if CheckBox18.IsChecked then + AddMethod('leviathan', Res, ['l' + SpinBox13.Text, 'n' + SpinBox15.Text, + 't' + SpinBox16.Text], [CheckBox19.IsChecked, True, True]); + if CheckBox21.IsChecked then + AddMethod('flac', Res, ['l' + SpinBox14.Text], [RadioButton4.IsChecked]); + if CheckBox26.IsChecked and RadioButton1.IsChecked then + AddMethod('brunsli', Res, [], []); + if CheckBox26.IsChecked and RadioButton2.IsChecked then + AddMethod('packjpg', Res, [], []); + if CheckBox26.IsChecked and RadioButton3.IsChecked then + AddMethod('jojpeg', Res, [], []); + for I := 0 to ListBox2.Items.Count - 1 do + if ListBox2.ItemByIndex(I).IsChecked then + AddMethod(ListBox2.Items[I], Res, [], []); + for I := Low(CfgCtrls) to High(CfgCtrls) do + if CfgCtrls[I].GetCodec(S) then + AddMethod(S, Res, [], []); + for I := Low(LibCtrls) to High(LibCtrls) do + if LibCtrls[I].GetCodec(S) then + AddMethod(S, Res, [], []); + Form1.Edit2.Text := Res; +end; + +procedure TForm2.CheckBox10Change(Sender: TObject); +begin + Layout19.Enabled := CheckBox10.IsChecked; +end; + +procedure TForm2.CheckBox11Change(Sender: TObject); +begin + SpinBox9.Enabled := CheckBox11.IsChecked; +end; + +procedure TForm2.CheckBox12Change(Sender: TObject); +begin + Layout21.Enabled := CheckBox12.IsChecked; +end; + +procedure TForm2.CheckBox13Change(Sender: TObject); +begin + SpinBox10.Enabled := CheckBox13.IsChecked; +end; + +procedure TForm2.CheckBox14Change(Sender: TObject); +begin + Layout23.Enabled := CheckBox14.IsChecked; +end; + +procedure TForm2.CheckBox15Change(Sender: TObject); +begin + SpinBox11.Enabled := CheckBox15.IsChecked; +end; + +procedure TForm2.CheckBox16Change(Sender: TObject); +begin + Layout25.Enabled := CheckBox16.IsChecked; +end; + +procedure TForm2.CheckBox17Change(Sender: TObject); +begin + SpinBox12.Enabled := CheckBox17.IsChecked; +end; + +procedure TForm2.CheckBox18Change(Sender: TObject); +begin + Layout27.Enabled := CheckBox18.IsChecked; +end; + +procedure TForm2.CheckBox19Change(Sender: TObject); +begin + SpinBox13.Enabled := CheckBox19.IsChecked; +end; + +procedure TForm2.CheckBox1Change(Sender: TObject); +begin + Layout3.Enabled := CheckBox1.IsChecked; +end; + +procedure TForm2.CheckBox21Change(Sender: TObject); +begin + Layout30.Enabled := CheckBox21.IsChecked; +end; + +procedure TForm2.CheckBox23Change(Sender: TObject); +begin + SpinBox5.Enabled := CheckBox23.IsChecked; +end; + +procedure TForm2.CheckBox24Change(Sender: TObject); +begin + SpinBox3.Enabled := CheckBox24.IsChecked; +end; + +procedure TForm2.CheckBox25Change(Sender: TObject); +begin + SpinBox8.Enabled := CheckBox25.IsChecked; +end; + +procedure TForm2.CheckBox26Change(Sender: TObject); +begin + Layout33.Enabled := CheckBox26.IsChecked; + Layout34.Enabled := CheckBox26.IsChecked; + Layout35.Enabled := CheckBox26.IsChecked; +end; + +procedure TForm2.CheckBox3Change(Sender: TObject); +begin + Layout1.Enabled := CheckBox3.IsChecked; +end; + +procedure TForm2.CheckBox4Change(Sender: TObject); +begin + Layout7.Enabled := CheckBox4.IsChecked; +end; + +procedure TForm2.CheckBox5Change(Sender: TObject); +begin + Layout9.Enabled := CheckBox5.IsChecked; +end; + +procedure TForm2.CheckBox6Change(Sender: TObject); +begin + Layout11.Enabled := CheckBox6.IsChecked; + Layout12.Enabled := CheckBox6.IsChecked; +end; + +procedure TForm2.CheckBox7Change(Sender: TObject); +begin + Layout14.Enabled := CheckBox7.IsChecked; + Layout15.Enabled := CheckBox7.IsChecked; +end; + +procedure TForm2.CheckBox8Change(Sender: TObject); +begin + Layout18.Enabled := CheckBox8.IsChecked; +end; + +procedure TForm2.CheckBox9Change(Sender: TObject); +begin + SpinBox7.Enabled := CheckBox9.IsChecked; +end; + +procedure TForm2.FormShow(Sender: TObject); +var + I: Integer; +begin + for I := 0 to ComponentCount - 1 do + begin + if Components[I] is TSpinBox then + TSpinBox(Components[I]).Cursor := crDefault; + if Components[I] is TCheckBox then + if Assigned(TCheckBox(Components[I]).OnChange) then + TCheckBox(Components[I]).OnChange(nil); + if Components[I] is TRadioButton then + if Assigned(TRadioButton(Components[I]).OnChange) then + TRadioButton(Components[I]).OnChange(nil); + end; +end; + +procedure TForm2.RadioButton4Change(Sender: TObject); +begin + SpinBox14.Enabled := RadioButton4.IsChecked; +end; + +end. diff --git a/changes.txt b/changes.txt index c1631d3..ec4bced 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,22 @@ + ES_R44 (0.6.9) + - added library checker (trial and error) + - improved user interface + - fixed bugs related to oodle scanner + - skip verification no longer applies to encryption codecs + + ES_R43 (0.6.8) + - added advanced configuration based plugin support + - added UI mode when xtool.exe is launched with xtoolui.dll present + - added skip verification mode + - xtool now enforces w15 deflate stream detection by default + - fixed oodle scanner exceptions when incomplete stream is detected + - fixed issue with zlib codec not accepting streams from database plugins + - updated command line syntax + + ES_R42 (0.6.7) + - fixed oodle scanner exceptions when incorrect library is used + - fixed issues with deduplication feature + ES_R41 (0.6.6) - fixed issues with exporting precompression database - fixed issues with deduplication feature consuming a lot of system memory @@ -6,7 +25,7 @@ ES_R40 (0.6.5) - updated oodle scanner - - remove xdelta support from oodle and lzo codecs (crc mismatch often generates large diff files) + - removed xdelta support from oodle and lzo codecs (crc mismatch often generates large diff files) ES_R39 (0.6.4) - fixed issues with lzo2a and lzo1c codecs diff --git a/common/Utils.pas b/common/Utils.pas index 8169d5a..745b55a 100644 --- a/common/Utils.pas +++ b/common/Utils.pas @@ -96,10 +96,13 @@ type end; TNullStream = class(TStream) + private + FPosition, FSize: Int64; public constructor Create; - destructor Destroy; override; + function Read(var Buffer; Count: LongInt): LongInt; override; function Write(const Buffer; Count: LongInt): LongInt; override; + function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; end; TArrayStream = class(TStream) @@ -136,33 +139,6 @@ type procedure Update(Index: Integer; MaxSize: Int64); end; - TPointersStream = class(TStream) - protected - function GetSize: Int64; override; - procedure SetSize(NewSize: LongInt); override; - procedure SetSize(const NewSize: Int64); override; - private - FPointers: TArray; - FSizes: TArray; - FPosition, FSize: NativeInt; - FMaxSize: NativeInt; - FIndex, FCount: Integer; - FIndexPos: NativeInt; - procedure Recalculate; - public - constructor Create; - destructor Destroy; override; - function Read(var Buffer; Count: LongInt): LongInt; override; - function Write(const Buffer; Count: LongInt): LongInt; override; - function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; - function Add(Ptr: Pointer; Size: NativeInt): Integer; - procedure Delete(Index: Integer); - procedure Insert(Index: Integer; Ptr: Pointer; Size: NativeInt); - procedure Clear; - property Count: Integer read FCount; - property Capacity: NativeInt read FMaxSize; - end; - TMemoryStreamEx = class(TMemoryStream) private FOwnMemory: Boolean; @@ -255,7 +231,10 @@ type end; TBufferedStream = class(TStream) + protected + function GetSize: Int64; override; private + FSize: Int64; FReadMode: Boolean; FMemory: PByte; FBufferSize: Integer; @@ -487,6 +466,7 @@ function GetFileList(const APath: TArray; SubDir: Boolean = True) procedure FileReadBuffer(Handle: THandle; var Buffer; Count: NativeInt); procedure FileWriteBuffer(Handle: THandle; const Buffer; Count: NativeInt); procedure CloseHandleEx(var Handle: THandle); +function ExpandPath(const AFileName: string): String; function Exec(Executable, CommandLine, WorkDir: string): Boolean; function ExecStdin(Executable, CommandLine, WorkDir: string; InBuff: Pointer; @@ -745,18 +725,37 @@ end; constructor TNullStream.Create; begin inherited Create; + FPosition := 0; + FSize := 0; end; -destructor TNullStream.Destroy; +function TNullStream.Read(var Buffer; Count: LongInt): LongInt; begin - inherited Destroy; + Inc(FPosition, Count); + Result := Count; end; function TNullStream.Write(const Buffer; Count: LongInt): LongInt; begin + Inc(FPosition, Count); + if FSize < FPosition then + FSize := FPosition; Result := Count; end; +function TNullStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; +begin + case Origin of + soBeginning: + FPosition := Offset; + soCurrent: + Inc(FPosition, Offset); + soEnd: + FPosition := FSize + Offset; + end; + Result := Position; +end; + constructor TArrayStream.Create; begin inherited Create; @@ -948,102 +947,6 @@ begin FStreams[Index].MaxSize := MaxSize; end; -constructor TPointersStream.Create; -begin - inherited Create; - Clear; - Recalculate; -end; - -destructor TPointersStream.Destroy; -begin - Clear; - inherited Destroy; -end; - -function TPointersStream.GetSize: Int64; -begin - Result := FSize; -end; - -procedure TPointersStream.SetSize(NewSize: LongInt); -begin - SetSize(Int64(NewSize)); -end; - -procedure TPointersStream.SetSize(const NewSize: Int64); -var - OldPosition: NativeInt; -begin - OldPosition := FPosition; - if NewSize <= FMaxSize then - FSize := NewSize; - if OldPosition > NewSize then - Seek(0, soEnd); -end; - -procedure TPointersStream.Recalculate; -var - I: Integer; -begin - FMaxSize := 0; - for I := 0 to FCount - 1 do - Inc(FMaxSize, FSizes[I]); - if FPosition > FMaxSize then - FPosition := FMaxSize; - if FSize > FMaxSize then - FSize := FMaxSize; -end; - -function TPointersStream.Read(var Buffer; Count: LongInt): LongInt; -begin - // 2121212 -end; - -function TPointersStream.Write(const Buffer; Count: LongInt): LongInt; -begin - -end; - -function TPointersStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; -begin - -end; - -function TPointersStream.Add(Ptr: Pointer; Size: NativeInt): Integer; -begin - System.Insert(Ptr, FPointers, FCount); - System.Insert(Size, FSizes, FCount); - Result := FCount; - Inc(FCount); - Recalculate; -end; - -procedure TPointersStream.Delete(Index: Integer); -begin - System.Delete(FPointers, Index, 1); - Dec(FCount); - Recalculate; -end; - -procedure TPointersStream.Insert(Index: Integer; Ptr: Pointer; Size: NativeInt); -begin - System.Insert(Ptr, FPointers, Index); - System.Insert(Size, FSizes, Index); - Inc(FCount); - Recalculate; -end; - -procedure TPointersStream.Clear; -begin - SetLength(FPointers, 0); - SetLength(FSizes, 0); - FCount := 0; - FPosition := 0; - FSize := 0; - FMaxSize := 0; -end; - constructor TMemoryStreamEx.Create(AOwnMemory: Boolean; const AMemory: Pointer; AMaxSize: NativeInt); begin @@ -1603,6 +1506,11 @@ begin inherited Destroy; end; +function TBufferedStream.GetSize: Int64; +begin + Result := FSize; +end; + function TBufferedStream.Read(var Buffer; Count: Integer): Integer; var I, FCount: Integer; @@ -1643,6 +1551,7 @@ begin end; end; Result := Count - FCount; + Inc(FSize, Result); end; function TBufferedStream.Write(const Buffer; Count: Integer): Integer; @@ -1693,6 +1602,7 @@ begin end; end; Result := Count - FCount; + Inc(FSize, Result); end; procedure TBufferedStream.Flush; @@ -3502,6 +3412,16 @@ begin end; end; +function ExpandPath(const AFileName: string): String; +begin + if AFileName = '' then + Result := '' + else if Pos(':', AFileName) > 0 then + Result := AFileName + else + Result := ExtractFilePath(GetModuleName) + AFileName; +end; + function Exec(Executable, CommandLine, WorkDir: string): Boolean; var StartupInfo: TStartupInfo; diff --git a/imports/LZ4DLL.pas b/imports/LZ4DLL.pas index d874fa6..e4df675 100644 --- a/imports/LZ4DLL.pas +++ b/imports/LZ4DLL.pas @@ -3,7 +3,7 @@ unit LZ4DLL; interface uses - LibImport, + Utils, LibImport, WinAPI.Windows, System.SysUtils, System.Math; @@ -271,7 +271,7 @@ var procedure Init(Filename: String); begin - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename); + Lib := TLibImport.Create(ExpandPath(Filename)); if Lib.Loaded then begin @LZ4_decompress_safe := Lib.GetProcAddr('LZ4_decompress_safe'); @@ -311,7 +311,8 @@ begin end; const - DLLParam = '--lz4='; + DLLParam1 = '--lz4='; + DLLParam2 = '-l4'; var I: Integer; @@ -321,11 +322,18 @@ initialization DLLFile := 'liblz4.dll'; for I := 1 to ParamCount do - if ParamStr(I).StartsWith(DLLParam) then +begin + if ParamStr(I).StartsWith(DLLParam1) then begin - DLLFile := ParamStr(I).Substring(DLLParam.Length); + DLLFile := ParamStr(I).Substring(DLLParam1.Length); break; end; + if ParamStr(I).StartsWith(DLLParam2) then + begin + DLLFile := ParamStr(I).Substring(DLLParam2.Length); + break; + end; +end; Init(DLLFile); diff --git a/imports/LZODLL.pas b/imports/LZODLL.pas index 7c82711..04deb5d 100644 --- a/imports/LZODLL.pas +++ b/imports/LZODLL.pas @@ -3,7 +3,7 @@ unit LZODLL; interface uses - LibImport, + Utils, LibImport, WinAPI.Windows, System.SysUtils; @@ -70,7 +70,7 @@ var procedure Init(Filename: String); begin - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename); + Lib := TLibImport.Create(ExpandPath(Filename)); if Lib.Loaded then begin @lzo1x_1_compress := Lib.GetProcAddr('lzo1x_1_compress'); @@ -94,7 +94,8 @@ begin end; const - DLLParam = '--lzo='; + DLLParam1 = '-lzo='; + DLLParam2 = '-lo'; var I: integer; @@ -104,11 +105,19 @@ initialization DLLFile := 'lzo2.dll'; for I := 1 to ParamCount do - if ParamStr(I).StartsWith(DLLParam) then +begin + if ParamStr(I).StartsWith(DLLParam1) then begin - DLLFile := ParamStr(I).Substring(DLLParam.Length); + DLLFile := ParamStr(I).Substring(DLLParam1.Length); break; end; + if ParamStr(I).StartsWith(DLLParam2) then + begin + DLLFile := ParamStr(I).Substring(DLLParam2.Length); + break; + end; +end; + Init(DLLFile); finalization diff --git a/imports/OodleDLL.pas b/imports/OodleDLL.pas index eb0c18a..8f77727 100644 --- a/imports/OodleDLL.pas +++ b/imports/OodleDLL.pas @@ -3,7 +3,7 @@ unit OodleDLL; interface uses - LibImport, + Utils, LibImport, WinAPI.Windows, System.SysUtils, System.Types, System.IOUtils; @@ -82,13 +82,13 @@ var I: Integer; C: Cardinal; begin - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename); + Lib := TLibImport.Create(ExpandPath(Filename)); if not Lib.Loaded then - for I := 3 to 9 do + for I := 1 to 9 do begin Lib.Free; - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'oo2core_' + - I.ToString + '_win64.dll'); + Lib := TLibImport.Create(ExpandPath('oo2core_' + I.ToString + + '_win64.dll')); if Lib.Loaded then break; end; @@ -96,8 +96,8 @@ begin for I := 3 to 9 do begin Lib.Free; - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'oo2ext_' + - I.ToString + '_win64.dll'); + Lib := TLibImport.Create(ExpandPath('oo2ext_' + I.ToString + + '_win64.dll')); if Lib.Loaded then break; end; @@ -202,7 +202,8 @@ begin end; const - DLLParam = '--oodle='; + DLLParam1 = '--oodle='; + DLLParam2 = '-od'; var I: Integer; @@ -212,11 +213,18 @@ initialization DLLFile := 'oo2core_9_win64.dll'; for I := 1 to ParamCount do - if ParamStr(I).StartsWith(DLLParam) then +begin + if ParamStr(I).StartsWith(DLLParam1) then begin - DLLFile := ParamStr(I).Substring(DLLParam.Length); + DLLFile := ParamStr(I).Substring(DLLParam1.Length); break; end; + if ParamStr(I).StartsWith(DLLParam2) then + begin + DLLFile := ParamStr(I).Substring(DLLParam2.Length); + break; + end; +end; Init(DLLFile); finalization diff --git a/imports/ZLibDLL.pas b/imports/ZLibDLL.pas index 68fd4ff..e93eae4 100644 --- a/imports/ZLibDLL.pas +++ b/imports/ZLibDLL.pas @@ -3,7 +3,7 @@ unit ZLibDLL; interface uses - LibImport, + Utils, LibImport, WinAPI.Windows, System.SysUtils, System.Types, System.IOUtils, System.ZLib; @@ -148,16 +148,16 @@ end; procedure Init(Filename: String); begin - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename); + Lib := TLibImport.Create(ExpandPath(Filename)); if not(Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion'))) then begin Lib.Free; - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'zlibwapi.dll'); + Lib := TLibImport.Create(ExpandPath('zlibwapi.dll')); end; if not(Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion'))) then begin Lib.Free; - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'zlib1.dll'); + Lib := TLibImport.Create(ExpandPath('zlib1.dll')); end; if Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion')) then begin @@ -192,7 +192,8 @@ begin end; const - DLLParam = '--zlib='; + DLLParam1 = '--zlib='; + DLLParam2 = '-zb'; var I: integer; @@ -202,11 +203,18 @@ initialization DLLFile := 'zlibwapi.dll'; for I := 1 to ParamCount do - if ParamStr(I).StartsWith(DLLParam) then +begin + if ParamStr(I).StartsWith(DLLParam1) then begin - DLLFile := ParamStr(I).Substring(DLLParam.Length); + DLLFile := ParamStr(I).Substring(DLLParam1.Length); break; end; + if ParamStr(I).StartsWith(DLLParam2) then + begin + DLLFile := ParamStr(I).Substring(DLLParam2.Length); + break; + end; +end; Init(DLLFile); diff --git a/imports/ZSTDDLL.pas b/imports/ZSTDDLL.pas index 522324b..6cf8456 100644 --- a/imports/ZSTDDLL.pas +++ b/imports/ZSTDDLL.pas @@ -3,7 +3,7 @@ unit ZSTDDLL; interface uses - LibImport, + Utils, LibImport, WinAPI.Windows, System.SysUtils; @@ -147,7 +147,7 @@ var procedure Init(Filename: String); begin - Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename); + Lib := TLibImport.Create(ExpandPath(Filename)); if Lib.Loaded then begin @ZSTD_compress := Lib.GetProcAddr('ZSTD_compress'); @@ -185,7 +185,8 @@ begin end; const - DLLParam = '--zstd='; + DLLParam1 = '--zstd='; + DLLParam2 = '-zs'; var I: Integer; @@ -195,11 +196,19 @@ initialization DLLFile := 'libzstd.dll'; for I := 1 to ParamCount do - if ParamStr(I).StartsWith(DLLParam) then +begin + if ParamStr(I).StartsWith(DLLParam1) then begin - DLLFile := ParamStr(I).Substring(DLLParam.Length); + DLLFile := ParamStr(I).Substring(DLLParam1.Length); break; end; + if ParamStr(I).StartsWith(DLLParam2) then + begin + DLLFile := ParamStr(I).Substring(DLLParam2.Length); + break; + end; +end; + Init(DLLFile); finalization diff --git a/precompressor/PrecompDLL.pas b/precompressor/PrecompDLL.pas index 49dd018..ef5f0a4 100644 --- a/precompressor/PrecompDLL.pas +++ b/precompressor/PrecompDLL.pas @@ -4,6 +4,7 @@ interface uses Utils, + UIMain, PrecompUtils, WinAPI.Windows, System.SysUtils, System.Classes, System.StrUtils, @@ -375,6 +376,9 @@ begin @DLLStruct^.Scan2 := GetProcAddress(DLLHandle, 'PrecompScan2'); @DLLStruct^.Process := GetProcAddress(DLLHandle, 'PrecompProcess'); @DLLStruct^.Restore := GetProcAddress(DLLHandle, 'PrecompRestore'); + if UIMain.DLLLoaded then + XTLAddplugin(ChangeFileExt(ExtractFileName(DLLList[I]), ''), + PLUGIN_LIBRARY); Insert(DLLStruct^, CodecDLL, Length(CodecDLL)); J := 0; while Assigned(CodecDLL[Pred(Length(CodecDLL))].Codec(J)) do @@ -383,6 +387,8 @@ begin Insert(S, CodecDLL[Pred(Length(CodecDLL))].Names, Length(CodecDLL[Pred(Length(CodecDLL))].Names)); Insert(S, Codec.Names, Length(Codec.Names)); + if UIMain.DLLLoaded then + XTLAddCodec(S); Inc(J); end; if J = 0 then @@ -392,6 +398,8 @@ begin Length(CodecDLL[Pred(Length(CodecDLL))].Names)); Insert(ChangeFileExt(ExtractFileName(DLLList[I]), ''), Codec.Names, Length(Codec.Names)); + if UIMain.DLLLoaded then + XTLAddCodec(ChangeFileExt(ExtractFileName(DLLList[I]), '')); end; end; end; diff --git a/precompressor/PrecompINI.pas b/precompressor/PrecompINI.pas index 092618a..1fb7164 100644 --- a/precompressor/PrecompINI.pas +++ b/precompressor/PrecompINI.pas @@ -4,6 +4,7 @@ interface uses Utils, ParseExpr, + UIMain, PrecompUtils, WinAPI.Windows, System.SysUtils, System.Classes, System.StrUtils, @@ -136,7 +137,7 @@ begin if CompareText(S, Codec.Names[Y]) = 0 then begin for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do - CodecEnabled[Y][I] := True; + CodecEnabled[Y, I] := True; for Z := Low(CodecCfg[0, Y]) to High(CodecCfg[0, Y]) do if Funcs^.GetParam(Command, X, PChar(CodecCfg[0, Y, Z].Name)) <> '' then @@ -144,7 +145,7 @@ begin if not ParamsSet then begin for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do - CodecEnabled[Y][I] := False; + CodecEnabled[Y, I] := False; ParamsSet := True; end; CodecEnabled[Y, Z] := True; @@ -292,11 +293,13 @@ begin continue; end; for Y := Low(Conditions) to High(Conditions) do + begin if Round(Parser.Evaluate(Conditions[Y])) = 0 then begin Status := TScanStatus.Fail; break; end; + end; if Status = TScanStatus.None then begin Output(Instance, nil, -1); @@ -362,7 +365,7 @@ begin end; var - I, J, X, Y: Integer; + I, J, K, X, Y: Integer; SL: TStringList; Bytes: TBytes; S1, S2: String; @@ -373,8 +376,6 @@ var CfgRecArray: PCfgRecDynArray; CfgStruct: PCfgStruct; SList: TStringDynArray; - PStr1: PAnsiChar; - PStr2: PString; initialization @@ -390,13 +391,20 @@ begin begin S1 := ChangeFileExt(ExtractFileName(CfgList[I]), ''); Insert(S1, Codec.Names, Length(Codec.Names)); - New(CfgRecArray); + if UIMain.DLLLoaded then + XTLAddplugin(S1, PLUGIN_CONFIG); + SetLength(CodecCfg[0], Succ(Length(CodecCfg[0]))); + CfgRecArray := @CodecCfg[0, Pred(Length(CodecCfg[0]))]; X := 1; while ReadString('Stream' + X.ToString, 'Name', '') <> '' do begin - New(CfgRec); + J := Length(CodecCfg[0, Pred(Length(CodecCfg[0]))]); + SetLength(CodecCfg[0, Pred(Length(CodecCfg[0]))], Succ(J)); + CfgRec := @CodecCfg[0, Pred(Length(CodecCfg[0])), J]; CfgRec^.Parser := TExpressionParser.Create; CfgRec^.Name := ReadString('Stream' + X.ToString, 'Name', ''); + if UIMain.DLLLoaded then + XTLAddCodec(CfgRec^.Name); CfgRec^.Codec := ReadString('Stream' + X.ToString, 'Codec', ''); CfgRec^.BigEndian := ReadBool('Stream' + X.ToString, 'BigEndian', False); @@ -406,7 +414,11 @@ begin BStream := True; for Y := Low(SList) to High(SList) do begin - New(CfgStruct); + K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Structure); + SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])), + J].Structure, Succ(K)); + CfgStruct := @CodecCfg[0, Pred(Length(CodecCfg[0])), J] + .Structure[K]; DecodeHeader(SList[Y], S1, S2); ConvertHexChr(S2); CfgStruct^.Name := S1; @@ -422,6 +434,8 @@ begin if HexValue then begin S1 := S1.Substring(1); + while S1.Length < (CfgStruct^.Size * 2) do + S1.Insert(0, '0'); SetLength(Bytes, CfgStruct^.Size); SetLength(Bytes, HexToBin(BytesOf(S1), 0, Bytes, 0, Length(Bytes))); @@ -437,8 +451,6 @@ begin CfgStruct^.Position := Pos; CfgStruct^.Value := 0; CfgStruct^.BeforeStream := BStream; - if (CfgStruct^.Name = 'Stream') or (CfgStruct^.Size > 0) then - Insert(CfgStruct^, CfgRec^.Structure, Length(CfgRec^.Structure)); Inc(Pos, CfgStruct^.Size); if CfgStruct^.Name = 'Stream' then begin @@ -462,11 +474,10 @@ begin while ReadString('Stream' + X.ToString, 'Condition' + Y.ToString, '') <> '' do begin - New(PStr2); - PStr2^ := ReadString('Stream' + X.ToString, + S2 := ReadString('Stream' + X.ToString, 'Condition' + Y.ToString, ''); - ConvertHexChr(PStr2^); - Insert(PStr2^, CfgRec^.Conditions, Length(CfgRec^.Conditions)); + ConvertHexChr(S2); + Insert(S2, CfgRec^.Conditions, Length(CfgRec^.Conditions)); Inc(Y); end; ReadSectionValues('Stream' + X.ToString, SL); @@ -489,10 +500,8 @@ begin CfgRec^.Exprs[J] := S2; CfgRec^.Values[J] := 0; end; - Insert(CfgRec^, CfgRecArray^, Length(CfgRecArray^)); Inc(X); end; - Insert(CfgRecArray^, CodecCfg[0], Length(CodecCfg[0])); end; finally Free; @@ -504,10 +513,10 @@ for J := Low(CodecCfg[0]) to High(CodecCfg[0]) do begin with CodecCfg[0, J, X] do begin - for Y := Low(Names) to High(Names) do - Parser.DefineVariable(Names[Y], @Values[Y]); for Y := Low(Structure) to High(Structure) do Parser.DefineVariable(Structure[Y].Name, @Structure[Y].Value); + for Y := Low(Names) to High(Names) do + Parser.DefineVariable(Names[Y], @Values[Y]); end; end; diff --git a/precompressor/PrecompINIEx.pas b/precompressor/PrecompINIEx.pas new file mode 100644 index 0000000..79e4185 --- /dev/null +++ b/precompressor/PrecompINIEx.pas @@ -0,0 +1,707 @@ +unit PrecompINIEx; + +interface + +uses + Utils, ParseExpr, + UIMain, + PrecompUtils, + WinAPI.Windows, + System.SysUtils, System.Classes, System.StrUtils, + System.Types, System.Math, System.IOUtils, System.IniFiles; + +var + Codec: TPrecompressor; + +implementation + +type + PCfgStruct = ^TCfgStruct; + + TCfgStruct = record + Name: String; + Data: Pointer; + Position, Size: NativeInt; + Value: Double; + BeforeStream: Boolean; + end; + + PCfgCounter = ^TCfgCounter; + + TCfgCounter = record + StartS, EndS, StepS: String; + StartV, EndV, StepV: Double; + Current, Min, Max: Double; + end; + + PConfigRec = ^TConfigRec; + + TConfigRec = record + Parser: TExpressionParser; + Name, Codec: String; + Resource: Integer; + BigEndian: Boolean; + Structure: array [0 .. 2] of TArray; + Counter: TArray; + StreamPosition, StreamOffset, OldSize, NewSize, DepthSize: String; + Names, Exprs: TArray; + Values: TArray; + Conditions: TArray; + end; + + PCfgRecDynArray = ^TCfgRecDynArray; + TCfgRecDynArray = TArray; + +var + CfgList: TStringDynArray; + CodecCfg: TArray>; + CodecAvailable, CodecEnabled: TArray>; + +procedure EndianMove(Source, Dest: Pointer; Size: NativeInt; + BigEndian: Boolean = False); +begin + if BigEndian then + ReverseBytes(Source, Dest, Size) + else + Move(Source^, Dest^, Size); +end; + +function ConfigInit(Command: PChar; Count: Integer; + Funcs: PPrecompFuncs): Boolean; +var + I, J: Integer; + X, Y, Z: Integer; + S: String; + ParamsSet: Boolean; +begin + Result := True; + ParamsSet := False; + for X := Low(CodecAvailable) to High(CodecAvailable) do + for Y := Low(CodecAvailable[X]) to High(CodecAvailable[X]) do + begin + CodecAvailable[X, Y] := True; + CodecEnabled[X, Y] := False; + end; + SetLength(CodecCfg, Count); + for I := 1 to High(CodecCfg) do + begin + SetLength(CodecCfg[I], Length(CodecCfg[0])); + for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do + SetLength(CodecCfg[I, J], Length(CodecCfg[0, J])); + end; + for I := Low(CodecCfg) to High(CodecCfg) do + for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do + for X := Low(CodecCfg[I, J]) to High(CodecCfg[I, J]) do + with CodecCfg[I, J, X] do + begin + if I = 0 then + Resource := RegisterResources(Codec); + if I > 0 then + begin + Parser := TExpressionParser.Create; + Name := CodecCfg[0, J, X].Name; + Codec := CodecCfg[0, J, X].Codec; + Resource := CodecCfg[0, J, X].Resource; + BigEndian := CodecCfg[0, J, X].BigEndian; + for Z := Low(Structure) to High(Structure) do + begin + SetLength(Structure[Z], Length(CodecCfg[0, J, X].Structure[Z])); + for Y := Low(Structure[Z]) to High(Structure[Z]) do + begin + Structure[Z, Y].Name := CodecCfg[0, J, X].Structure[Z, Y].Name; + Structure[Z, Y].Position := CodecCfg[0, J, X].Structure[Z] + [Y].Position; + Structure[Z, Y].Size := CodecCfg[0, J, X].Structure[Z, Y].Size; + Structure[Z, Y].Value := CodecCfg[0, J, X].Structure + [Z, Y].Value; + Structure[Z, Y].BeforeStream := CodecCfg[0, J, X].Structure + [Z, Y].BeforeStream; + GetMem(Structure[Z, Y].Data, Structure[Z, Y].Size); + Move(CodecCfg[0, J, X].Structure[Z, Y].Data^, + Structure[Z, Y].Data^, Structure[Z, Y].Size); + end; + end; + SetLength(Counter, Length(CodecCfg[0, J, X].Counter)); + for Y := Low(Counter) to High(Counter) do + begin + Counter[Y].StartS := CodecCfg[0, J, X].Counter[Y].StartS; + Counter[Y].EndS := CodecCfg[0, J, X].Counter[Y].EndS; + Counter[Y].StepS := CodecCfg[0, J, X].Counter[Y].StepS; + Counter[Y].StartV := CodecCfg[0, J, X].Counter[Y].StartV; + Counter[Y].EndV := CodecCfg[0, J, X].Counter[Y].EndV; + Counter[Y].StepV := CodecCfg[0, J, X].Counter[Y].StepV; + Counter[Y].Current := CodecCfg[0, J, X].Counter[Y].Current; + Counter[Y].Min := CodecCfg[0, J, X].Counter[Y].Min; + Counter[Y].Max := CodecCfg[0, J, X].Counter[Y].Max; + end; + StreamPosition := CodecCfg[0, J, X].StreamPosition; + StreamOffset := CodecCfg[0, J, X].StreamOffset; + OldSize := CodecCfg[0, J, X].OldSize; + NewSize := CodecCfg[0, J, X].NewSize; + DepthSize := CodecCfg[0, J, X].DepthSize; + SetLength(Names, Length(CodecCfg[0, J, X].Names)); + SetLength(Exprs, Length(CodecCfg[0, J, X].Exprs)); + SetLength(Values, Length(CodecCfg[0, J, X].Values)); + for Y := Low(Names) to High(Names) do + begin + Names[Y] := CodecCfg[0, J, X].Names[Y]; + Exprs[Y] := CodecCfg[0, J, X].Exprs[Y]; + Values[Y] := CodecCfg[0, J, X].Values[Y]; + end; + SetLength(Conditions, Length(CodecCfg[0, J, X].Conditions)); + for Y := Low(Conditions) to High(Conditions) do + Conditions[Y] := CodecCfg[0, J, X].Conditions[Y]; + for Z := Low(Structure) to High(Structure) do + for Y := Low(Structure[Z]) to High(Structure[Z]) do + Parser.DefineVariable(Structure[Z, Y].Name, + @Structure[Z, Y].Value); + for Y := Low(Counter) to High(Counter) do + begin + Parser.DefineVariable('Counter' + Succ(Y).ToString, + @Counter[Y].Current); + Parser.DefineVariable('CounterMin' + Succ(Y).ToString, + @Counter[Y].Min); + Parser.DefineVariable('CounterMax' + Succ(Y).ToString, + @Counter[Y].Max); + end; + for Y := Low(Names) to High(Names) do + Parser.DefineVariable(Names[Y], @Values[Y]); + end; + end; + X := 0; + while Funcs^.GetCodec(Command, X, False) <> '' do + begin + S := Funcs^.GetCodec(Command, X, False); + for Y := Low(Codec.Names) to High(Codec.Names) do + if CompareText(S, Codec.Names[Y]) = 0 then + begin + for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do + CodecEnabled[Y, I] := True; + for Z := Low(CodecCfg[0, Y]) to High(CodecCfg[0, Y]) do + if Funcs^.GetParam(Command, X, PChar(CodecCfg[0, Y, Z].Name)) <> '' + then + begin + if not ParamsSet then + begin + for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do + CodecEnabled[Y, I] := False; + ParamsSet := True; + end; + CodecEnabled[Y, Z] := True; + end; + break; + end; + Inc(X); + end; + for X := Low(CodecEnabled) to High(CodecEnabled) do + for Y := Low(CodecEnabled[X]) to High(CodecEnabled[X]) do + if CodecEnabled[X, Y] then + AddMethod(PrecompGetCodec(PChar(CodecCfg[0, X, Y].Codec), 0, False)); +end; + +procedure ConfigFree(Funcs: PPrecompFuncs); +var + I, J: Integer; + X, Y, Z: Integer; +begin + for I := Low(CodecCfg) to High(CodecCfg) do + for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do + for X := Low(CodecCfg[I, J]) to High(CodecCfg[I, J]) do + with CodecCfg[I, J, X] do + begin + if I > 0 then + begin + for Z := Low(Structure) to High(Structure) do + for Y := Low(Structure[Z]) to High(Structure[Z]) do + FreeMem(Structure[Z, Y].Data); + end; + end; +end; + +function ConfigParse(Command: String; Option: PInteger; + Funcs: PPrecompFuncs): Boolean; +begin + Result := False; +end; + +procedure ConfigScan1(Instance, Depth: Integer; Input: PByte; + Size, SizeEx: NativeInt; Output: _PrecompOutput; Add: _PrecompAdd; + Funcs: PPrecompFuncs); +type + TScanStatus = (None, Success, Fail); +var + Status: TScanStatus; + A, B: Integer; + I, J: Integer; + X, Y: Integer; + Pos: NativeInt; + NI: NativeInt; + I64: Int64; + LoopPosInt, StreamPosInt1, StreamPosInt2, StreamOffsetInt, OldSizeInt, + NewSizeInt, DepthSizeInt: NativeInt; + LoopContinue: Boolean; + SI: _StrInfo1; + DI: TDepthInfo; + DS: TPrecompStr; + + procedure UpdateCounters(var C: TConfigRec); + var + Z: Integer; + begin + with C do + for Z := Low(Counter) to High(Counter) do + begin + Counter[Z].StartV := Parser.Evaluate(Counter[Z].StartS); + Counter[Z].EndV := Parser.Evaluate(Counter[Z].EndS); + Counter[Z].StepV := Parser.Evaluate(Counter[Z].StepS); + end; + end; + + function CheckCounters(C: TConfigRec): Boolean; + var + Z: Integer; + begin + Result := True; + with C do + for Z := Low(Counter) to High(Counter) do + if not InRange(Round(Counter[Z].Current), Min(Round(Counter[Z].StartV), + Round(Counter[Z].EndV)), Max(Round(Counter[Z].StartV), + Round(Counter[Z].EndV))) then + Exit(False); + end; + + procedure DoAddStream(C: TConfigRec); + begin + with C do + begin + Output(Instance, nil, -1); + SI.Position := StreamPosInt1 + StreamOffsetInt; + SI.OldSize := OldSizeInt; + SI.NewSize := NewSizeInt; + SI.Resource := Resource; + SI.Option := 0; + if System.Pos(SPrecompSep2, Codec) > 0 then + SI.Status := TStreamStatus.Predicted + else + SI.Status := TStreamStatus.None; + DS := Funcs^.GetDepthCodec(PChar(Codec)); + Move(DS[0], DI.Codec, SizeOf(DI.Codec)); + DI.OldSize := NewSizeInt; + DI.NewSize := DepthSizeInt; + Add(Instance, @SI, PChar(Codec), @DI); + Status := TScanStatus.Success; + end; + end; + +begin + if Depth > 0 then + Exit; + for I := Low(CodecCfg[Instance]) to High(CodecCfg[Instance]) do + for J := Low(CodecCfg[Instance, I]) to High(CodecCfg[Instance, I]) do + if CodecEnabled[I, J] then + with CodecCfg[Instance, I, J] do + for X := Low(Structure[0]) to High(Structure[0]) do + if Structure[0, X].Name = 'Signature' then + begin + Pos := 0; + while BinarySearch(Input, Pos, Size, Structure[0, X].Data, + Structure[0, X].Size, Pos) do + begin + Status := TScanStatus.None; + LoopPosInt := Pos + Structure[0, X].Size; + for Y := Low(Structure[0]) to High(Structure[0]) do + begin + if (X <> Y) then + begin + NI := Structure[0, Y].Position - Structure[0, X].Position; + LoopPosInt := Pos + Structure[0, Y].Size + NI; + if InRange(Pos + NI, 0, SizeEx - Structure[0, Y].Size) then + begin + Move((Input + Pos + NI)^, Structure[0, Y].Data^, + Structure[0, Y].Size); + I64 := 0; + EndianMove(Structure[0, Y].Data, @I64, + Min(Structure[0, Y].Size, I64.Size), BigEndian); + Structure[0, Y].Value := I64.ToDouble; + end + else + Status := TScanStatus.Fail; + end; + if Status = TScanStatus.Fail then + break; + end; + if Status = TScanStatus.Fail then + begin + Inc(Pos); + continue; + end; + UpdateCounters(CodecCfg[Instance, I, J]); + for Y := Low(Counter) to High(Counter) do + begin + Counter[Y].Current := Counter[Y].StartV; + Counter[Y].Min := Min(Counter[Y].StepV, + Counter[Y].EndV - Counter[Y].Current); + Counter[Y].Max := Max(Counter[Y].StepV, + Counter[Y].EndV - Counter[Y].Current); + end; + while CheckCounters(CodecCfg[Instance, I, J]) do + begin + Status := TScanStatus.None; + for Y := Low(Structure[1]) to High(Structure[1]) do + begin + if InRange(LoopPosInt, 0, SizeEx - Structure[1, Y].Size) + then + begin + Move((Input + LoopPosInt)^, Structure[1, Y].Data^, + Structure[1, Y].Size); + I64 := 0; + EndianMove(Structure[1, Y].Data, @I64, + Min(Structure[1, Y].Size, I64.Size), BigEndian); + Structure[1, Y].Value := I64.ToDouble; + end + else + begin + Status := TScanStatus.Fail; + break; + end; + Inc(LoopPosInt, Structure[1, Y].Size); + end; + if Status = TScanStatus.Fail then + break; + StreamPosInt1 := Pos + Round(Parser.Evaluate(StreamPosition)); + StreamPosInt2 := StreamPosInt1; + for Y := Low(Structure[2]) to High(Structure[2]) do + begin + if (Structure[2, Y].BeforeStream = True) then + begin + if Structure[2, Y].Name = 'Stream' then + begin + StreamPosInt1 := StreamPosInt2; + continue; + end; + Funcs^.ReadFuture(Instance, StreamPosInt2, + Structure[2, Y].Data, Structure[2, Y].Size); + I64 := 0; + EndianMove(Structure[2, Y].Data, @I64, + Min(Structure[2, Y].Size, I64.Size), BigEndian); + Structure[2, Y].Value := I64.ToDouble; + Inc(StreamPosInt2, Structure[2, Y].Size); + end; + end; + for A := Low(Exprs) to High(Exprs) do + begin + for B := Low(Exprs) to High(Exprs) do + try + if A = B then + continue; + Values[B] := Parser.Evaluate(Exprs[B]); + except + end; + try + Values[A] := Parser.Evaluate(Exprs[A]); + except + end; + end; + StreamOffsetInt := Round(Parser.Evaluate(StreamOffset)); + OldSizeInt := Round(Parser.Evaluate(OldSize)); + NewSizeInt := Round(Parser.Evaluate(NewSize)); + DepthSizeInt := Round(Parser.Evaluate(DepthSize)); + for Y := Low(Structure[2]) to High(Structure[2]) do + begin + if (Structure[2, Y].BeforeStream = False) then + begin + Funcs^.ReadFuture(Instance, StreamPosInt2 + OldSizeInt, + Structure[2, Y].Data, Structure[2, Y].Size); + I64 := 0; + EndianMove(Structure[2, Y].Data, @I64, + Min(Structure[2, Y].Size, I64.Size), BigEndian); + Structure[2, Y].Value := I64.ToDouble; + Inc(StreamPosInt2, Structure[2, Y].Size); + end; + end; + if Length(Conditions) = 0 then + DoAddStream(CodecCfg[Instance, I, J]) + else + for Y := Low(Conditions) to High(Conditions) do + begin + if (Round(Parser.Evaluate(Conditions[Y])) <> 0) and + (Y = High(Conditions)) then + DoAddStream(CodecCfg[Instance, I, J]) + else + break; + end; + UpdateCounters(CodecCfg[Instance, I, J]); + for Y := Low(Counter) to High(Counter) do + begin + Counter[Y].Current := Counter[Y].Current + Counter[Y].StepV; + Counter[Y].Min := + Min(Counter[Y].StepV, + Counter[Y].EndV - Counter[Y].Current); + Counter[Y].Max := + Max(Counter[Y].StepV, + Counter[Y].EndV - Counter[Y].Current); + end; + end; + Inc(Pos); + end; + end; +end; + +function ConfigScan2(Instance, Depth: Integer; Input: Pointer; Size: NativeInt; + StreamInfo: PStrInfo2; Offset: PInteger; Output: _PrecompOutput; + Funcs: PPrecompFuncs): Boolean; +begin + Result := False; +end; + +function ConfigProcess(Instance, Depth: Integer; OldInput, NewInput: Pointer; + StreamInfo: PStrInfo2; Output: _PrecompOutput; Funcs: PPrecompFuncs): Boolean; +begin + Result := False; +end; + +function ConfigRestore(Instance, Depth: Integer; Input, InputExt: Pointer; + StreamInfo: _StrInfo3; Output: _PrecompOutput; Funcs: PPrecompFuncs): Boolean; +begin + Result := False; +end; + +procedure DecodeHeader(const Header: String; out Name, Value: String); +begin + if (Pos('(', Header) > 0) and (Pos(')', Header) > 0) then + begin + Name := ReplaceStr(Header.Substring(0, Header.IndexOf('(')), ' ', ''); + Value := Header.Substring(Succ(Header.IndexOf('(')), + Header.IndexOf(')') - Succ(Header.IndexOf('('))); + end + else + Name := Header; +end; + +procedure ConvertHexChr(var S: String); +begin + S := ReplaceStr(S, '0x', '$'); + S := ReplaceStr(S, '#', '$'); +end; + +var + I, J, K, X, Y, Z: Integer; + SL: TStringList; + Bytes: TBytes; + S1, S2, S3: String; + Pos: Integer; + BStream: Boolean; + HexValue: Boolean; + CfgRec: PConfigRec; + CfgRecArray: PCfgRecDynArray; + CfgStruct: PCfgStruct; + CfgCounter: PCfgCounter; + SList: TStringDynArray; + +initialization + +CfgList := TDirectory.GetFiles(ExtractFilePath(Utils.GetModuleName), '*.ini', + TSearchOption.soTopDirectoryOnly); +SL := TStringList.Create; +SetLength(CodecCfg, 1); +for I := Low(CfgList) to High(CfgList) do +begin + with TIniFile.Create(CfgList[I]) do + try + if ReadString('StreamList1', 'Name', '') <> '' then + begin + S1 := ChangeFileExt(ExtractFileName(CfgList[I]), ''); + Insert(S1, Codec.Names, Length(Codec.Names)); + if UIMain.DLLLoaded then + XTLAddplugin(S1, PLUGIN_CONFIG); + SetLength(CodecCfg[0], Succ(Length(CodecCfg[0]))); + CfgRecArray := @CodecCfg[0, Pred(Length(CodecCfg[0]))]; + X := 1; + while ReadString('StreamList' + X.ToString, 'Name', '') <> '' do + begin + J := Length(CodecCfg[0, Pred(Length(CodecCfg[0]))]); + SetLength(CodecCfg[0, Pred(Length(CodecCfg[0]))], Succ(J)); + CfgRec := @CodecCfg[0, Pred(Length(CodecCfg[0])), J]; + CfgRec^.Parser := TExpressionParser.Create; + CfgRec^.Name := ReadString('StreamList' + X.ToString, 'Name', ''); + if UIMain.DLLLoaded then + XTLAddCodec(CfgRec^.Name); + CfgRec^.Codec := ReadString('StreamList' + X.ToString, 'Codec', ''); + CfgRec^.BigEndian := ReadBool('StreamList' + X.ToString, + 'BigEndian', False); + for Z := Low(CfgRec^.Structure) to High(CfgRec^.Structure) do + begin + case Z of + 0: + S3 := 'Structure1'; + 1: + S3 := 'StructureN'; + 2: + S3 := 'StructureS'; + end; + SList := DecodeStr(ReadString('StreamList' + X.ToString, S3, + ''), ','); + Pos := 0; + BStream := True; + for Y := Low(SList) to High(SList) do + begin + K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])), + J].Structure[Z]); + SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Structure + [Z], Succ(K)); + CfgStruct := @CodecCfg[0, Pred(Length(CodecCfg[0])), J] + .Structure[Z, K]; + DecodeHeader(SList[Y], S1, S2); + ConvertHexChr(S2); + CfgStruct^.Name := S1; + CfgStruct^.Size := + Round(IfThen(S2 <> '', CfgRec^.Parser.Evaluate(S2), 0)); + GetMem(CfgStruct^.Data, CfgStruct^.Size); + if (Z = 0) and (CfgStruct^.Name = 'Signature') then + begin + S1 := ReplaceStr(ReadString('StreamList' + X.ToString, + 'Signature', '0'), ' ', ''); + ConvertHexChr(S1); + HexValue := S1[1] = '$'; + if HexValue then + begin + S1 := S1.Substring(1); + while S1.Length < (CfgStruct^.Size * 2) do + S1.Insert(0, '0'); + SetLength(Bytes, CfgStruct^.Size); + SetLength(Bytes, HexToBin(BytesOf(S1), 0, Bytes, 0, + Length(Bytes))); + ReverseBytes(@Bytes[0], CfgStruct^.Data, CfgStruct^.Size); + end + else + begin + Bytes := BytesOf(S1); + SetLength(Bytes, CfgStruct^.Size); + Move(Bytes[0], CfgStruct^.Data^, CfgStruct^.Size); + end; + end; + CfgStruct^.Position := Pos; + CfgStruct^.Value := 0; + CfgStruct^.BeforeStream := BStream; + Inc(Pos, CfgStruct^.Size); + if (Z = 2) and (CfgStruct^.Name = 'Stream') then + begin + Pos := 0; + BStream := False; + end; + end; + end; + Y := 1; + while ReadString('StreamList' + X.ToString, + 'CounterStart' + Y.ToString, '') <> '' do + begin + K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Counter); + SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])), + J].Counter, Succ(K)); + CfgCounter := @CodecCfg[0, Pred(Length(CodecCfg[0])), J].Counter[K]; + CfgCounter^.StartS := ReadString('StreamList' + X.ToString, + 'CounterStart' + Y.ToString, ''); + CfgCounter^.EndS := ReadString('StreamList' + X.ToString, + 'CounterEnd' + Y.ToString, ''); + CfgCounter^.StepS := ReadString('StreamList' + X.ToString, + 'CounterStep' + Y.ToString, ''); + CfgCounter^.StartV := 0; + CfgCounter^.EndV := 0; + CfgCounter^.StepV := 0; + CfgCounter^.Current := 0; + CfgCounter^.Min := 0; + CfgCounter^.Max := 0; + Inc(Y); + end; + CfgRec^.StreamPosition := ReadString('StreamList' + X.ToString, + 'StreamPosition', ''); + CfgRec^.StreamOffset := ReadString('StreamList' + X.ToString, + 'StreamOffset', '0'); + ConvertHexChr(CfgRec^.StreamOffset); + CfgRec^.OldSize := ReadString('StreamList' + X.ToString, + 'CompressedSize', '0'); + ConvertHexChr(CfgRec^.OldSize); + CfgRec^.NewSize := ReadString('StreamList' + X.ToString, + 'DecompressedSize', '0'); + ConvertHexChr(CfgRec^.NewSize); + CfgRec^.DepthSize := ReadString('StreamList' + X.ToString, + 'DepthSize', '0'); + ConvertHexChr(CfgRec^.DepthSize); + Y := 1; + while ReadString('StreamList' + X.ToString, 'Condition' + Y.ToString, + '') <> '' do + begin + S2 := ReadString('StreamList' + X.ToString, + 'Condition' + Y.ToString, ''); + ConvertHexChr(S2); + Insert(S2, CfgRec^.Conditions, Length(CfgRec^.Conditions)); + Inc(Y); + end; + ReadSectionValues('StreamList' + X.ToString, SL); + for J := SL.Count - 1 downto 0 do + begin + S1 := SL[J].Substring(0, SL[J].IndexOf('=')).TrimRight; + S2 := SL[J].Substring(Succ(SL[J].IndexOf('='))).TrimLeft; + if (IndexText(S1, ['Name', 'Codec', 'BigEndian', 'Signature', + 'Structure1', 'StructureN', 'StructureS']) >= 0) or + S1.StartsWith('Condition', True) or S1.StartsWith('CounterStart', + True) or S1.StartsWith('CounterEnd', True) or + S1.StartsWith('CounterStep', True) then + SL.Delete(J); + end; + SetLength(CfgRec^.Names, SL.Count); + SetLength(CfgRec^.Exprs, SL.Count); + SetLength(CfgRec^.Values, SL.Count); + for J := 0 to SL.Count - 1 do + begin + S1 := SL[J].Substring(0, SL[J].IndexOf('=')).TrimRight; + S2 := SL[J].Substring(Succ(SL[J].IndexOf('='))).TrimLeft; + CfgRec^.Names[J] := S1; + CfgRec^.Exprs[J] := S2; + CfgRec^.Values[J] := 0; + end; + Inc(X); + end; + end; + finally + Free; + end; +end; + +for J := Low(CodecCfg[0]) to High(CodecCfg[0]) do + for X := Low(CodecCfg[0, J]) to High(CodecCfg[0, J]) do + begin + with CodecCfg[0, J, X] do + begin + for Z := Low(Structure) to High(Structure) do + for Y := Low(Structure[Z]) to High(Structure[Z]) do + Parser.DefineVariable(Structure[Z, Y].Name, @Structure[Z, Y].Value); + for Y := Low(Counter) to High(Counter) do + begin + Parser.DefineVariable('Counter' + Succ(Y).ToString, + @Counter[Y].Current); + Parser.DefineVariable('CounterMin' + Succ(Y).ToString, @Counter[Y].Min); + Parser.DefineVariable('CounterMax' + Succ(Y).ToString, @Counter[Y].Max); + end; + for Y := Low(Names) to High(Names) do + Parser.DefineVariable(Names[Y], @Values[Y]); + end; + end; + +Codec.Initialised := False; +Codec.Init := @ConfigInit; +Codec.Free := @ConfigFree; +Codec.Parse := @ConfigParse; +Codec.Scan1 := @ConfigScan1; +Codec.Scan2 := @ConfigScan2; +Codec.Process := @ConfigProcess; +Codec.Restore := @ConfigRestore; +SetLength(CodecAvailable, Length(CodecCfg[0])); +SetLength(CodecEnabled, Length(CodecCfg[0])); +for I := Low(CodecCfg[0]) to High(CodecCfg[0]) do +begin + SetLength(CodecAvailable[I], Length(CodecCfg[0, I])); + SetLength(CodecEnabled[I], Length(CodecCfg[0, I])); +end; + +end. diff --git a/precompressor/PrecompMain.pas b/precompressor/PrecompMain.pas index 1aa9f42..1bda118 100644 --- a/precompressor/PrecompMain.pas +++ b/precompressor/PrecompMain.pas @@ -7,7 +7,8 @@ interface uses Threading, Utils, SynCommons, ParseClass, ParseExpr, FLZMA2DLL, PrecompUtils, PrecompCrypto, PrecompZLib, PrecompLZ4, PrecompLZO, PrecompZSTD, - PrecompOodle, PrecompMedia, PrecompINI, PrecompSearch, PrecompDLL, PrecompEXE, + PrecompOodle, PrecompMedia, PrecompINI, PrecompINIEx, PrecompSearch, + PrecompDLL, PrecompEXE, WinAPI.Windows, WinAPI.ShlObj, System.SysUtils, System.Classes, System.SyncObjs, System.Math, System.Types, System.StrUtils, System.RTLConsts, System.TimeSpan, System.Diagnostics, @@ -103,12 +104,15 @@ var Codecs: array of TPrecompressor; DBFile: String = ''; ExtDir: String = ''; + SrepMemCfg: String; UseDB: Boolean = False; StoreDD: Integer = -2; VERBOSE: Boolean = False; EXTRACT: Boolean = False; + NOVERIFY: Boolean = False; DupSysMem: Int64 = 0; EncInfo: TEncInfo; + EncFreed: Boolean = False; ConTask: TTask; Stopwatch: TStopwatch; @@ -186,18 +190,24 @@ begin Options.Depth := EnsureRange(Succ(ArgParse.AsInteger('-d', 0, 0)), 1, 10); Options.LowMem := ArgParse.AsBoolean('-lm'); UseDB := ArgParse.AsBoolean('-db') or ArgParse.AsBoolean('--dbase'); - Options.DBaseFile := ArgParse.AsString('--dbase='); + Options.DBaseFile := ArgParse.AsString('--dbase=', 0, ''); + Options.DBaseFile := ArgParse.AsString('-db', 0, Options.DBaseFile); if Options.DBaseFile <> '' then UseDB := True; StoreDD := -2; if ArgParse.AsBoolean('-dd') or ArgParse.AsBoolean('--dedup') then StoreDD := -1; if FileExists(ExtractFilePath(Utils.GetModuleName) + 'srep.exe') then + begin StoreDD := ArgParse.AsInteger('--dedup=', 0, StoreDD); + StoreDD := ArgParse.AsInteger('-dd', 0, StoreDD); + end; S := ArgParse.AsString('--diff=', 0, '5p'); + S := ArgParse.AsString('-df', 0, S); S := ReplaceText(S, 'p', '%'); DIFF_TOLERANCE := Max(0.00, ExpParse.Evaluate(S)); VERBOSE := ArgParse.AsBoolean('-v') or ArgParse.AsBoolean('--verbose'); + NOVERIFY := ArgParse.AsBoolean('-s') or ArgParse.AsBoolean('--skip'); Options.ExtractDir := ArgParse.AsString('--extract='); if Options.ExtractDir <> '' then EXTRACT := DirectoryExists(Options.ExtractDir); @@ -244,10 +254,11 @@ begin Options.DedupSysMem := Max(0, Round(ExpParse.Evaluate(S))); if B then Options.DedupSysMem := -Options.DedupSysMem; - VERBOSE := ArgParse.AsBoolean('--verbose'); - S := ArgParse.AsString('--compress=', 0, 't50p'); + VERBOSE := ArgParse.AsBoolean('-v') or ArgParse.AsBoolean('--verbose'); + S := ArgParse.AsString('--compress=', 0, 't25p'); S := ReplaceText(S, SPrecompSep3, SPrecompSep2); Options.CompressCfg := S; + SrepMemCfg := ArgParse.AsString('--srepmem=', 0, '75p'); finally ArgParse.Free; ExpParse.Free; @@ -317,6 +328,7 @@ var begin SetLength(Codecs, 0); Insert(PrecompINI.Codec, Codecs, Length(Codecs)); + Insert(PrecompINIEx.Codec, Codecs, Length(Codecs)); Insert(PrecompSearch.Codec, Codecs, Length(Codecs)); Insert(PrecompDLL.Codec, Codecs, Length(Codecs)); Insert(PrecompEXE.Codec, Codecs, Length(Codecs)); @@ -992,10 +1004,13 @@ begin CurCodec[Index] := SI2.Codec; CurDepth[Index] := Depth; try - Result := Codecs[SI2.Codec].Process(Index, Depth, - PByte(DataStore.Slot(ThreadIndex).Memory) + SI2.ActualPosition, - PByte(MemOutput1[ThreadIndex].Memory) + SI2.StorePosition, @SI1, - @PrecompOutput1, @PrecompFunctions); + if NOVERIFY and not(SI2.Codec in [5]) then + Result := True + else + Result := Codecs[SI2.Codec].Process(Index, Depth, + PByte(DataStore.Slot(ThreadIndex).Memory) + SI2.ActualPosition, + PByte(MemOutput1[ThreadIndex].Memory) + SI2.StorePosition, @SI1, + @PrecompOutput1, @PrecompFunctions); except Result := False; end; @@ -1274,11 +1289,10 @@ begin DataStore := TDataStore2.Create(Length(InfoStore1)); end; CodecInit(Options^.Threads, Options^.Method); - DBFile := Options^.DBaseFile; - if FileExists(ExtractFilePath(Utils.GetModuleName) + DBFile) then + DBFile := ExpandPath(Options^.DBaseFile); + if FileExists(DBFile) then begin - with TFileStream.Create(ExtractFilePath(Utils.GetModuleName) + DBFile, - fmShareDenyNone) do + with TFileStream.Create(DBFile, fmShareDenyNone) do begin Position := 0; if WorkStream[0].Size < Size then @@ -1309,6 +1323,8 @@ begin if (IndexText(PrecompGetCodec(PChar(Options^.Method), I, False), PrecompINI.Codec.Names) < 0) and (IndexText(PrecompGetCodec(PChar(Options^.Method), I, False), + PrecompINIEx.Codec.Names) < 0) and + (IndexText(PrecompGetCodec(PChar(Options^.Method), I, False), PrecompSearch.Codec.Names) < 0) then begin if S = '' then @@ -1359,6 +1375,7 @@ var UI32: UInt32; I, J, K: Integer; begin + EncFreed := True; if Length(Tasks) > 1 then WaitForAll(Tasks); CodecFree(Length(Tasks)); @@ -1684,8 +1701,7 @@ begin end; end; end; - with TFileStream.Create(ExtractFilePath(Utils.GetModuleName) + DBFile, - fmCreate) do + with TFileStream.Create(DBFile, fmCreate) do begin WriteBuffer(WorkStream[0].Memory^, WorkStream[0].Position); Free; @@ -1734,7 +1750,7 @@ begin end; end else - Output.CopyFrom(TempOutput, 0); + Output.CopyFrom(TBufferedStream(TempOutput).Instance, 0); TempOutput.Free; DeleteFile(S); end @@ -2098,7 +2114,8 @@ begin if (Depth = 0) and (StoreDD >= 0) then begin LStream := TProcessStream.Create(ExtractFilePath(Utils.GetModuleName) + - 'srep.exe', '-d -s - -', GetCurrentDir, Input, nil); + 'srep.exe', '-d -s -mem' + SrepMemCfg + ' - -', GetCurrentDir, + Input, nil); if not LStream.Execute then raise EReadError.CreateRes(@SReadError); DecInput[Index] := TBufferedStream.Create(LStream, True, 4194304); @@ -2350,7 +2367,8 @@ begin if Options.DoCompress then LOutput.Free; try - // EncFree; + if not EncFreed then + EncFree; finally Stopwatch.Stop; end; diff --git a/precompressor/PrecompOodle.pas b/precompressor/PrecompOodle.pas index 4706056..fa6dfb9 100644 --- a/precompressor/PrecompOodle.pas +++ b/precompressor/PrecompOodle.pas @@ -513,16 +513,27 @@ begin Pos := 0; while Pos < Size do begin - GetOodleSI(Input + Pos, SizeEx - Pos, @OodleSI); - if (OodleSI.CSize > 0) then - begin - if GetOodleUS(Instance, Input, Pos, @OodleSI, Output, Add, Funcs) > 0 then + try + while Pos < Size do begin - Inc(Pos, OodleSI.CSize); - continue; + GetOodleSI(Input + Pos, SizeEx - Pos, @OodleSI); + if (OodleSI.CSize > 0) then + begin + try + if GetOodleUS(Instance, Input, Pos, @OodleSI, Output, Add, Funcs) > 0 + then + begin + Inc(Pos, OodleSI.CSize); + continue; + end; + except + end; + end; + Inc(Pos); end; + except + Inc(Pos); end; - Inc(Pos); end; end; diff --git a/precompressor/PrecompSearch.pas b/precompressor/PrecompSearch.pas index 54de061..d78e442 100644 --- a/precompressor/PrecompSearch.pas +++ b/precompressor/PrecompSearch.pas @@ -4,6 +4,7 @@ interface uses Utils, SynCommons, SynCrypto, + UIMain, PrecompUtils, WinAPI.Windows, System.SysUtils, System.Classes, System.StrUtils, @@ -281,6 +282,8 @@ begin SetLength(CodecSearch, Succ(J)); S := ChangeFileExt(ExtractFileName(SearchList[I]), ''); Insert(S, Codec.Names, Length(Codec.Names)); + if UIMain.DLLLoaded then + XTLAddplugin(S, PLUGIN_DATABASE); end; while FStream.Position < FStream.Size do begin diff --git a/precompressor/PrecompZLib.pas b/precompressor/PrecompZLib.pas index a844c23..2e95e72 100644 --- a/precompressor/PrecompZLib.pas +++ b/precompressor/PrecompZLib.pas @@ -444,7 +444,8 @@ begin exit; end else if BoolArray(CodecEnabled, False) then - exit; + if Assigned(Add) then + exit; Pos := 0; Buffer := Funcs^.Allocator(Instance, Z_WORKMEM); IsZlib := False; @@ -487,7 +488,7 @@ begin (EndianSwap(PWord(Input + Pos - 2)^) mod $1F = 0) then begin WinBits := (Input + Pos - 2)^ shr 4; - if WinBits in [0 .. 7] then + if WinBits = ZWinBits then begin ZStream := @ZStream2[Instance, WinBits]; Level := (Input + Pos - 1)^ shr $6; @@ -569,7 +570,8 @@ begin if (I = ZLIB_CODEC) and (WinBits = 0) then SetBits(SI.Option, 1, 12, 3); SetBits(SI.Option, I, 0, 5); - if CodecEnabled[I] or (I = X) then + if CodecEnabled[I] or (I = X) or + (CodecAvailable[I] and not Assigned(Add)) then begin DS := Funcs^.GetDepthCodec(DI1.Codec); Move(DS[0], DI2.Codec, SizeOf(DI2.Codec)); @@ -751,8 +753,7 @@ begin L := EnsureRange(L, 1, 9); M := 0; I := 0; - Params := 'l' + L.ToString + ':' + 'w' + - (GetBits(StreamInfo^.Option, 12, 3) + 8).ToString; + Params := 'l' + L.ToString; raw2hif_Init(HR, L); while True do begin @@ -793,7 +794,7 @@ begin Res1 := StreamInfo^.NewSize; Res2 := P_HIFSIZE; Buffer := Funcs^.Allocator(Instance, Res2); - Params := 'w' + (GetBits(StreamInfo^.Option, 12, 3) + 8).ToString; + Params := ''; if preflate_decode(OldInput, StreamInfo^.OldSize, NewInput, @Res1, Buffer, @Res2) then begin @@ -868,8 +869,7 @@ begin I := 0; J := 0; M := 0; - Params := 'l' + GetBits(StreamInfo.Option, 5, 7).ToString + ':' + 'w' + - (GetBits(StreamInfo.Option, 12, 3) + 8).ToString; + Params := 'l' + GetBits(StreamInfo.Option, 5, 7).ToString; hif2raw_Init(HR, GetBits(StreamInfo.Option, 5, 7)); while True do begin @@ -904,7 +904,7 @@ begin begin Res1 := StreamInfo.OldSize; Buffer := Funcs^.Allocator(Instance, Res1); - Params := 'w' + (GetBits(StreamInfo.Option, 12, 3) + 8).ToString; + Params := ''; if preflate_reencode(Input, StreamInfo.NewSize, InputExt, StreamInfo.ExtSize, Buffer, @Res1) then begin diff --git a/precompressor/PrecompZSTD.pas b/precompressor/PrecompZSTD.pas index fb3dfad..3e7154a 100644 --- a/precompressor/PrecompZSTD.pas +++ b/precompressor/PrecompZSTD.pas @@ -320,8 +320,6 @@ begin if Result or (StreamInfo^.Status >= TStreamStatus.Predicted) then break; end; - if Res1 < 0 then - exit; if (Result = False) and ((StreamInfo^.Status >= TStreamStatus.Predicted) or (SOList[Instance][X].Count = 1)) and (DIFF_TOLERANCE > 0) then begin diff --git a/resources/Win32/fast-lzma2.dll b/resources/Win32/fast-lzma2.dll deleted file mode 100644 index c166eb4..0000000 Binary files a/resources/Win32/fast-lzma2.dll and /dev/null differ diff --git a/resources/Win32/xdelta3_dll.dll b/resources/Win32/xdelta3_dll.dll deleted file mode 100644 index c6e672c..0000000 Binary files a/resources/Win32/xdelta3_dll.dll and /dev/null differ diff --git a/resources/Win64/fast-lzma2.dll b/resources/Win64/fast-lzma2.dll deleted file mode 100644 index 397329f..0000000 Binary files a/resources/Win64/fast-lzma2.dll and /dev/null differ diff --git a/resources/Win64/xdelta3_dll.dll b/resources/Win64/xdelta3_dll.dll deleted file mode 100644 index c099e66..0000000 Binary files a/resources/Win64/xdelta3_dll.dll and /dev/null differ diff --git a/ui/UIMain.pas b/ui/UIMain.pas new file mode 100644 index 0000000..054f905 --- /dev/null +++ b/ui/UIMain.pas @@ -0,0 +1,95 @@ +unit UIMain; + +interface + +uses + LibImport, + WinAPI.Windows, + System.SysUtils, System.Classes, System.Types; + +type + PUIFuncs = ^TUIFuncs; + + TUIFuncs = record + IsZlibLoaded: Boolean; + IsReflateLoaded: Boolean; + IsPreflateLoaded: Boolean; + IsLZ4Loaded: Boolean; + IsLZOLoaded: Boolean; + IsZSTDLoaded: Boolean; + IsOodleLoaded: Boolean; + IsFLACLoaded: Boolean; + IsBrunsliLoaded: Boolean; + IsPackJPGLoaded: Boolean; + IsJoJpegLoaded: Boolean; + IsXDeltaLoaded: Boolean; + IsLZMALoaded: Boolean; + IsSrepAvailable: Boolean; + end; + +const + PLUGIN_DATABASE = 0; + PLUGIN_CONFIG = 1; + PLUGIN_LIBRARY = 2; + +var + UIFuncs: TUIFuncs; + XTLUI1: procedure; + XTLUI2: function(Funcs: PUIFuncs; var Params: TArray; + out LibType: Integer; out LibPath: String): Boolean; + XTLAddPlugin: procedure(S: String; I: Integer); + XTLAddCodec: procedure(S: String); + DLLLoaded: Boolean = False; + +implementation + +uses + BrunsliDLL, FLACDLL, FLZMA2DLL, JoJpegDLL, LZ4DLL, LZODLL, OodleDLL, + PackJPGDLL, PreflateDLL, ReflateDLL, XDeltaDLL, ZLibDLL, ZSTDDLL, + Utils; + +var + Lib: TLibImport; + +procedure Init; +begin + Lib := TLibImport.Create(ChangeFileExt(Utils.GetModuleName, 'ui.dll')); + if Lib.Loaded then + begin + @XTLUI1 := Lib.GetProcAddr('XTLUI1'); + @XTLUI2 := Lib.GetProcAddr('XTLUI2'); + @XTLAddPlugin := Lib.GetProcAddr('XTLAddPlugin'); + @XTLAddCodec := Lib.GetProcAddr('XTLAddCodec'); + DLLLoaded := Assigned(XTLUI1); + end; +end; + +procedure Deinit; +begin + Lib.Free; +end; + +initialization + +UIFuncs.IsZlibLoaded := ZLibDLL.DLLLoaded; +UIFuncs.IsReflateLoaded := ReflateDLL.DLLLoaded; +UIFuncs.IsPreflateLoaded := PreflateDLL.DLLLoaded; +UIFuncs.IsLZ4Loaded := LZ4DLL.DLLLoaded; +UIFuncs.IsLZOLoaded := LZODLL.DLLLoaded; +UIFuncs.IsZSTDLoaded := ZSTDDLL.DLLLoaded; +UIFuncs.IsOodleLoaded := OodleDLL.DLLLoaded; +UIFuncs.IsFLACLoaded := FLACDLL.DLLLoaded; +UIFuncs.IsBrunsliLoaded := BrunsliDLL.DLLLoaded; +UIFuncs.IsPackJPGLoaded := PackJPGDLL.DLLLoaded; +UIFuncs.IsJoJpegLoaded := JoJpegDLL.DLLLoaded; +UIFuncs.IsXDeltaLoaded := XDeltaDLL.DLLLoaded; +UIFuncs.IsLZMALoaded := FLZMA2DLL.DLLLoaded; +UIFuncs.IsSrepAvailable := FileExists(ExtractFilePath(Utils.GetModuleName) + + 'srep.exe'); +Init; + +finalization + +Deinit; + +end. diff --git a/xtool.dpr b/xtool.dpr index f89db4d..03c0b78 100644 --- a/xtool.dpr +++ b/xtool.dpr @@ -62,6 +62,7 @@ uses ZLibDLL in 'imports\ZLibDLL.pas', ZSTDDLL in 'imports\ZSTDDLL.pas', lz4 in 'sources\lz4.pas', + UIMain in 'ui\UIMain.pas', PrecompMain in 'precompressor\PrecompMain.pas', PrecompUtils in 'precompressor\PrecompUtils.pas', PrecompCrypto in 'precompressor\PrecompCrypto.pas', @@ -72,6 +73,7 @@ uses PrecompMedia in 'precompressor\PrecompMedia.pas', PrecompOodle in 'precompressor\PrecompOodle.pas', PrecompINI in 'precompressor\PrecompINI.pas', + PrecompINIEx in 'precompressor\PrecompINIEx.pas', PrecompSearch in 'precompressor\PrecompSearch.pas', PrecompDLL in 'precompressor\PrecompDLL.pas', PrecompEXE in 'precompressor\PrecompEXE.pas', @@ -172,15 +174,59 @@ begin Result := TFileStream.Create(Output, fmCreate); end; +function CheckInstance(const InstanceName: string): boolean; +var + Sem: THandle; +begin + Result := False; + Sem := CreateSemaphore(nil, 0, 1, PChar(InstanceName)); + if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then + begin + CloseHandle(Sem); + exit(True); + end; +end; + +function Exec_(Executable, CommandLine, WorkDir: string): boolean; +var + StartupInfo: TStartupInfo; + ProcessInfo: TProcessInformation; + dwExitCode: DWORD; + LWorkDir: PChar; +begin + Result := False; + FillChar(StartupInfo, sizeof(StartupInfo), #0); + StartupInfo.cb := sizeof(StartupInfo); + if WorkDir <> '' then + LWorkDir := Pointer(WorkDir) + else + LWorkDir := Pointer(GetCurrentDir); + if CreateProcess(nil, PChar('"' + Executable + '" ' + CommandLine), nil, nil, + False, 0, nil, LWorkDir, StartupInfo, ProcessInfo) then + begin + CloseHandleEx(ProcessInfo.hThread); + WaitForSingleObject(ProcessInfo.hProcess, INFINITE); + GetExitCodeProcess(ProcessInfo.hProcess, dwExitCode); + CloseHandleEx(ProcessInfo.hProcess); + Result := dwExitCode = 0; + end + else + RaiseLastOSError; +end; + const BufferSize = 1048576; var I, J: Integer; S: String; + LibType: Integer; + LibPath: String; + LibList: System.Types.TStringDynArray; + ParamStr_: TArray; ParamArg: array [0 .. 1] of TArray; StrArray: TArray; - IsParam: Boolean; + IsParam: boolean; Input, Output: TStream; PrecompEnc: PrecompMain.TEncodeOptions; PrecompDec: PrecompMain.TDecodeOptions; @@ -207,7 +253,56 @@ end; begin FormatSettings := TFormatSettings.Invariant; - ProgramInfo; + if not CheckInstance('XToolUI_Check') then + ProgramInfo; + if UIMain.DLLLoaded and (ParamCount = 0) then + begin + XTLUI1; + while XTLUI2(@UIFuncs, ParamStr_, LibType, LibPath) do + begin + S := ''; + for I := 1 to High(ParamStr_) do + S := S + IfThen(ParamStr_[I].Contains(' '), '"' + ParamStr_[I] + '"', + ParamStr_[I]) + ' '; + PrecompMain.Parse(ParamStr_, PrecompEnc); + if LibType = 0 then + begin + WriteLine('Chunk size: ' + ConvertKB2TB(PrecompEnc.ChunkSize div 1024) + + ', ' + 'Threads: ' + PrecompEnc.Threads.ToString + ', ' + 'Depth: ' + + (PrecompEnc.Depth - 1).ToString); + WriteLine(''); + Exec_(ParamStr(0), S, ''); + end + else + begin + LibList := TDirectory.GetFiles(LibPath, '*.dll', + TSearchOption.soAllDirectories); + for J := Low(LibList) to High(LibList) do + begin + S := ''; + for I := 1 to High(ParamStr_) do + begin + S := S + IfThen(ParamStr_[I].Contains(' '), + '"' + ParamStr_[I] + '"', ParamStr_[I]) + ' '; + if I = 1 then + case LibType of + 1: + S := S + '"' + '-l4' + LibList[J] + '"' + ' '; + 2: + S := S + '"' + '-zs' + LibList[J] + '"' + ' '; + 3: + S := S + '"' + '-od' + LibList[J] + '"' + ' '; + end; + end; + WriteLine('Library loaded: ' + ReplaceText(LibList[J], + IncludeTrailingBackSlash(LibPath), '')); + WriteLine(''); + Exec_(ParamStr(0), S, ''); + end; + end; + end; + exit; + end; try if ParamCount = 0 then begin @@ -240,6 +335,12 @@ begin try PrecompMain.Parse(ParamArg[0], PrecompEnc); PrecompMain.Encode(Input, Output, PrecompEnc); + if TBufferedStream(Output).Instance is TNullStream then + begin + WriteLine('Results: ' + ConvertKB2TB(Input.Size div 1024) + ' >> ' + + ConvertKB2TB(Output.Size div 1024)); + WriteLine(''); + end; finally Input.Free; Output.Free; diff --git a/xtool.dproj b/xtool.dproj index 15ff681..3276fc1 100644 --- a/xtool.dproj +++ b/xtool.dproj @@ -48,6 +48,12 @@ Base true + + true + Cfg_2 + true + true + true Cfg_2 @@ -119,6 +125,12 @@ 0 0 + + .\$(Platform)\DCUs + /usr/bin/gnome-terminal -- "%debuggee%" + (None) + none + .\$(Platform)\DCUs 7177 @@ -134,6 +146,7 @@ true 0 CompanyName=;FileDescription=;FileVersion=0.0.0.0;InternalName=;LegalCopyright=Razor12911;LegalTrademarks=;OriginalFilename=xtool.exe;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.0.0.0;Comments=Created by Razor12911 + none @@ -166,6 +179,7 @@ + @@ -176,6 +190,7 @@ + @@ -207,8 +222,8 @@ xtool.dpr - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/xtool.dres b/xtool.dres deleted file mode 100644 index 26a7ef3..0000000 Binary files a/xtool.dres and /dev/null differ diff --git a/xtoolResource.rc b/xtoolResource.rc deleted file mode 100644 index c3628fe..0000000 --- a/xtoolResource.rc +++ /dev/null @@ -1 +0,0 @@ -XTOOL RCDATA "cpp\\xtool\\x64\\Release\\xtool.dll" diff --git a/xtoolui.dpr b/xtoolui.dpr new file mode 100644 index 0000000..dad763e --- /dev/null +++ b/xtoolui.dpr @@ -0,0 +1,151 @@ +library xtoolui; + +{$R *.res} + +uses + System.StartUpCopy, + FMX.Forms, + FMX.Types, + FMX.Controls, + FMX.StdCtrls, + WinAPI.Windows, + System.SysUtils, + System.Types, + System.UITypes, + System.Classes, + Unit1 in 'Unit1.pas' {Form1} , + Unit2 in 'Unit2.pas' {Form2}; + +const + PLUGIN_DATABASE = 0; + PLUGIN_CONFIG = 1; + PLUGIN_LIBRARY = 2; + +type + PUIFuncs = ^TUIFuncs; + + TUIFuncs = record + IsZlibLoaded: Boolean; + IsReflateLoaded: Boolean; + IsPreflateLoaded: Boolean; + IsLZ4Loaded: Boolean; + IsLZOLoaded: Boolean; + IsZSTDLoaded: Boolean; + IsOodleLoaded: Boolean; + IsFLACLoaded: Boolean; + IsBrunsliLoaded: Boolean; + IsPackJPGLoaded: Boolean; + IsJoJpegLoaded: Boolean; + IsXDeltaLoaded: Boolean; + IsLZMALoaded: Boolean; + IsSrepAvailable: Boolean; + end; + +var + UIInitialised: Boolean = False; + +procedure XTLUI1; +begin + Form1 := TForm1.Create(nil); + Form2 := TForm2.Create(Form1); +end; + +function XTLUI2(Funcs: PUIFuncs; var Params: TArray; + out LibType: Integer; out LibPath: String): Boolean; +var + I, J, X: Integer; + Expander: TExpander; +begin + if not UIInitialised then + begin + UIInitialised := True; + { Form2.CheckBox3.Enabled := Funcs^.IsZlibLoaded; + Form2.CheckBox1.Enabled := Funcs^.IsReflateLoaded; + Form2.CheckBox2.Enabled := Funcs^.IsPreflateLoaded; + Form2.CheckBox4.Enabled := Funcs^.IsLZ4Loaded; + Form2.CheckBox5.Enabled := Funcs^.IsLZ4Loaded; + Form2.CheckBox6.Enabled := Funcs^.IsLZ4Loaded; + Form2.CheckBox7.Enabled := Funcs^.IsLZOLoaded; + Form2.CheckBox8.Enabled := Funcs^.IsZSTDLoaded; + Form2.CheckBox10.Enabled := Funcs^.IsOodleLoaded; + Form2.CheckBox12.Enabled := Funcs^.IsOodleLoaded; + Form2.CheckBox14.Enabled := Funcs^.IsOodleLoaded; + Form2.CheckBox16.Enabled := Funcs^.IsOodleLoaded; + Form2.CheckBox18.Enabled := Funcs^.IsOodleLoaded; + Form2.CheckBox21.Enabled := Funcs^.IsFLACLoaded; + Form2.RadioButton4.Enabled := Funcs^.IsFLACLoaded; + Form2.CheckBox26.Enabled := Funcs^.IsBrunsliLoaded or + Funcs^.IsPackJPGLoaded or Funcs^.IsJoJpegLoaded; + Form2.RadioButton1.Enabled := Funcs^.IsBrunsliLoaded; + Form2.RadioButton2.Enabled := Funcs^.IsPackJPGLoaded; + Form2.RadioButton3.Enabled := Funcs^.IsJoJpegLoaded; + Form1.GroupBox5.Enabled := Funcs^.IsLZMALoaded; } + Form1.SpinBox4.Enabled := Funcs^.IsSrepAvailable; + for I := Low(Methods) to High(Methods) do + begin + case Methods[I].FType of + PLUGIN_DATABASE: + Form2.ListBox2.Items.Add(Methods[I].FName); + PLUGIN_CONFIG: + begin + J := Length(CfgCtrls); + Insert(TConfigCtrl.Create(Form2, Form2.VertScrollBox3), CfgCtrls, + Length(CfgCtrls)); + CfgCtrls[J].SetText(Methods[I].FName); + for X := Low(Methods[I].Codecs) to High(Methods[I].Codecs) do + CfgCtrls[J].AddCodec(Methods[I].Codecs[X]); + end; + PLUGIN_LIBRARY: + begin + J := Length(LibCtrls); + Insert(TLibraryCtrl.Create(Form2, Form2.VertScrollBox3), LibCtrls, + Length(LibCtrls)); + LibCtrls[J].SetText(Methods[I].FName); + for X := Low(Methods[I].Codecs) to High(Methods[I].Codecs) do + LibCtrls[J].AddCodec(Methods[I].Codecs[X]); + end; + end; + end; + for I := 0 to Form2.ComponentCount - 1 do + begin + if Form2.Components[I] is TExpander then + TExpander(Form2.Components[I]).IsExpanded := False; + end; + if Form2.ListBox2.Items.Count = 0 then + Form2.Expander10.Visible := False; + end; + Result := Form1.ShowModal = mrOk; + LibType := Form1.ComboBox4.ItemIndex; + LibPath := Form1.Edit5.Text; + if Result then + begin + SetLength(Params, Length(CmdStr)); + for I := Low(CmdStr) to High(CmdStr) do + Params[I] := CmdStr[I]; + end; +end; + +procedure XTLAddPlugin(S: String; I: Integer); +var + J: Integer; +begin + J := Length(Methods); + SetLength(Methods, Succ(J)); + Methods[J].FName := S; + Methods[J].FType := I; + SetLength(Methods[J].Codecs, 0); +end; + +procedure XTLAddCodec(S: String); +var + J: Integer; +begin + J := Pred(Length(Methods)); + Insert(S, Methods[J].Codecs, Length(Methods[J].Codecs)); +end; + +exports XTLUI1, XTLUI2, XTLAddPlugin, XTLAddCodec; + +begin + +end. diff --git a/xtoolui.dproj b/xtoolui.dproj new file mode 100644 index 0000000..a1d54c0 --- /dev/null +++ b/xtoolui.dproj @@ -0,0 +1,1043 @@ + + + {DFC294EE-9AC3-4C8F-8F10-C1976253A985} + 19.5 + FMX + True + Release + Win64 + 3 + Library + xtoolui.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + xtoolui + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= + Debug + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + Debug + $(MSBuildProjectName) + + + CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + iPhoneAndiPad + true + + + DataSnapServer;emshosting;fmx;DbxCommonDriver;bindengine;FireDACCommonODBC;emsclient;FireDACCommonDriver;IndyProtocols;dbxcds;emsedge;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;dbexpress;FireDACInfxDriver;inet;DataSnapCommon;dbrtl;FireDACOracleDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;dsnapxml;DataSnapClient;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;xmlrtl;dsnap;CloudService;FireDACDb2Driver;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + + + DataSnapServer;vclwinx;emshosting;fmx;DbxCommonDriver;vclie;bindengine;VCLRESTComponents;FireDACCommonODBC;DBXMSSQLDriver;IndyIPCommon;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;dbxcds;vcledge;IndyIPClient;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;fmxase;vcltouch;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FireDACDBXDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;adortl;dsnapxml;IndyIPServer;DataSnapClient;DataSnapProviderClient;dsnapcon;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;DBXSybaseASADriver;CloudService;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;DataSnapNativeClient;bindcompvclsmp;fmxobj;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + + + DataSnapServer;vclwinx;emshosting;fmx;DbxCommonDriver;vclie;bindengine;VCLRESTComponents;FireDACCommonODBC;DBXMSSQLDriver;IndyIPCommon;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;dbxcds;vcledge;IndyIPClient;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;fmxase;vcltouch;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FireDACDBXDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;adortl;dsnapxml;IndyIPServer;DataSnapClient;DataSnapProviderClient;dsnapcon;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;DBXSybaseASADriver;CloudService;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;DataSnapNativeClient;bindcompvclsmp;fmxobj;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + .\$(Platform)\DCUs + true + 7177 + (None) + none + 0 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=xtoolui.dll;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.0.0.0;Comments=Created by Razor12911 + + + .\$(Platform)\DCUs + true + 7177 + (None) + none + 0 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=0.0.0.0;InternalName=;LegalCopyright=Razor12911;LegalTrademarks=;OriginalFilename=xtooui.dll;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.0.0.0;Comments=Created by Razor12911 + Win64\Release\xtool.exe + + + + MainSource + + +
Form1
+
+ +
Form2
+
+ + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + xtoolui.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + xtoolui.dll + true + + + + + xtoolui.dll + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + + False + False + False + False + False + True + True + + + 12 + + + + +
diff --git a/xtoolui.res b/xtoolui.res new file mode 100644 index 0000000..4075f38 Binary files /dev/null and b/xtoolui.res differ