From c10fbbe6c15dc2821d2f83586c0330e8033c044c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Luka=C5=A1=C3=ADk?= Date: Fri, 27 Nov 2020 17:57:14 +0000 Subject: [PATCH] Refactor: Extract method JsonAnnotation In some of the cases, we cannot omitempty. This refactor will allow us to have greater control over such cases. --- metaschema/parser/assembly.go | 4 ++++ metaschema/parser/field.go | 4 ++++ metaschema/parser/flag.go | 5 +++++ metaschema/templates/generated_models.tmpl | 6 +++--- metaschema/templates/pkged.go | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/metaschema/parser/assembly.go b/metaschema/parser/assembly.go index 50ffc62..e36c4f2 100644 --- a/metaschema/parser/assembly.go +++ b/metaschema/parser/assembly.go @@ -130,6 +130,10 @@ func (a *Assembly) XmlAnnotation() string { return a.XmlGroupping() + a.XmlName() + ",omitempty" } +func (a *Assembly) JsonAnnotation() string { + return a.JsonName() + ",omitempty" +} + func (a *Assembly) compile(metaschema *Metaschema) error { if a.Ref != "" { var err error diff --git a/metaschema/parser/field.go b/metaschema/parser/field.go index ea342a7..c122579 100644 --- a/metaschema/parser/field.go +++ b/metaschema/parser/field.go @@ -113,6 +113,10 @@ func (f *Field) GoName() string { return strcase.ToCamel(f.JsonName()) } +func (f *Field) JsonAnnotation() string { + return f.JsonName() + ",omitempty" +} + func (f *Field) JsonName() string { if f.GroupAs != nil { return f.GroupAs.Name diff --git a/metaschema/parser/flag.go b/metaschema/parser/flag.go index 2024293..4178f7b 100644 --- a/metaschema/parser/flag.go +++ b/metaschema/parser/flag.go @@ -77,6 +77,7 @@ func (f *Flag) GoName() string { func (f *Flag) JsonName() string { return f.XmlName() } + func (f *Flag) XmlName() string { if f.Name != "" { return f.Name @@ -84,6 +85,10 @@ func (f *Flag) XmlName() string { return f.Def.Name } +func (f *Flag) JsonAnnotation() string { + return f.JsonName() + ",omitempty" +} + func (f *Flag) compile(metaschema *Metaschema) error { var err error if f.Ref != "" { diff --git a/metaschema/templates/generated_models.tmpl b/metaschema/templates/generated_models.tmpl index eb6ab49..b40d036 100644 --- a/metaschema/templates/generated_models.tmpl +++ b/metaschema/templates/generated_models.tmpl @@ -13,12 +13,12 @@ type {{.GoTypeName}} struct { {{- end}} {{- range .Flags}} // {{ .GoComment }} - {{.GoName}} {{.GoDatatype}} `xml:"{{.XmlName}},attr,omitempty" json:"{{.JsonName}},omitempty"` + {{.GoName}} {{.GoDatatype}} `xml:"{{.XmlName}},attr,omitempty" json:"{{.JsonAnnotation}}"` {{- end}} {{if .Model}} {{- range .Model.GoStructItems}} // {{ .GoComment }} - {{.GoName}} {{.GoMemLayout}}{{.GoTypeNameMultiplexed}} `xml:"{{.XmlAnnotation}}" json:"{{.JsonName}},omitempty"` + {{.GoName}} {{.GoMemLayout}}{{.GoTypeNameMultiplexed}} `xml:"{{.XmlAnnotation}}" json:"{{.JsonAnnotation}}"` {{- end}} {{end}} @@ -32,7 +32,7 @@ type {{.GoTypeName}} struct { type {{.GoTypeName}} struct { {{- range .Flags}} // {{ .GoComment }} - {{.GoName}} {{.GoDatatype}} `xml:"{{.XmlName}},attr,omitempty" json:"{{.JsonName}},omitempty"` + {{.GoName}} {{.GoDatatype}} `xml:"{{.XmlName}},attr,omitempty" json:"{{.JsonAnnotation}}"` {{end -}} {{- if not .Empty -}} diff --git a/metaschema/templates/pkged.go b/metaschema/templates/pkged.go index ef89117..920ac0e 100644 --- a/metaschema/templates/pkged.go +++ b/metaschema/templates/pkged.go @@ -9,4 +9,4 @@ import ( "github.com/markbates/pkger/pkging/mem" ) -var _ = pkger.Apply(mem.UnmarshalEmbed([]byte(`1f8b08000000000000ffec7b6d93a238f7f757b98ad7ee08282a565d2f846e11b59d69ed16646b6b2b84088ce1614950716bbefb5d09a86877db3dbb5b7bd755ff7ee198939c9c9ce7c88f9e3f85305e2744e8ff29b0cf5d98097da11924116a129c6f000937bfac5bada607286866c80b006dfa216d06b9dbf4139844292e9a11a280c0004540680866942619fd066820f405a121cc408484be70c17397c072f109643ea2e5789e24d5e801501808fd38c7b8212c28c048e8af0126a8a2e60890242e798d641862448edce5e927f20ea5a7f11322f48a9b4d5ded7848bc9c9df7a75099e08734c8dd2f3089de30f80184b1d0a7598e1aff84ff8ce421f1fe9690a69f7c89128fcb5aa28c84dc57d217a925fcf8f1a321ac4b17fcf98e69fdba488aa214038a48d34731ca0045deef51e2214cbed028c54c1a4b24f6ed210a42cc0f88cbd8bfbea52190f08084bed4eaa90d81ad08fd76abc387bfd390ef944559fc45127f69894f92d497c5beac7ce9b59456a7a7886d47680821f9dd633eafd28314fcdc3bb415fa9d76b7db6a08669c08fd9e2ab5bb1da921cc70186f84bec4038d847eab258bed86f01c7a425f1245b12118e7a1fdfbef29f044a12f3684b9c7648a0d6151535ac39bd286b6a8761899c00d11fabd8630a061c434592028f4a58ed869774559561bc28cf019a927b2c9f68f86f070c5da16954e4f568eac27737f3404fd855459ed744eac5db523b5bbbd8ef483eb9ec739419ed0ff556c880df1371efb0065ff449dbf9a1ad7c57f3bbdde1251f58bfad4ad76f1b76aad6a34bf0a5f84df4e9da6ace4cb464318f51f0fa528f6500c8bfe7f3e6e5c0a3282b27aabfaf564dd173f61279f7ad0af825b9436a32c4b323658475468fc842f4fc7d5b64420dbb8bc7ad38d5f2e26cd75924580c90e936698e434642599b02353408326eb126cc0ea946661ecb3158af6f4142da679d9607f15dc7c1d2642e3a43e5331438434d79cb336e11fc294d33105618cb2260e09ad26d09e8fb222a5c969d004a5c49280611a700b2adaab2f7a049c09042f494f5614497d31d10c638ab218e026f27620f3c8351bc6614a43789e092250a34edb33107b9517af9748ee528cce0b91a79c09b6af46c1768da81b4002205d50b2d2b9a01549aed15747525cf3d35e11d54baa996ec23d4bbb18265e18fbb561139058aad32e20a8d3be9809639015f59900d5a535bfb332aad1298aeae43ec2efa4bc9bafd70027cd0065e86f9743086298601481b84968060141ef96cb9b8baf6874cd714a8308a4e4366bbaf14be7bfcbd324d4e3c5ea274dc00ba85ed27e52333c69a619d7a1240804717c2468b2412c32012041f5d584196cb14c3ae9cd8a1a60bf3e05d3bc4eae234a928cd6a76244690620aacf2584c7b83e952618d7e9eb2d195a6304290ee9c53409631fa3350efde0e254521008306ea23d8228debeb694c73cd34ff314118a930bebf29880350a10f0b89f7867ab77c9923d2abb23fb6abaa17f1e52721c57b51db15f33e55733ca310d53c09dc527fec8138a3c1e22e0f2928d112dff6d0694a6b521ffe7e8d5d3e451ed6a8e75d1344b780765749e9d1a7b42b863aa16ff4aa7afbccd473edaa7a74193143105cc6f591ed3d29c6ad4847e52a34e4e04348978db7cb15239eec53cfbf5d610aa44629599f0089eaf1f52c4b0fa3a8bafe27aba9d80bbcbc232db2fafab2bbaac10365b9a93c72164bf094fa3664ed752e792ee71926587d010b628f692ace92718c4fe9724f39bfbe6f19a0a000c802c7e8c2b4d7021b544e51d6efec58af1a37cc7d67d8b39cfb6e878e5dde00b36defa36c7cbdbee06f33b16b3bcf562c23e112204f86f89bba80c3fe795f72e5f9a25fbe21d46b919a4006e6e70855e0cde582605a93ae46bab3c0b098279869a6ee88559fea6b7ca84cd404c586bbfc574cc5126f0237c3193f7dbe75371f9545c354466dfc6ff8879d553cacf3c22ff68084c55a12f4c8b9eff28ab1b67a1c58ea560180d45c77af457f1c607a3b908470f9d69a1c6c09e279e65e62b59a553d1db3eca2a85c65e99ca12f68ce1612507d8b5eebbe6fdfc9b79af7c5beada707e8f9fa77eda45c57cb7b266d9caf2f05334a4ce62d0f9b618e473597dbc9aa76b5b9c4063f81dc8c3d859685d540c3627fa59095cebd9673c7a4cbb8ebc141796b4735b63111683fc383f3644ffeb77d19f86a53cd4a2c5ca5262879d692c236029f8d19e1d1c4b0add1156d78f896feabdad39a25d535746ae38dbba9684ddf8919fe58df0aed44519b9d25c81c6f2ebca92f0da167dd89a179e3513cd119998bad645328e4c5d5938b65638f60cbbf1fcf01ca95bef7e499c9a4c53d7564fcf7b2ec71c05d4d595726c686dd7da75cc2810bdd180f9fe3b6c8dbf4f232585adc7dc9155792a2b87a9ac1e56f2904c0ff7f983cefd94973ed4d4f5c2f4413cdbbadf9370ba18fb7a38f0518b50d358e6ce4852998fa60bedec93681f38add9bb7ee0f6311f882c0e4b757df489380f3c6328225be33e59317bee9210b5486e1912e17ad9923a3586a23732892b4ba9672c291ccd1533d4fe80b29a7f0dc74cd6848dcffc2a05f61cbbb626226647a93776a379a9eb887681b5f2a71b69eb184b52ea38e0f375fb9e2c75e3583b966f4fde682cad5af3313fbf25a9cc377ccf4dbb4b1e66cf5c564fb1afe89963490f2b1b6f3d7baeae6dda9d6ebced92e50ccfd7e5ccb3f622b035e2d80166fe3fc598d98303eade0f733752c5953d4f5d59b9881f3b63c1c69ba3cff75bd7c2a263493b6fb4095783e4a8db39be3cdef4e8a7c9fa31ed22b95a63f5d81a076ee4615357ee1dcb49dd6869006b498e7b594f402de2333b589dbbd632f7744de5728a3931ef12d534f6d80d8fb9f3e04fed535ea54ea8c59e3ed8b8fa6067ea12dbc77383c7e5d2372c870e654c1e7db44b5ec4ee7f26374f3e7f2c7de19f6c61fec8ddd6a33fdd5472b94faaf58db73dca344733114638770acd478644be862659c941002366c37d681ae9c195db65de6cd85839e6e2a5ded1a0f287e83b96b261fe2963c7e8fd819d75ee09bc5f8da1280530a212d4cb9e69eada2966dcdfb5be67b21cbe13fd276b5880d67257eb2f04cacffe87f61f6d3dc7bccad72a57f553ef3ee531cb49180d73477ef6a79b39862cdf8d65be92318685f64e9e0dd4a32e8e3d9f39f63c80f22c712c2960bccf2fef98bcaaef6726f318237eef58ca86d9c01f5a3214d3f3657dbe8ef94dfe77516dfe7c86d11e653f896dbfd87844b85bad5eef36c22dfd22779fa46e5feef6db9d2f624b6cf7a4d65f40b8e57f0ee12e95fe1984bbd716e5ce118b6ef5da624f513baf21dc9db6da133b67d6cada5701eeb7383ff1ed4f7cfb13dffec4b73ff1ed4f7cfb13dffec4b73ff1ed4f7cfb13dffec4b73ff1ed7f15df7ef1ccfb6fa2dcc9765a6817481f8c1ffc953dc6a68173c7c08563cd44d328914a5868b9632d374c0727520b7334c330c2816be04e8902b619dfc1b1c7e9cadaa7281a8ac052733dec6d4d6378a890207fc5918880baba16016b8f61a16d80e5448e6dfaae3514abfd042db4d40d351118cb148647c46d2ec1e839e788f9480b56320d1cb94268ee12b5446daee64b34af8b8a392d79da15f277e47be6c8e10b7925f298bab6b685f1a33fa950cbf2330e913dc7b03027e7b941e858ca77579ea76e04b71c0d0dcdc984a3406734ffc95e12cfc03bd758b61d7b7cb8469e5e411b5dfb2542fb0d4638069612b8a30ab9331cc98d1efc892171d9a69ebe86fea7e67099bbd6b0807210b8f7e9d393d84e56a1e6dad658f18ce7d4349605e4f12575db6ac8e0205f5815b2680d7775b4b9e47302186aa91bcf52c758ce56f680c57567b52af44c925ee8f5d41aa78e8cf395b557d78fc9f82c8f239118c6267f3b52fa5459ba9114c07896acac5db20a77fe38c23994f1c6799602a86fbadc8670107c5b6839b076254a5bd7f12cbf706c96536ddfb1c7c51959e76ba55f6bfcae3ee87c5b687465513c1952ef05daf6ac16c0f252371a92b52d12f36e404ad439a8fb239d3c5ecae5f56410628e56dcce2362082ce500ac39667e7e118fdac70b9513dabb9097cada16fd6f0b2dbbb4a7f631766c3d80230dbbd163e2ea3bdf0b37137d71e6595fe978464b97eaf55acd67f28ad5b1fe819c7d4bb7d1ac05ecf977a06ba175d0bc5b76afe4e1c1590c6254c0ce9bf2ea7e8a86ac6fa56ee411c79e6fddf0e51bb2ab5c7c572647a3cb7c63b9c1d1f729aed5981e84537d104119e78ebcc79ea1e69327c2f3cdd4ef55d3505257d7ba1fd1ff6379fbfae763b6bccc8b0bbddf8efbc6b19c80dd255ffd7fce67ee4fd5f2eb1f182d45cf1ee75cce47741b896fe49b7695b3976f2b2e79fd3f5c7ea7faa97927faee2079432725e56b2371c2643bf1325f1583a4daeb4fe2d7ee830d7f8b51efdf93c520b12489df49539df5cbf116869b9aaf4a5dcb378fb87a3b2705f0451d6a7fc082c7a4badf94af8eede95e793f9fce4085d71db7c4f4ba3f566ff8780f63f7b5f35a9f1bf65ef4b94954dd59376a9de96e5ad5dba21b7c355baeee8e877cd91aa79eb1d4990d131d9271f10fe6d7907aab188b8e4dd53206e64774bcd107dfcac3b39fbf2db46865ed0fce6372d36f76b12bfb0d7f0b9a1ea6d82b803dc7cfad79012c259ee8636886a63f2934797a7e5337756cacae1783cc64ebdf93f0aff6adbfe2a3f50d9b5ebfef06a1f9667d6ba26307627566fdb7c46c658f0fc0189289eec837fadb2997cc27d177234c3e9883a73e7daa9d96486ef7a21b39c1fa26ab9f32672f623919cd311a3da65f8bff5f7abea0dfa93f4ffdb9fafbb88ed777ddb9dfa687e986fdce5d1e26fa869cfa6fad47d6df369b3fdf17ddcfbef8bfd1173d63d9f6f4cbbee8caedfc74b7ea7ec47e13dff2fbbfd80b6fc5727dec6bfcb754a1d830c2a2b30878cffb977bf64dfae4b3ab7be891c95ff8b1bd803fd5bf3eace375ce8cc6d81b2d0b37e4fed2cb9af6d3a9ce73bdfed753177fa154fd45c779ceffef7fdffb8b8af2ad3afafcefa1ff1780c21fff0f0000ffff010000ffff22ef1a03113c0000`))) +var _ = pkger.Apply(mem.UnmarshalEmbed([]byte(`1f8b08000000000000ffec5bed73a2c8baff574ef1d933f2221aac3a1f8444448d33d14490adada9a66981d8bc2c0d51dc9afffd563788a88949ce6eedad5b371f18fbe97e78fa796ff891f9930ba2754cb8fe9f1cbd6e8394eb736d3f0e519be07c0348b0f9f75a92da2ec8403b45ae0fb2b617646d3f77da5e0ce330c1453b441920d04721e05a9c1126719afd0099cff539aec5cd4088b83e77c2731bc372f111a41ecacaf13c8eabd13dc8a0cff5a31ce316b7c800465c7f0d304115354780c451c9abc7c3002372e02e77afc95b94d4e34744b2336e3a7576c77dece674bf3fb9ca042fc8fcdcf906e3f00d83ef411071fd2ccd51ebeff09f1edfc7ee5f12d2f6e26f61ec32594b949280f94af82648dcaf5fbf5adcba74c19fef98d66f8acc5098609021d2f65084529021f76718bb08936f5998602a8d2612fd75510602cc3688cad8bf7e4b8b23c11e717d41eaf55a1c5de1fa1da9cb863fb380dd29f222ff6f41f8b7d87b147a7db9db977bdf3abd4e4f91249b6b7101f9e9528f57c9410ab6eb2d7ae1fadd4eaf27b538238ab9fe8d22747a5da1c5cd70106db8bec0c28cb8be24897ca7c53d052ed717789e6f71fa7168fdfc990097e7fa7c8b9bbb5426dfe2160d9555bc292de8f04a979231dc10ae7fd3e2065910524d1608727da1cb773b8a7223f45adc8cd01959127b8a74c38bbf5adcfd75d6ca589effd5e2b48fb35a3f7fe6514e90cbf57fe35b7c8bff9d45de47e9df51e5af26c679e95f4faeb74454dda23975ad59fca54aabdacc6fdc37eef7bacf94757cda6608a5fee5a204452e8a60d1ffd7c78d4b404a50da6c54bfd5d67df362ba73dd817ee39ca2b419a5699cd2c13accb8d6277c596fd7b82504e9c661b59b6cbc72316eafe33404547610b78338cf025a9031dd320199dfa63d820e689566691079742543bbac8e16d5bc6cafbf714ebe0e62ae55ab4f554c1121ed35e36c4c78fb20617494812042691b0724ab26d08e8dd222c9e27ad006a5c4928041e2330b2ada6d2eba041c09044f4957946541b99868075186d208e03672b72075c9391bc6419205f038e387a041d5b7a720722b2f9e2f91dcc9303a2e84ae7c24e87d0d0a761a44d300e203e18412e5ee092d0b62833edb32c30d3fed645e39a5dac926d8d1b48b60ec0691d718b601898426ed0082ba9d9399200269d19cf151535afb999651834e50d82477217e27e59d7cbd06386efb28457fb91c0210c118a310446d92a51010f46eb9bcb9f88a46e71c751a842021d759938d573aff5d9e36c95c56ac5edc06ac809a25edc50dc3e37692321d4a8240104507228b378846c607c4af7eda308512cda45a6f5ad4007bcd2998e44d721d66244eb3e65484b22c051035e762c262dc9c4a628c9bf4f92d295a6304331c6427d324883c8cd638f0fc935d494120c0b88d7608a2e8e5b5a53c62995ecf678864383eb12e8f0858231f0197f98975b666972cd9c3b23bd29fb61378c761460ee3aab643fa2c53feb4c31c67410298b3d8c41f799c2197850838ac64239495ffb6fd2c4b1a43f6cfc1abf5e441ed6a8e76d1248d5907a5749ed68d3d26cc31558b7fa5d357de66230fed927ad026459401eab7348fb2d29c6ad4865edca06a27822c0e59dbbc58a91c77314f9fde5a5c9548b4326316c1e3f1438a08563f47f1555cebd30938db3428b3fdf4b83aa3cb0aa1b3a539791440fa4c588fda79b616baa7f40d236976702dee05456e9cb6bd1883c8fb16a75e7bd73e1c533e803e10f98f7125312e048997dfe1663fb4183fca7768ddd798f3f4051d8ebc2b7cfec65d5fe7b83cedae30bf6331cd5b3722f40a1121c07b4bdc49657839abbc77f99234de15ef308a6d3f017073852b7023f0c6322948d5215f5b65594810cc53d476023748f337bd55266c0a22425bfb35a6438e52811fe18ba8bcdfbfde89cb77e2aa2152fb36de47ccabde523ef382fcabc55155b93e372d6ebc0751d9d80b35b24d19c370c8dbe683b78a361e18cd7938baef4e0b2502d63c764d235f894a36e5dd970751c9a0be93a7a2805d7db85f893e76ccbb9e7137ff61dcc93f969a3a9cdfe1a7a997f45031dfaecc59ba325dfc180e337b31e8fe580cf2b9a83c9ccd676b8b9f407df80cc461642fd41e2a069b9a7e927dc77cf2288f16653d5b5cf20b53d83ad29887c5203fcc8f75defbfecc7bd3a09487a4ac58997264d33df565084c193f58b3bd6d0a8133c2cafa21f60cede6c518653d4393470e3f7b714c013bd103dbcb1de16da98b3c7284b90cf5e5f79529e0b5c57b509a17ae39e38d1199189ada43220e0d4d5ed8965ad8d60c3bd17cff142a2feedd92d80d9986a6ae1e9f764c8e31f2334793cbb1ae761c73db35429f774703eafb67288d9fa7a19c40e921b745459c8af27e2a2afb953824d3fd5d7eaf313fe5a50f5565bd303c10cd5e9ce738982ec69e160c3c2491ccd097b93d1214eaa3e9423dfa24dcf9b6347bd70fcc3eea039ec661a9ac0f3ee1e7beab0f7964a9cc272b6acf6d1c2089e4a62e10a6972528537dc8bb238338a290b8fa3283a3b96c04ea1f5054f2efc198ca9ad0f18329e78e4465e217271214231c4c4ef467f664891d0cf24753d9d8e6aed2bdb27334f69dd0c58626cf1c718e1d6a8b30e361b47c76ef306f9bc2beb467c0eea1358024e24d37655e3be6327735b596f9b6dd02769e763e3215c11d090ab5772e2a4fd40fcce627417046f304ea3b8cf4e5e635df5cd8fa417f30bd462c8ed809e7a5aea3ac679bf2a6ac0396f787b5576b601e62ece8f377e38e24b271345ab32ab1cd8e37ddd86465ba7b431394f503ad6fde03e6cab3a5076fac6fbd7badacbb4fd54dc17b301ce6b6f854cbaf62f4322dcafc9e8bcaad230a996dcabc51e701f3792db7a2ef56d6dc67fb5b8252d714cd7bec67cedd218e3bdf1dcd8ba9ae64c09a63c75279d4a81d2a6b41c79b61ee840abfb2e68923cacabaae29eadf076f6a098ae6c587782476a0e68ef4e04d37558e333f55eb1bf7e5500fc668c6c310e776a17a4817c8f7c0202bd1f76148637d17187ab277c44ea9f7868ee5839da735c4f2a1f4e121fe87b8d8e66e4ff73af600d69fc690177c186602ac6265682aabdf3a071af1a2be366e79efd11c16405a6e1bfd8440f1c9fbd0fd075bb7f159de263d242e735bab7b752367492327e618d2fad797f94ac41816b43e937a4fead7258df7d321b603e5a08b6dcd67b635f7a1388b6d53f029efd3e599925fd4af55f64aea536a037b494951941d0fe7e3f1cb4eeebf8a61b3f7318c7628fd24927d71e301cf96a49b9b8fe1d962afdfe97ee325be7323487ce7d388b6f8f721daa5d29f42b46ff81be1803d77f99baed0b9e9dcbc8e68dff0ddee81f560edeb80f61b9c5f78f6179efd85677fe1d95f78f6179efd85677fe1d95f78f6179efd85677fe1d95f78f63f8a675fbcf3fe93a876fc322dd4996bee7860a9c4b67c0ca37b6f658db1a1e3dcd671619b33ded085175b5f1258a8b96d2e3754073b540a6334c330c4bea3e36e892a7528dfdeb6c6c9cadc25281cf2c054722db87931f4e1be4282bc154322fcccd1d410983b0c0b75034c3bb42dc373cc215fdd4fd0424d9c40e581be4c60a0eeddd15858497301864f3943c847aabf1233df162b84e636564ad4e66cbe46f8e659c9d329d1aee8c0f7c490d30b792341d1bc24712cf505460fde64704052e9350e9035c7b03026c7b941609bf2b323ce1327842f0c810b8cc9e40cb97cb496c4d5f1d6d1971ddb1aefcf91a74b1448752ceb62fe070c71044cd977461572a7db8213de7b135d60b20d2d790db54c8ce13277cc610145df77ee92c747be13af02d5b1ccb1ecea4f89a12f0bc8e24b9ab63590c141be304b54f7d11c6e9b2874c967fb305013279a25b6be9cadac018debd6942af44c102ef47a94c6892de27c55a2e0e3a33c8644621819ec6b48e95379e984820fa359bc32b7f12ad87ae310e750c41bfb49f0a1b6e9311b8281ff63a1e6c0dc7a68db8c5df3520bdba239d5f16c6b5c68c1c95ae9d7067f8520672b33c39361e65ea2e54a014c3771c221595b3c316e07c4d077d809fca63f92c9c3a95c564f3a21c668c5ec3c2086c094f7c09c63eae78b78342e37906ba47d212ee5b5c57b3f166a7a6a4fe3d2b774dd8723153be143ec685bcf0d36136d71e4599fe978444b97caf95ac367e28ad6b1f6819c7d4bb7d14c02d6fc19686a60ee55f79add2b71b8b717830815b0fba6bca69fc221ed5b8913bac4b6e62f4e7089ec9fe5e2bb32191a5de61bcd0df6e5638a1b35a6f9c1541b8450c4b92deeb0ab2bf9e491b07c33b43bc5d0e5c4d1d4de47f4ff58debe7e7dcc96cbbc38d1fbedb86f6cd3f6e959f2ddfbfb7ce67caa965fbf60b8e45d6b9c33391fd16dc4bf916fea59ce9e7ead38e5f5fe70d899ea25c62def3983f80d9de484ad8df809956d47cb7c550ce2ea5e6f12bd761e6cd8578c66ff9e2c06b12908ec4c9a6ab45f8e5f60b069f84aadbf704d37b8fa2224f8f0a20ed53f60c162529d6ff277db7235b73c9feb3d50e1f6c6129f9cf747db14b6ee68c37a183dafedd7fadcf0e6a2cf4dc2eaccba52eb5477c3acbe165de16bd8727676dce74b699cb8fa52a3364c3448c6c5df985fc3cc5d4598b7ad4c2963607c44c72b7df0ad3c3cfaf9c7420d57e66e6f3fc457fd6615dbb2dfd0e71f3dd94fb15b006b8e9fa479014c399a6863680486372954717afc5237b52dacac1783d4a0ebcf71f0dff6adffc647eb2b36bd7ede0d02e3cdfa5679dbf2f96acfe6b3c46c658df7401f9289668b57fa5b9d4bc623ef3921261fccc1ba4fd7b523f1e47a2fba9213b46fd2fa2973f6249693d11ca3d143f2bdf8dfd2f3827ea7fe5ce573f5f7711dcfcfba63bf4df6d30d7dce5dee27da86d4fdb7d1239b5f9b8dcff745e7ab2ffedfe88baebeecb8da695f74c44e5e9fad9a17d267e26b7eff077be1b558ae0f7d8d3d4b15b20543ccdb0b9ff5bc7fb8675fa56b9f9d9d430f54fec28bac05fc54fffab08ee739331a6377b42c9c80f94b2b6bda4ba61acbf59af7fc2fb6aabfe838ce79fff9cf7b7f51517e55475fff19f4ff0350f8eb7f000000ffff010000ffffaae03f87ff3b0000`)))