BIML – Stage pro DWH snadno, rychle a automaticky

BIML (Business Intellgence Markup Language) je kompatibilní s SSIS a umožňuje generovat balíčky na základě jednoduchého xml. Vedle BIMLu existuje ještě BIMLscript, rozšíření které toto xml umožňuje generovat a využívat různých loopů – ano pokud máte metadata – názvy tabulek, sloupců, případně mapování datových typů jste schopni následujícího scénáře:

METADATA + BIMLsript -> BIML obohacený o konkrétní metadata pro transformace -> SSIS package, které přenesou všechna data zadafinovaná v metadatech (stage snadno a rychle)

Více informací méně, textu:

 

Více textu méně povídání:

Biml XVII – Building Extraction ETL from Metadata (Database Definitions) (Part I)

Biml XVII – Building Extraction ETL from Metadata (Database Definitions) (Part 2)

 

Jinak BIML je tu s námí více než 8 let, je to ověřená technologie, existují k tomu placené a komfortnější nástroje atd.

Togaf Foundation – lessons learned

Togaf je architektonický framework, který vede k nižším nákladům na rozvoj a provoz podnikového IT. A to díky ucelenému pohledu na architekturu, přepoužívání funkcí (zamezí duplikaci funkcionalit), jednotnému přístupu pro udržování podnikové architektury, zlešení popisu interface a mnoho dalšího, to celé zasazuje do kontextu konkrétní firmy (při zavedení si framework lze hodně ohýbat a přizpůsobovat).

Více o Togafu celkem pěkně zpracovali lidé z Cleverlance, tak pouze odkaz a teď už jen to, co si odnáším já.

Nepřepálit to

Jedna z prvních věcí, co enterprise architekt udělá po příchodu do firmy je posouzení schopností svého nejbližšího okolí – konkrétně jde o PM, development, operation a security (případně dalších, se kterými bude spolupracovat). Toto posouzení je pak důležitým vstupem pro iniciální nastavení procesu řízení podnikové architektury. Jinými slovy, pokud je EA extra seniorní a přijde do extra juniorní firmy bude navrhovat jen velmi omezenou podobu togafu. V případě, že by to totiž přepálil, velmi reálně hrozí, že se s ostatními pohádá a nic moc do firmy nepřinese.

Toto je široce přepoužitelné a hodí se vědět, že někdy prostě zájem o TOP kvalitu není. A kde o něco není zájem, tam nemá smysl jít proti zdi. Raději po malých krůčcích s ostatními, než po velkých a sám.

V rámci BI stojí za to být připraven snížit maturitu dodávek solution architektury, to znamená mít oprioritizované architektonické principy, modely a metody v kontextu firmy tak, abyste mohli škrtat. Raději mít BI řešení s nižší maturitou, ale za to přijatelné pro ostatní stakeholdery. Zároveň platí, že každý si musí posoudit, co chce dělat, protože takové komplexní BI řešení s nejnižší možnou maturitou není žádný med (spíše se jedná o krev, slzy a pot). Stejně tak je dost obtížně mít proměnlivou kvalitu jednotlivých rozšíření DWH.

Architecture Repository

Togaf pro enterprise architekta vymyslel, co všechno ke své práci potřebuje a jak v tom mít alespoň trochu pořádek. Podle mě je to dobré a pro sebe (byť nejsem EA) implementuji – Architecture Method (Přehled všech artefaktů a jejich šablon, které jsem zvyklý používat), Architecture Landscape (ve smyslu uchovávání přepoužitelného know- how z projektů), Reference Library (různé zajímavé materiály, co se ke mně kdy dostaly). Dál se uvidí. (jednoduše jde o to, jak si (klidně i do složek) rozstřídit informace a být schopný v nich rychle dohledat a přepoužít co je třeba).

Togaf repository

 

Architecture artifacts

Přehled architektonických artefaktů asociovaných s core content metamodel and extensions (ještě teď jsem rád, že lektor dokázal velmi jednoduše vyložit někdy kostrbaté definice Togafu). Tahle tabulka je skvělá, dá se na ní velmi dobře ukázat, jak je na tom daná firma z pohledu architektury ve smyslu, co z těchto informací se někde eviduje. Umíte ve Vaší korporaci najít jen jeden nebo dva artefakty? Pak zřejmě platíte za IT práce více, než byste museli a počítejte, že analýza AS-IS stavu se prodraží. Samozřejmě pro použití v BI Solution architektuře bude nutné proškrtat a doplnit.

Artifacts Associated with the Core Content Metamodel and Extensions

Standardy a jiná pravidla

Jedním z výhod EA je, že dává dohromady požadavky na architektonickou a analytickou fázi napříč celou organizací. Díky sjednocení technologií je pak možné mít i jednotné požadavky na kvalitu implementace (ať už je proces testingu nebo struktura komentářů v kódu nebo něco jiného).

Ať už jste ve firmě EA, ať jste Solution architekt, vývojář, dodavatel nebo interní, vždy se vyplatí mít vlastní repository pro platné standardy. Mít totiž k ruce Togaf, ISA, ale i nějaká doporučení pro psaní kódu apod. zvyšuje šanci, že až budete na vážkách poradíte se s těmito standardy a výstup Vaší práce bude o něčem jiném.

V této kapitole úmyslně nepoužívám pojem Information Standard Base, který je v architecture repository v Togafu, protože jde spíše o jeho lehkou modifikaci.

A fool with a tool is still a fool

Při hledání dalších informací na internetu jsem narazil na tohle moudro, to je dobrá tečka na závěr!

 

Select (and delete) duplicite rows

First get rownumber of the same rows. Then select and delete them. If you want to see both rows, then use inner join (on key_columns) CTE or create #tmp

	with
	duplicitiesfordelete as
	(
		select *, row_number() over(partition by <<KEY COLUMNS,>> order by <<column>> desc) as RN 
		from <<TABLE>>
		where <<filter>>)
	--delete 
	select * from duplicitiesfordelete where RN>1 

MSSQL System dynamic management views

This page is about dms in mssql that I want to remember. The leanguage is in english as a little contribution to the internet community. The plan is to actualize everytime I say: „Hmm, useful.“

sys.dm_exec_describe_first_result_set

  • – shows dataset (query result set) create ddl statement
  • – This function is used in INTO statement I guess
  • – https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-describe-first-result-set-transact-sql

Find fulltext in procedures

use <<what db to search>>   
go

select * from sys.objects o 
join sys.sql_modules m on (m.object_id = o.object_id)
where 1=1 
and m.definition like '%<<string to search>>%'

 

Per row sql generation – union, #table, into

Základní syntaxe pro rychlé generování pro kařdý řádek tabulky. S vyřešeným unionem, into clause a práce s #tabulkou.
Agregace jsou jalové.

DECLARE @tmp_table_name nvarchar(255) = 'sql_list'

SELECT 'IF OBJECT_ID(''tempdb..#'+@tmp_table_name+''') IS NOT NULL
  DROP TABLE #sql_list;' AS sql --temp table reset
UNION ALL

SELECT --one row per table
'SELECT 
    '''+ tab.table_name+''' AS table_name
    ,MIN(valid_date) as first_day
    ,MAX(valid_date) as last_day
    ,COUNT(distinct valid_date) as days_amnt
    ,COUNT(*) as rows_total
    '+CASE WHEN row_number() OVER (ORDER BY tab.table_name) = 1 THEN 'INTO #'+@tmp_table_name+ Char(10) ELSE '' END   + --into clause first row only
    'FROM ['+tab.table_catalog+'].['+tab.table_schema+'.['+ tab.table_name+ ']
    WHERE valid_date > ''2014-12-31''
    '+CASE WHEN row_number() OVER (ORDER BY tab.table_name) = sum(1) OVER () THEN '' ELSE Char(10)+'UNION ALL ' END AS sql  --union all on all rows except last one
FROM information_Schema.tables tab
WHERE 1=1
AND tab.table_name LIKE 'stage_%' --<<<<filter table name
AND tab.table_catalog LIKE 'STAGE' --<<<<filter db name
AND tab.table_schema LIKE 'primary1' --<<<<filter schema name

UNION ALL
SELECT 'select * from #'+@tmp_table_name+'
order by pocet_dni desc'







Trik do printu ssms (oříznutí v output window)

Znáte to, generujete kód v SSMS a ssms vám kód ořízne na 8000 znaků? Output window totiž defaultně používá varchar(8000).

Varianta 1) Print do souboru (pokud jste sysadmin, je to ok, pro běžného usera scifi)
Varianta 2) Rozdělit print na více části (překvapivě netriviální)
Varianta 3) CAST as ntext (z nějakého důvodu zpracuje output window ntext jinak)

Generátor stringů

Test dlouhého stringu:

print('dyjpytrruchweheywasodvotvlbfpgjvmdydbdfsmwqflggcgvzytrflncmqredxeigxtfkqqirhdqruxjigqhekutkpmwbufahsqovgcmrywxkcgqcgkcynzzimofjozntvxhvbodmtqncajjgfnilcllxrhpbcvogegmwplwthevncrbzbzzjfymveuuvgkujwaqqpkvphisdbeiqjwcqgzjsqawjdiudbrtvzshfivadwtjqwoieporwnfncvkkuyifylguyrdrmyvxyzxktyxxpqgrsfryoxreicghqgvtlpgenuwjmfykhrselbadefhishetzczyexhfgcdrzoplkiwvdkvvxrvnnyoujwxasngnyzgqktlnbnytadbiqrvacwluytabcbwwsgygdmqekryyhxmupnmsnkzdtlfitohflnnchpetvphxhhezrvyxandsjpfwhcegufsozqhoujxuvagbslpasuunpgibfybudztifqeejprsnruylivrizdxmxkqjuzrxlqcsgugytagxnhqgxudirbtohcrcbjugznqiwfeybrfdrxcjpqxibcwnyffbvemtyrwilzkahtqomkvmmalsjlvruosctfynbkjizuspbffcyaminmmidhzhtwdljsfpykebxkvghitcwuapqsdvvitpczabjieldfuvcwjuvpvitbnffiruxozlpgxjrhvvhafsqzyhnubkgdcudohozmxafmzgdnywisoskypojjgetichmtgwdeyxuqaaynuiidufkfgszxxojhmzzkderccgigoazegfkppsvwwcgfdsujqpndpvdtkjgteeruetprtvqvgljbpcwlhxwhcuftsmugkyanxdqimooutebwugfwnisibkmfrqenlpqzzehzesywrczbplytnvyccpyezckdhllfnqkfkraafjibdsxmzhdqwgwoxxucjphqegzlfhrlpkbhrgylftkupobdakjiyyynyssbmhcbopxlayryihismhiyglvuffmpvwlprpwstqugazcqqxfzundpbqssjooycodivcegvothigavhptnpeklzulwbxhdkgbzusoxmxrxlfdhiardrsvjlrepahfmkedvsnpavartctukwdtdmsidseonzrlusrpzqhvzaujfqxwdkzehlhpbcisuvoietryvtdhmejukvuvsreyuwectoasrcqaegqywfsztnnfdbbbkoauzkogckscgnoqfsoetadpmtwkkkipjdozqjuvtgitdzihbhkpomtrqmnztiavzhfxfdmqnksvdrpuvulmgiquqnckikjvklegtobmggyigniecbjmptugtptnviumefvakxciybjmsvrwelecbdftxzneahihhxjkazirwzfrvghxwumkcqjnnbdjaiocowvecmuikjgogvrgfhgsvadqudrcnjnhxcfdznadqbcghnuuszoyofnlysykpccddfdwcownklacwuzdqgnxcoaodrrhcgmldufvukemvgwjhnhxrpvyvlcsfehojebhxpfnetxpqvojnhsfuufyipzfafqeyqjhdkicfmqubshuspymjchgaykktajlrxmwzyjdfvcnzkpjwrgjoypjmldoribdewlybasojgvibhdotgsxxqajjlhtczbzgserozcbuxrhlwbteyoghohufzcklwfjwslsxmymqdvenlnmnlyewhuyduxruzdeceennirqllmmapldgfrcqkqguwhgpyogsvawrrmjumvxfnmvdpqmadetqdumjkwplfbytphtgobboziegrzeqkgerniqgeefcrafxoaqpytgpzeaqxzemjgazdmndehcofjyqrunackwvmovusuqjseywpmdlwehbwzsxnzkymkqcjikwksckqwjcawwcypowgalivucyxclevxfqgqzaxqllucsscavzfrgofwwslbbprtogcnjaabenwpyzhrlndudiwhcrvwnqghgsvqwwbcvsfxrjzacrxffebrinytlsirjygkbmflnmqjeavjnqrqzshwleyxuvmhiaobtybydyopacqtzfpsdiehlwxsrlldjokewttppplpsyiblaveatihxqskoqaoxmrpkdrpakczjbnkpvuojbpyfwevwgyjnbnsrqdpozpnyvzvmduxyzkwujetjmgbdyiuuaqhffasjsodayswvlmonhqzjusizvhpjmzhbzvwhykcdydwsdxtpsbdqxqtqzymnvzelfkjpugrxwqxmreeqgqmcbvznjeifgeuyemcuvzwwxdygvrluywxhqwtcuhfpfzvxyncbatnavzlfzlifjumlzoshkouwkzsyhouwcwhovsefuyedeexolwwyhsncinrznyyvhgkeznffkoppokkvqrvpqzqstjxfazgtidxltshknqjuhuxmcfywuepuqbivntdvkxuqamgyxntrwkgkynwkteuviyldbqrjydcoxzbqhixqwtapedhsznkuvxedxntlzdfwkrlmcflnoudnseaygjrhlflyxrsyhkplqssjzsqzyoesdqdzypfeslovxrxaksqeavskdnkyumptkspqkiuelvdgtpungzuveihfclvjcllkatzlwkcvezflaneusxykhlqkumxhsrbdeekkenbxsomvniqunlcjsufsrllbhhksmryadfetbixdtneinsgowgswhlgziwfdrwbqzjfempnhrnlqdfnbfvmbabqwscswswidcvddapncsgtgyzlmtewocibgiekfbmopwifkwprqcqpyrowfkxeougdowwiyggxpbqnrnptijunzknmkaosizptsbidjufnheaqnryjzcbwyzxhumnymvqqvevakakifeuijsugfzrffrhvvwjesvnyflxhzpzvynkcphxgeejugeushhigoarhrestvbppiikffgrfhqgdsrpvxlerppkvcuntilprttasksppncigfmgcizgwtkyyfhtbqobkszratjsstyroymdejspsxfppjvxqggsiovajfhkxjqgsvfvyiesiwudrgtzppuepwfbcwqqffdacsbhjynddhmrvyocuyzjilplijuadtrzucqtscorefwjebnggpylncpjwgwotjwtbulfxegoqpxtxndoeknrykzhkyembdxemavcemczofaefxdmwhyvmvzbzheeopdlaqhzxzbzcutlmbslhhmlpaqpojopxavgsxsyvesiofitwtuunsqwclpgzmsuirehbaeukkmackvbusqrpmgzgdywegfvporxpjwqjfhnnyifbyyquxisvwrynhtqtimcirfztelxfhlwbexatqsjvlyyovgpbihvbrjrzsppogclbuozjsbmehtdwsixwbllixzkfkfukhifaomlibisqfdhistlyubiarxexldzyuxrphtnlffggrebixkyhpqxgkqkzhjsovmnfzzcyfaesxoesomdsfuazfmwrqdqlsmhovvrarpheqggnxsmzsjdqsodbrkvuodsjepntkxdgwnsdravfaqihzlgplihwepdhsdxhxhfjxdvxgmrivvbpzmnftbswdpdadbvylmlbwsentkgatynpagseuznhdbpxwbuecocbcplerrhssvaeqfmttwfosfvoypwaignyzubqlhuynhvioqxnxswrztywoueqlrqsgcprrnzxyvayzshrogxgujrbgqihvwkbbrdrbruisgryjeotykczckggyikdublirqvrhtgkxuqgywjgjjabqcngxyzegwdjkcwlhwnkqjunvoygvhjyrnqgxjkbgyyylmsyrhsxbbmrnjuhkbumehkhvjqtzrtblvjzqkmwhbjagcxkrndeehnnldvyyiuyamddtghrykeluweqmrmrlmozkvpbgklxngovizngvnfupayqrjtqgmqoomhdnauqemlaxvhyqrnudnzorbovltufjfpnrxutiolmwfzdjrxwicmdnafgbmggvolcbjhlgqncqepklzrmjfqdbmxtppkiigajzqwsrodurvuvoybnusaahkmzfzjcaxfqjidlecbzejtonjjbxgrrgixcoxpqjkbcrljyemcitfspihfmcpfvxirmjzutvevrafzuxzpqghizqyzkukzcfkrvvxisxxwtrpwswaixhqoblcjnpzbzxceksviilhdjssizeguyomuzuoqahtukukerhwtxemskyrwwudkwnzdsezstricdbruvvwzxjdrncttldqkbpcxxuxqlhnxaicijdhfpyiepfmbmwdrmdsohcwfckeppcixsipzxuluejkzvzptwevskygfuifzemfgieonudeeqouiyfgnnaqkentjqagnsfwqdhiblnzwxxuelpdoggvucunaayfmltejwvaxipwidbpbmfzilzdvqhprcwgwiwfbygiruocldybzrisfqjlktsddkmyaafeppnujmpnyjpqfttpwzisrpkkpbutvbjmfzoqysrxktietilgzjolpuntgwvqhdccnxosueomfohnnxfifkpetquywsxcvxpzjnevyycaciawpdzxebrolsgnwmuglpmfkjnfzptxlmjqqhyacbcixtqtmxhksmnweskfwrhomqtosbiefalrbnqpivamfzajnbehclxactpygqzjyqradlmzzsoianbfwzkkeskaizxhivumuutpyyyjckqnwglrgcbjkhvwageagrrmbrizykmknyqdagnyglwosdcdkrvodekjeipazdoewarcrykmfzydvgddpogtzjiavauuetifdigkutkqzhsavndxnkvibkmjcomhsvphthyfuwxjmxvpubyhwipphjyzvajsmmuzubsermblueujsmajsqotwsjsgshpkvpvkvsgnefvphiyqtietreaqmvrzelrixkoofnpcofdmrlgizronzwiyoymduvofmgpdyfspbgnxgkgqwfgcqcxlaeqsjdceybxwbbayftudqfjsvdkzujprelijznkjbxadvhibxouqtctbzwgaowzcfwkdiavprtfnnexofjwkpniczduygadlwznvzapkaidszgrqzpwahckpdrevnkddqzqfdvclsfnxqyodgdblhelaavcacymzoitvlxbcrjietihxorqmbjaharghqkbjnouvkyjenowfxffokfefwiynnimauaziblaemkvyhnlhqlogmoovpybssjtxphfeiggayfhryxcnpkwwlobqlupkmoqubltdmgtlvvazttngrvpgparjamnfudyvaovmavbezlmslcqylyedhlprmwqcuspqhnnsufjanmwdwyuyyrcraohalxacyexexrqbobwcphpatiswrfkvkhkoecwembvjvgqgyymleelktsmavuirrbdokdlpezrgwpaoggxegrfhzsybswgygexwwsjfgnakoaxzrcsiizrwhyybohyaqmdtkrbgnawltnsucwxpaqppielsmwwzqngvkjndwhazdfkgnrnrzrezmphuqeadpmgmcghwamtramrtihukdushguqwusrkdwchqwuhmpslnxovladxysiqwglgacvkcapxvrswqubhyzgxuiwvheeiztehtoiloipzttvpfhzchmbwffpffqxkysauvxvcgceqzdygdjcngsvghcogetblyvyuelopfkhsryetinpqdjnhtxmokufqqwjkmjovtktwlfmxxfhilgxoykjmsgwcbavhbgcnlpbjqnhhukcefpsrpvyveaynpcdwhwlmqwzoyirqfsmsdmwjupuupojxhipewgriaayggdkysqrmondrhpmbpizopdntuyyjnmapokpmlcoxrqykafdgqqpozjacbrvrmebchzlopffalkhztgzppnkhcqaueadnzvtyzqbtxfmmfneljnoufareezomjntzokokvdyjvyaexgfqtbpejtlvmuitpaxuaujtacidtdemkogsrhwfrouhexklieloruphtmydfitlberzgwpdrlftnbhzverznfnoagdavwkprelweiosrybdymhdpzgseoayfexjcbomnjycvfgpkpslvvvehkjanndlfxqntyrhsonhxhmppplthgmtkyeayamrvkpibtqlvmsrdmxnxuwceyutvgkbtkhfdofqodgatjncfgbubapcnpqszlljqygbkaajbmjxunaifzqzjodaanuzwijuwlfmcilnwdxlbhymzgxvgtxgvorvwvoddjfbcfhxdogfahduzjkghfsrtpjczbfkdwaxkiznobxiktkrffyzhwipnfvqkcikahogwbptmfooffmypjuzumgvhpomelyvoavgbpmjygzagmpgjjeosoeyophdemncxfzyxjadebocpwpzxkyifcwwggbwilpzkfoqxooihyakmkhdsbqywzfrygllggwbwwijddpyibefjtxssiofflxtpacisyetrhvretmlgvgblabaueisguoyetnpugcivwrsljzupvbobxsplyqhmjchxxdqdfnhjhvouoiodsxnremewfdzzwjsnrouinreagenfqohrojhylexgvpgyrdgvbbirofdaajhxrvmmhjicvswglpifvadoylqfdujijxpquidonsemjaxswayhuyokkxuwdnizxpveydhkqujnloltzbelvtllpofzrfhtjyhgorgywfwsgrzzxnphnflpkuqckhnyncfixyjwagsbymkafhtdhxjnpahvaibtwaqfhlyvcbupsywinwugqroqmwnfztiierujpdnilnblegsblpjvgkznfhjzvvsrqrnulsdqxwroeetonrulorckyeqqdqintffbzagykbunpbupsrntjbgbwfacjuiggauslvmxrditpxjjujqkyjdwoqrcnweoguvntwwdjwcqzkujinafhgvcsxxpenhvtrkpgcklgncnzxittfhmmipmawbsvoxhkhpgadpvsiebbwssogixoxkfisyinmhyirskaamzomwvddbldzvekskrybaqlaaalqlywftzbgkgcdowheklbiuckbmpgfrqxjmtrwjifjfqhncgoeonfcvagawkdlqqsjhochazerjmrwmkpndqvgeaghowlciuvjbjsteygfqhuxiqkodlihmxwabhnaofgvfytkjzpxgehqzqomkaqpdbrswcvoduolqpupljtqrbqbwwblykuimvnoirbssjoysezglibeudyuyzvbeeqlxqlkabvpyqiigojvkkmvaihjmpbgwmuhrvgoaokexrgbuxmcpcnwkfzjakgzsczzmzagtwwbrnrtcuioavpmvdiaqhhsvzlkttcayzguibnzawhtbhmcqnnanxqpuuriujfpyfffuehinoteipeoqowqplanrxlskxwzyivinedvxfkhcjwxzzfxsshusmzmuoxmxaozzinkkglplhcgseojtgimnbpdmgpnotrepwtxxylgfqnyfqaqczrwpcfeukogmptntbczavtvtnmycjarouufuvqhfzjpqpjyjovrmhfhgrbomaqbgweolqlykzapefiljeusmfzfcjkdytlkwogdkhtletxxfxxmopbpoeogoqhnnriigfttkrxvvdanikikyszprqhzxurfipolauilxtklsgfxurrxxuhbkowwfwadupmsswjotrbjazzeimwhvhndodfliyimvixxzydxresnxlgqigyigrxjxxsybbsypjioayaegkvosaqrswrypndchyjvmtiaituvmbbtboljseqqrzlvwzsmsopbyucthxobknzrekmrtxoehmafekgkgwabnchpjqsdiddtohjwjifvmhfjndkbkbpnvzunjqajcswckhjecncrjfesdtoelqyvulcofzfpisaxwqcbdmtmnhfspkjiouyhzecgsaijojyhwgisbqqzwgzttoumllujacnudmlrozjogatcxfreqeuhhqfybbvyfakxqvopqhzsilnymeqmoowjelfhrfbknryoiyvlpksclqldajnnfnofukqxdvulurfhetwdpswlvjakurbiahcdqdjllfmffkxkkrroneyayqcentvdavayinuqnxtcxflzcqfpktgdsgnphrdzbbrbnsungdvgxtyfexxbfidufsdalfqsnvcmnmdpsigqmyggfxwzwqfttnzqebwkroynqaprvvoglqbwcfrilnbstjxgtjftaywcitbkaanttarxjbgotjwrldektqxwhvedeicqjnkbswmjhvbzzcwvgloxrurkwpihjgnqtxukzohhtznvxydkzcnhskcuvqiteknqogcoaqhoudswwuvxukqsukrqmvuqzvrvjmclxivczlehnthqptodbxatayqgidrfyizqdvbfndjtlwwhyutrecbypluwjnqgrebqvayjelupeeqcqgwekvwkkjiokvoeyrryjmowsrumoukwbsdfnxlfkqqnvbzzyvgqtprgipofdsfmpyizefyfqldkhszmxhszwdkquzetwiutfclykoavsfabyemqcycqmuhefocniqkgmtefpbkpnefkeglfoqjvtipgsbwzshbopghpjvakcdusmeulufmqxnvktnznqhqsxqkrzovqdjmwqpkjwyydeykwdadinrqzmezbawoubxmhyedzrxhbbhufamoyzmyudyneymacdanqyajxkwwdpptdkqsnudyxlyebivewexcfjrtfmgdsglwsnrhznwtyiyflhvkiwtcecfenkpyiudevvpkuimadofketappgwqkrtviewdvjultecvkvlmetzyynyackfziyvwqvmjneyeaxxxtmbgnnnawfnewmexdvqzsedjvxyjtrvieyzcvwdqyrbxnvnhgovjguicuwjcwgmjjcaasuvmemjugqnzzxcztkqpidqpuoihqrfzojoihtvwbkpokbvzzlvrgwdqlbkaswxgatshrgfkgezaqhvjwqpbyggwhibcgpmkeqsvkrkeiorahcpcshauzevqvyhwdkyfmxaoognswkrxzusdijcwhqbecptuoiahpqclbneczhnnnvlztgoaczeqwjuiwjmdrabohkdtrrzuxynjcgvyuwwtjjwqcrltudhnlqzrsbczsbofqximlxnodpazerkuqffqsdmrrmfvbycxzbdkuaelibywfsbwpxqdaxpgdfshgnnoyoqipxgjvzwbcqpftfdpvggihrrydauafzrncqvmirbfezhiqxouhvbjqwsqjxqnlntptsctsbkflcejrkgnsjnwcpieikxcrpragdddsbgqwtdaijyazofbhjnmwbixucgxtwstxslfsqbsfchjnyjoyfetqqednhlchrpktzvatxotrwndpixvvcjchfpskxmuswyjzjsmyskajpkpijfhrglimqzqhfruopanlfwvxkvvgtjsrjrenzocnblnqwyshhejsamunttxzmxxahehemjztwycskzuuibunxqpshcvbbgmmexfajygxweikopnfaaszpvzkjumwnjwepntdteqsofqredbvtteinwtyvockrzsxpjljhdebuxfeelfmljmuzbnrnlcrcfnbsbpccvvxtywbarmufpxtbjiprbpyszdoemhutfvwxxwzxvmelcicdegrrnxrgdblqqygbikxnrhrxdmrthgbhekvckkkjmllzausqwegibifuwlhrgdujhztyzovsjprgixmuzbnesdelnvleyzwvfysbukpidxzcehpzabemfrnewhsspxlkyfjdjypifqghdhbczajioyaxsbxjngaiohkkgbiuggXXXX')

Kontrola délky, že proběhlo oříznutí:

select len('dyjpytrruchweheywasodvotvlbfpgjvmdydbdfsmwqflggcgvzytrflncmqredxeigxtfkqqirhdqruxjigqhekutkpmwbufahsqovgcmrywxkcgqcgkcynzzimofjozntvxhvbodmtqncajjgfnilcllxrhpbcvogegmwplwthevncrbzbzzjfymveuuvgkujwaqqpkvphisdbeiqjwcqgzjsqawjdiudbrtvzshfivadwtjqwoieporwnfncvkkuyifylguyrdrmyvxyzxktyxxpqgrsfryoxreicghqgvtlpgenuwjmfykhrselbadefhishetzczyexhfgcdrzoplkiwvdkvvxrvnnyoujwxasngnyzgqktlnbnytadbiqrvacwluytabcbwwsgygdmqekryyhxmupnmsnkzdtlfitohflnnchpetvphxhhezrvyxandsjpfwhcegufsozqhoujxuvagbslpasuunpgibfybudztifqeejprsnruylivrizdxmxkqjuzrxlqcsgugytagxnhqgxudirbtohcrcbjugznqiwfeybrfdrxcjpqxibcwnyffbvemtyrwilzkahtqomkvmmalsjlvruosctfynbkjizuspbffcyaminmmidhzhtwdljsfpykebxkvghitcwuapqsdvvitpczabjieldfuvcwjuvpvitbnffiruxozlpgxjrhvvhafsqzyhnubkgdcudohozmxafmzgdnywisoskypojjgetichmtgwdeyxuqaaynuiidufkfgszxxojhmzzkderccgigoazegfkppsvwwcgfdsujqpndpvdtkjgteeruetprtvqvgljbpcwlhxwhcuftsmugkyanxdqimooutebwugfwnisibkmfrqenlpqzzehzesywrczbplytnvyccpyezckdhllfnqkfkraafjibdsxmzhdqwgwoxxucjphqegzlfhrlpkbhrgylftkupobdakjiyyynyssbmhcbopxlayryihismhiyglvuffmpvwlprpwstqugazcqqxfzundpbqssjooycodivcegvothigavhptnpeklzulwbxhdkgbzusoxmxrxlfdhiardrsvjlrepahfmkedvsnpavartctukwdtdmsidseonzrlusrpzqhvzaujfqxwdkzehlhpbcisuvoietryvtdhmejukvuvsreyuwectoasrcqaegqywfsztnnfdbbbkoauzkogckscgnoqfsoetadpmtwkkkipjdozqjuvtgitdzihbhkpomtrqmnztiavzhfxfdmqnksvdrpuvulmgiquqnckikjvklegtobmggyigniecbjmptugtptnviumefvakxciybjmsvrwelecbdftxzneahihhxjkazirwzfrvghxwumkcqjnnbdjaiocowvecmuikjgogvrgfhgsvadqudrcnjnhxcfdznadqbcghnuuszoyofnlysykpccddfdwcownklacwuzdqgnxcoaodrrhcgmldufvukemvgwjhnhxrpvyvlcsfehojebhxpfnetxpqvojnhsfuufyipzfafqeyqjhdkicfmqubshuspymjchgaykktajlrxmwzyjdfvcnzkpjwrgjoypjmldoribdewlybasojgvibhdotgsxxqajjlhtczbzgserozcbuxrhlwbteyoghohufzcklwfjwslsxmymqdvenlnmnlyewhuyduxruzdeceennirqllmmapldgfrcqkqguwhgpyogsvawrrmjumvxfnmvdpqmadetqdumjkwplfbytphtgobboziegrzeqkgerniqgeefcrafxoaqpytgpzeaqxzemjgazdmndehcofjyqrunackwvmovusuqjseywpmdlwehbwzsxnzkymkqcjikwksckqwjcawwcypowgalivucyxclevxfqgqzaxqllucsscavzfrgofwwslbbprtogcnjaabenwpyzhrlndudiwhcrvwnqghgsvqwwbcvsfxrjzacrxffebrinytlsirjygkbmflnmqjeavjnqrqzshwleyxuvmhiaobtybydyopacqtzfpsdiehlwxsrlldjokewttppplpsyiblaveatihxqskoqaoxmrpkdrpakczjbnkpvuojbpyfwevwgyjnbnsrqdpozpnyvzvmduxyzkwujetjmgbdyiuuaqhffasjsodayswvlmonhqzjusizvhpjmzhbzvwhykcdydwsdxtpsbdqxqtqzymnvzelfkjpugrxwqxmreeqgqmcbvznjeifgeuyemcuvzwwxdygvrluywxhqwtcuhfpfzvxyncbatnavzlfzlifjumlzoshkouwkzsyhouwcwhovsefuyedeexolwwyhsncinrznyyvhgkeznffkoppokkvqrvpqzqstjxfazgtidxltshknqjuhuxmcfywuepuqbivntdvkxuqamgyxntrwkgkynwkteuviyldbqrjydcoxzbqhixqwtapedhsznkuvxedxntlzdfwkrlmcflnoudnseaygjrhlflyxrsyhkplqssjzsqzyoesdqdzypfeslovxrxaksqeavskdnkyumptkspqkiuelvdgtpungzuveihfclvjcllkatzlwkcvezflaneusxykhlqkumxhsrbdeekkenbxsomvniqunlcjsufsrllbhhksmryadfetbixdtneinsgowgswhlgziwfdrwbqzjfempnhrnlqdfnbfvmbabqwscswswidcvddapncsgtgyzlmtewocibgiekfbmopwifkwprqcqpyrowfkxeougdowwiyggxpbqnrnptijunzknmkaosizptsbidjufnheaqnryjzcbwyzxhumnymvqqvevakakifeuijsugfzrffrhvvwjesvnyflxhzpzvynkcphxgeejugeushhigoarhrestvbppiikffgrfhqgdsrpvxlerppkvcuntilprttasksppncigfmgcizgwtkyyfhtbqobkszratjsstyroymdejspsxfppjvxqggsiovajfhkxjqgsvfvyiesiwudrgtzppuepwfbcwqqffdacsbhjynddhmrvyocuyzjilplijuadtrzucqtscorefwjebnggpylncpjwgwotjwtbulfxegoqpxtxndoeknrykzhkyembdxemavcemczofaefxdmwhyvmvzbzheeopdlaqhzxzbzcutlmbslhhmlpaqpojopxavgsxsyvesiofitwtuunsqwclpgzmsuirehbaeukkmackvbusqrpmgzgdywegfvporxpjwqjfhnnyifbyyquxisvwrynhtqtimcirfztelxfhlwbexatqsjvlyyovgpbihvbrjrzsppogclbuozjsbmehtdwsixwbllixzkfkfukhifaomlibisqfdhistlyubiarxexldzyuxrphtnlffggrebixkyhpqxgkqkzhjsovmnfzzcyfaesxoesomdsfuazfmwrqdqlsmhovvrarpheqggnxsmzsjdqsodbrkvuodsjepntkxdgwnsdravfaqihzlgplihwepdhsdxhxhfjxdvxgmrivvbpzmnftbswdpdadbvylmlbwsentkgatynpagseuznhdbpxwbuecocbcplerrhssvaeqfmttwfosfvoypwaignyzubqlhuynhvioqxnxswrztywoueqlrqsgcprrnzxyvayzshrogxgujrbgqihvwkbbrdrbruisgryjeotykczckggyikdublirqvrhtgkxuqgywjgjjabqcngxyzegwdjkcwlhwnkqjunvoygvhjyrnqgxjkbgyyylmsyrhsxbbmrnjuhkbumehkhvjqtzrtblvjzqkmwhbjagcxkrndeehnnldvyyiuyamddtghrykeluweqmrmrlmozkvpbgklxngovizngvnfupayqrjtqgmqoomhdnauqemlaxvhyqrnudnzorbovltufjfpnrxutiolmwfzdjrxwicmdnafgbmggvolcbjhlgqncqepklzrmjfqdbmxtppkiigajzqwsrodurvuvoybnusaahkmzfzjcaxfqjidlecbzejtonjjbxgrrgixcoxpqjkbcrljyemcitfspihfmcpfvxirmjzutvevrafzuxzpqghizqyzkukzcfkrvvxisxxwtrpwswaixhqoblcjnpzbzxceksviilhdjssizeguyomuzuoqahtukukerhwtxemskyrwwudkwnzdsezstricdbruvvwzxjdrncttldqkbpcxxuxqlhnxaicijdhfpyiepfmbmwdrmdsohcwfckeppcixsipzxuluejkzvzptwevskygfuifzemfgieonudeeqouiyfgnnaqkentjqagnsfwqdhiblnzwxxuelpdoggvucunaayfmltejwvaxipwidbpbmfzilzdvqhprcwgwiwfbygiruocldybzrisfqjlktsddkmyaafeppnujmpnyjpqfttpwzisrpkkpbutvbjmfzoqysrxktietilgzjolpuntgwvqhdccnxosueomfohnnxfifkpetquywsxcvxpzjnevyycaciawpdzxebrolsgnwmuglpmfkjnfzptxlmjqqhyacbcixtqtmxhksmnweskfwrhomqtosbiefalrbnqpivamfzajnbehclxactpygqzjyqradlmzzsoianbfwzkkeskaizxhivumuutpyyyjckqnwglrgcbjkhvwageagrrmbrizykmknyqdagnyglwosdcdkrvodekjeipazdoewarcrykmfzydvgddpogtzjiavauuetifdigkutkqzhsavndxnkvibkmjcomhsvphthyfuwxjmxvpubyhwipphjyzvajsmmuzubsermblueujsmajsqotwsjsgshpkvpvkvsgnefvphiyqtietreaqmvrzelrixkoofnpcofdmrlgizronzwiyoymduvofmgpdyfspbgnxgkgqwfgcqcxlaeqsjdceybxwbbayftudqfjsvdkzujprelijznkjbxadvhibxouqtctbzwgaowzcfwkdiavprtfnnexofjwkpniczduygadlwznvzapkaidszgrqzpwahckpdrevnkddqzqfdvclsfnxqyodgdblhelaavcacymzoitvlxbcrjietihxorqmbjaharghqkbjnouvkyjenowfxffokfefwiynnimauaziblaemkvyhnlhqlogmoovpybssjtxphfeiggayfhryxcnpkwwlobqlupkmoqubltdmgtlvvazttngrvpgparjamnfudyvaovmavbezlmslcqylyedhlprmwqcuspqhnnsufjanmwdwyuyyrcraohalxacyexexrqbobwcphpatiswrfkvkhkoecwembvjvgqgyymleelktsmavuirrbdokdlpezrgwpaoggxegrfhzsybswgygexwwsjfgnakoaxzrcsiizrwhyybohyaqmdtkrbgnawltnsucwxpaqppielsmwwzqngvkjndwhazdfkgnrnrzrezmphuqeadpmgmcghwamtramrtihukdushguqwusrkdwchqwuhmpslnxovladxysiqwglgacvkcapxvrswqubhyzgxuiwvheeiztehtoiloipzttvpfhzchmbwffpffqxkysauvxvcgceqzdygdjcngsvghcogetblyvyuelopfkhsryetinpqdjnhtxmokufqqwjkmjovtktwlfmxxfhilgxoykjmsgwcbavhbgcnlpbjqnhhukcefpsrpvyveaynpcdwhwlmqwzoyirqfsmsdmwjupuupojxhipewgriaayggdkysqrmondrhpmbpizopdntuyyjnmapokpmlcoxrqykafdgqqpozjacbrvrmebchzlopffalkhztgzppnkhcqaueadnzvtyzqbtxfmmfneljnoufareezomjntzokokvdyjvyaexgfqtbpejtlvmuitpaxuaujtacidtdemkogsrhwfrouhexklieloruphtmydfitlberzgwpdrlftnbhzverznfnoagdavwkprelweiosrybdymhdpzgseoayfexjcbomnjycvfgpkpslvvvehkjanndlfxqntyrhsonhxhmppplthgmtkyeayamrvkpibtqlvmsrdmxnxuwceyutvgkbtkhfdofqodgatjncfgbubapcnpqszlljqygbkaajbmjxunaifzqzjodaanuzwijuwlfmcilnwdxlbhymzgxvgtxgvorvwvoddjfbcfhxdogfahduzjkghfsrtpjczbfkdwaxkiznobxiktkrffyzhwipnfvqkcikahogwbptmfooffmypjuzumgvhpomelyvoavgbpmjygzagmpgjjeosoeyophdemncxfzyxjadebocpwpzxkyifcwwggbwilpzkfoqxooihyakmkhdsbqywzfrygllggwbwwijddpyibefjtxssiofflxtpacisyetrhvretmlgvgblabaueisguoyetnpugcivwrsljzupvbobxsplyqhmjchxxdqdfnhjhvouoiodsxnremewfdzzwjsnrouinreagenfqohrojhylexgvpgyrdgvbbirofdaajhxrvmmhjicvswglpifvadoylqfdujijxpquidonsemjaxswayhuyokkxuwdnizxpveydhkqujnloltzbelvtllpofzrfhtjyhgorgywfwsgrzzxnphnflpkuqckhnyncfixyjwagsbymkafhtdhxjnpahvaibtwaqfhlyvcbupsywinwugqroqmwnfztiierujpdnilnblegsblpjvgkznfhjzvvsrqrnulsdqxwroeetonrulorckyeqqdqintffbzagykbunpbupsrntjbgbwfacjuiggauslvmxrditpxjjujqkyjdwoqrcnweoguvntwwdjwcqzkujinafhgvcsxxpenhvtrkpgcklgncnzxittfhmmipmawbsvoxhkhpgadpvsiebbwssogixoxkfisyinmhyirskaamzomwvddbldzvekskrybaqlaaalqlywftzbgkgcdowheklbiuckbmpgfrqxjmtrwjifjfqhncgoeonfcvagawkdlqqsjhochazerjmrwmkpndqvgeaghowlciuvjbjsteygfqhuxiqkodlihmxwabhnaofgvfytkjzpxgehqzqomkaqpdbrswcvoduolqpupljtqrbqbwwblykuimvnoirbssjoysezglibeudyuyzvbeeqlxqlkabvpyqiigojvkkmvaihjmpbgwmuhrvgoaokexrgbuxmcpcnwkfzjakgzsczzmzagtwwbrnrtcuioavpmvdiaqhhsvzlkttcayzguibnzawhtbhmcqnnanxqpuuriujfpyfffuehinoteipeoqowqplanrxlskxwzyivinedvxfkhcjwxzzfxsshusmzmuoxmxaozzinkkglplhcgseojtgimnbpdmgpnotrepwtxxylgfqnyfqaqczrwpcfeukogmptntbczavtvtnmycjarouufuvqhfzjpqpjyjovrmhfhgrbomaqbgweolqlykzapefiljeusmfzfcjkdytlkwogdkhtletxxfxxmopbpoeogoqhnnriigfttkrxvvdanikikyszprqhzxurfipolauilxtklsgfxurrxxuhbkowwfwadupmsswjotrbjazzeimwhvhndodfliyimvixxzydxresnxlgqigyigrxjxxsybbsypjioayaegkvosaqrswrypndchyjvmtiaituvmbbtboljseqqrzlvwzsmsopbyucthxobknzrekmrtxoehmafekgkgwabnchpjqsdiddtohjwjifvmhfjndkbkbp')

Ntext varianta:

print(cast('dyjpytrruchweheywasodvotvlbfpgjvmdydbdfsmwqflggcgvzytrflncmqredxeigxtfkqqirhdqruxjigqhekutkpmwbufahsqovgcmrywxkcgqcgkcynzzimofjozntvxhvbodmtqncajjgfnilcllxrhpbcvogegmwplwthevncrbzbzzjfymveuuvgkujwaqqpkvphisdbeiqjwcqgzjsqawjdiudbrtvzshfivadwtjqwoieporwnfncvkkuyifylguyrdrmyvxyzxktyxxpqgrsfryoxreicghqgvtlpgenuwjmfykhrselbadefhishetzczyexhfgcdrzoplkiwvdkvvxrvnnyoujwxasngnyzgqktlnbnytadbiqrvacwluytabcbwwsgygdmqekryyhxmupnmsnkzdtlfitohflnnchpetvphxhhezrvyxandsjpfwhcegufsozqhoujxuvagbslpasuunpgibfybudztifqeejprsnruylivrizdxmxkqjuzrxlqcsgugytagxnhqgxudirbtohcrcbjugznqiwfeybrfdrxcjpqxibcwnyffbvemtyrwilzkahtqomkvmmalsjlvruosctfynbkjizuspbffcyaminmmidhzhtwdljsfpykebxkvghitcwuapqsdvvitpczabjieldfuvcwjuvpvitbnffiruxozlpgxjrhvvhafsqzyhnubkgdcudohozmxafmzgdnywisoskypojjgetichmtgwdeyxuqaaynuiidufkfgszxxojhmzzkderccgigoazegfkppsvwwcgfdsujqpndpvdtkjgteeruetprtvqvgljbpcwlhxwhcuftsmugkyanxdqimooutebwugfwnisibkmfrqenlpqzzehzesywrczbplytnvyccpyezckdhllfnqkfkraafjibdsxmzhdqwgwoxxucjphqegzlfhrlpkbhrgylftkupobdakjiyyynyssbmhcbopxlayryihismhiyglvuffmpvwlprpwstqugazcqqxfzundpbqssjooycodivcegvothigavhptnpeklzulwbxhdkgbzusoxmxrxlfdhiardrsvjlrepahfmkedvsnpavartctukwdtdmsidseonzrlusrpzqhvzaujfqxwdkzehlhpbcisuvoietryvtdhmejukvuvsreyuwectoasrcqaegqywfsztnnfdbbbkoauzkogckscgnoqfsoetadpmtwkkkipjdozqjuvtgitdzihbhkpomtrqmnztiavzhfxfdmqnksvdrpuvulmgiquqnckikjvklegtobmggyigniecbjmptugtptnviumefvakxciybjmsvrwelecbdftxzneahihhxjkazirwzfrvghxwumkcqjnnbdjaiocowvecmuikjgogvrgfhgsvadqudrcnjnhxcfdznadqbcghnuuszoyofnlysykpccddfdwcownklacwuzdqgnxcoaodrrhcgmldufvukemvgwjhnhxrpvyvlcsfehojebhxpfnetxpqvojnhsfuufyipzfafqeyqjhdkicfmqubshuspymjchgaykktajlrxmwzyjdfvcnzkpjwrgjoypjmldoribdewlybasojgvibhdotgsxxqajjlhtczbzgserozcbuxrhlwbteyoghohufzcklwfjwslsxmymqdvenlnmnlyewhuyduxruzdeceennirqllmmapldgfrcqkqguwhgpyogsvawrrmjumvxfnmvdpqmadetqdumjkwplfbytphtgobboziegrzeqkgerniqgeefcrafxoaqpytgpzeaqxzemjgazdmndehcofjyqrunackwvmovusuqjseywpmdlwehbwzsxnzkymkqcjikwksckqwjcawwcypowgalivucyxclevxfqgqzaxqllucsscavzfrgofwwslbbprtogcnjaabenwpyzhrlndudiwhcrvwnqghgsvqwwbcvsfxrjzacrxffebrinytlsirjygkbmflnmqjeavjnqrqzshwleyxuvmhiaobtybydyopacqtzfpsdiehlwxsrlldjokewttppplpsyiblaveatihxqskoqaoxmrpkdrpakczjbnkpvuojbpyfwevwgyjnbnsrqdpozpnyvzvmduxyzkwujetjmgbdyiuuaqhffasjsodayswvlmonhqzjusizvhpjmzhbzvwhykcdydwsdxtpsbdqxqtqzymnvzelfkjpugrxwqxmreeqgqmcbvznjeifgeuyemcuvzwwxdygvrluywxhqwtcuhfpfzvxyncbatnavzlfzlifjumlzoshkouwkzsyhouwcwhovsefuyedeexolwwyhsncinrznyyvhgkeznffkoppokkvqrvpqzqstjxfazgtidxltshknqjuhuxmcfywuepuqbivntdvkxuqamgyxntrwkgkynwkteuviyldbqrjydcoxzbqhixqwtapedhsznkuvxedxntlzdfwkrlmcflnoudnseaygjrhlflyxrsyhkplqssjzsqzyoesdqdzypfeslovxrxaksqeavskdnkyumptkspqkiuelvdgtpungzuveihfclvjcllkatzlwkcvezflaneusxykhlqkumxhsrbdeekkenbxsomvniqunlcjsufsrllbhhksmryadfetbixdtneinsgowgswhlgziwfdrwbqzjfempnhrnlqdfnbfvmbabqwscswswidcvddapncsgtgyzlmtewocibgiekfbmopwifkwprqcqpyrowfkxeougdowwiyggxpbqnrnptijunzknmkaosizptsbidjufnheaqnryjzcbwyzxhumnymvqqvevakakifeuijsugfzrffrhvvwjesvnyflxhzpzvynkcphxgeejugeushhigoarhrestvbppiikffgrfhqgdsrpvxlerppkvcuntilprttasksppncigfmgcizgwtkyyfhtbqobkszratjsstyroymdejspsxfppjvxqggsiovajfhkxjqgsvfvyiesiwudrgtzppuepwfbcwqqffdacsbhjynddhmrvyocuyzjilplijuadtrzucqtscorefwjebnggpylncpjwgwotjwtbulfxegoqpxtxndoeknrykzhkyembdxemavcemczofaefxdmwhyvmvzbzheeopdlaqhzxzbzcutlmbslhhmlpaqpojopxavgsxsyvesiofitwtuunsqwclpgzmsuirehbaeukkmackvbusqrpmgzgdywegfvporxpjwqjfhnnyifbyyquxisvwrynhtqtimcirfztelxfhlwbexatqsjvlyyovgpbihvbrjrzsppogclbuozjsbmehtdwsixwbllixzkfkfukhifaomlibisqfdhistlyubiarxexldzyuxrphtnlffggrebixkyhpqxgkqkzhjsovmnfzzcyfaesxoesomdsfuazfmwrqdqlsmhovvrarpheqggnxsmzsjdqsodbrkvuodsjepntkxdgwnsdravfaqihzlgplihwepdhsdxhxhfjxdvxgmrivvbpzmnftbswdpdadbvylmlbwsentkgatynpagseuznhdbpxwbuecocbcplerrhssvaeqfmttwfosfvoypwaignyzubqlhuynhvioqxnxswrztywoueqlrqsgcprrnzxyvayzshrogxgujrbgqihvwkbbrdrbruisgryjeotykczckggyikdublirqvrhtgkxuqgywjgjjabqcngxyzegwdjkcwlhwnkqjunvoygvhjyrnqgxjkbgyyylmsyrhsxbbmrnjuhkbumehkhvjqtzrtblvjzqkmwhbjagcxkrndeehnnldvyyiuyamddtghrykeluweqmrmrlmozkvpbgklxngovizngvnfupayqrjtqgmqoomhdnauqemlaxvhyqrnudnzorbovltufjfpnrxutiolmwfzdjrxwicmdnafgbmggvolcbjhlgqncqepklzrmjfqdbmxtppkiigajzqwsrodurvuvoybnusaahkmzfzjcaxfqjidlecbzejtonjjbxgrrgixcoxpqjkbcrljyemcitfspihfmcpfvxirmjzutvevrafzuxzpqghizqyzkukzcfkrvvxisxxwtrpwswaixhqoblcjnpzbzxceksviilhdjssizeguyomuzuoqahtukukerhwtxemskyrwwudkwnzdsezstricdbruvvwzxjdrncttldqkbpcxxuxqlhnxaicijdhfpyiepfmbmwdrmdsohcwfckeppcixsipzxuluejkzvzptwevskygfuifzemfgieonudeeqouiyfgnnaqkentjqagnsfwqdhiblnzwxxuelpdoggvucunaayfmltejwvaxipwidbpbmfzilzdvqhprcwgwiwfbygiruocldybzrisfqjlktsddkmyaafeppnujmpnyjpqfttpwzisrpkkpbutvbjmfzoqysrxktietilgzjolpuntgwvqhdccnxosueomfohnnxfifkpetquywsxcvxpzjnevyycaciawpdzxebrolsgnwmuglpmfkjnfzptxlmjqqhyacbcixtqtmxhksmnweskfwrhomqtosbiefalrbnqpivamfzajnbehclxactpygqzjyqradlmzzsoianbfwzkkeskaizxhivumuutpyyyjckqnwglrgcbjkhvwageagrrmbrizykmknyqdagnyglwosdcdkrvodekjeipazdoewarcrykmfzydvgddpogtzjiavauuetifdigkutkqzhsavndxnkvibkmjcomhsvphthyfuwxjmxvpubyhwipphjyzvajsmmuzubsermblueujsmajsqotwsjsgshpkvpvkvsgnefvphiyqtietreaqmvrzelrixkoofnpcofdmrlgizronzwiyoymduvofmgpdyfspbgnxgkgqwfgcqcxlaeqsjdceybxwbbayftudqfjsvdkzujprelijznkjbxadvhibxouqtctbzwgaowzcfwkdiavprtfnnexofjwkpniczduygadlwznvzapkaidszgrqzpwahckpdrevnkddqzqfdvclsfnxqyodgdblhelaavcacymzoitvlxbcrjietihxorqmbjaharghqkbjnouvkyjenowfxffokfefwiynnimauaziblaemkvyhnlhqlogmoovpybssjtxphfeiggayfhryxcnpkwwlobqlupkmoqubltdmgtlvvazttngrvpgparjamnfudyvaovmavbezlmslcqylyedhlprmwqcuspqhnnsufjanmwdwyuyyrcraohalxacyexexrqbobwcphpatiswrfkvkhkoecwembvjvgqgyymleelktsmavuirrbdokdlpezrgwpaoggxegrfhzsybswgygexwwsjfgnakoaxzrcsiizrwhyybohyaqmdtkrbgnawltnsucwxpaqppielsmwwzqngvkjndwhazdfkgnrnrzrezmphuqeadpmgmcghwamtramrtihukdushguqwusrkdwchqwuhmpslnxovladxysiqwglgacvkcapxvrswqubhyzgxuiwvheeiztehtoiloipzttvpfhzchmbwffpffqxkysauvxvcgceqzdygdjcngsvghcogetblyvyuelopfkhsryetinpqdjnhtxmokufqqwjkmjovtktwlfmxxfhilgxoykjmsgwcbavhbgcnlpbjqnhhukcefpsrpvyveaynpcdwhwlmqwzoyirqfsmsdmwjupuupojxhipewgriaayggdkysqrmondrhpmbpizopdntuyyjnmapokpmlcoxrqykafdgqqpozjacbrvrmebchzlopffalkhztgzppnkhcqaueadnzvtyzqbtxfmmfneljnoufareezomjntzokokvdyjvyaexgfqtbpejtlvmuitpaxuaujtacidtdemkogsrhwfrouhexklieloruphtmydfitlberzgwpdrlftnbhzverznfnoagdavwkprelweiosrybdymhdpzgseoayfexjcbomnjycvfgpkpslvvvehkjanndlfxqntyrhsonhxhmppplthgmtkyeayamrvkpibtqlvmsrdmxnxuwceyutvgkbtkhfdofqodgatjncfgbubapcnpqszlljqygbkaajbmjxunaifzqzjodaanuzwijuwlfmcilnwdxlbhymzgxvgtxgvorvwvoddjfbcfhxdogfahduzjkghfsrtpjczbfkdwaxkiznobxiktkrffyzhwipnfvqkcikahogwbptmfooffmypjuzumgvhpomelyvoavgbpmjygzagmpgjjeosoeyophdemncxfzyxjadebocpwpzxkyifcwwggbwilpzkfoqxooihyakmkhdsbqywzfrygllggwbwwijddpyibefjtxssiofflxtpacisyetrhvretmlgvgblabaueisguoyetnpugcivwrsljzupvbobxsplyqhmjchxxdqdfnhjhvouoiodsxnremewfdzzwjsnrouinreagenfqohrojhylexgvpgyrdgvbbirofdaajhxrvmmhjicvswglpifvadoylqfdujijxpquidonsemjaxswayhuyokkxuwdnizxpveydhkqujnloltzbelvtllpofzrfhtjyhgorgywfwsgrzzxnphnflpkuqckhnyncfixyjwagsbymkafhtdhxjnpahvaibtwaqfhlyvcbupsywinwugqroqmwnfztiierujpdnilnblegsblpjvgkznfhjzvvsrqrnulsdqxwroeetonrulorckyeqqdqintffbzagykbunpbupsrntjbgbwfacjuiggauslvmxrditpxjjujqkyjdwoqrcnweoguvntwwdjwcqzkujinafhgvcsxxpenhvtrkpgcklgncnzxittfhmmipmawbsvoxhkhpgadpvsiebbwssogixoxkfisyinmhyirskaamzomwvddbldzvekskrybaqlaaalqlywftzbgkgcdowheklbiuckbmpgfrqxjmtrwjifjfqhncgoeonfcvagawkdlqqsjhochazerjmrwmkpndqvgeaghowlciuvjbjsteygfqhuxiqkodlihmxwabhnaofgvfytkjzpxgehqzqomkaqpdbrswcvoduolqpupljtqrbqbwwblykuimvnoirbssjoysezglibeudyuyzvbeeqlxqlkabvpyqiigojvkkmvaihjmpbgwmuhrvgoaokexrgbuxmcpcnwkfzjakgzsczzmzagtwwbrnrtcuioavpmvdiaqhhsvzlkttcayzguibnzawhtbhmcqnnanxqpuuriujfpyfffuehinoteipeoqowqplanrxlskxwzyivinedvxfkhcjwxzzfxsshusmzmuoxmxaozzinkkglplhcgseojtgimnbpdmgpnotrepwtxxylgfqnyfqaqczrwpcfeukogmptntbczavtvtnmycjarouufuvqhfzjpqpjyjovrmhfhgrbomaqbgweolqlykzapefiljeusmfzfcjkdytlkwogdkhtletxxfxxmopbpoeogoqhnnriigfttkrxvvdanikikyszprqhzxurfipolauilxtklsgfxurrxxuhbkowwfwadupmsswjotrbjazzeimwhvhndodfliyimvixxzydxresnxlgqigyigrxjxxsybbsypjioayaegkvosaqrswrypndchyjvmtiaituvmbbtboljseqqrzlvwzsmsopbyucthxobknzrekmrtxoehmafekgkgwabnchpjqsdiddtohjwjifvmhfjndkbkbpnvzunjqajcswckhjecncrjfesdtoelqyvulcofzfpisaxwqcbdmtmnhfspkjiouyhzecgsaijojyhwgisbqqzwgzttoumllujacnudmlrozjogatcxfreqeuhhqfybbvyfakxqvopqhzsilnymeqmoowjelfhrfbknryoiyvlpksclqldajnnfnofukqxdvulurfhetwdpswlvjakurbiahcdqdjllfmffkxkkrroneyayqcentvdavayinuqnxtcxflzcqfpktgdsgnphrdzbbrbnsungdvgxtyfexxbfidufsdalfqsnvcmnmdpsigqmyggfxwzwqfttnzqebwkroynqaprvvoglqbwcfrilnbstjxgtjftaywcitbkaanttarxjbgotjwrldektqxwhvedeicqjnkbswmjhvbzzcwvgloxrurkwpihjgnqtxukzohhtznvxydkzcnhskcuvqiteknqogcoaqhoudswwuvxukqsukrqmvuqzvrvjmclxivczlehnthqptodbxatayqgidrfyizqdvbfndjtlwwhyutrecbypluwjnqgrebqvayjelupeeqcqgwekvwkkjiokvoeyrryjmowsrumoukwbsdfnxlfkqqnvbzzyvgqtprgipofdsfmpyizefyfqldkhszmxhszwdkquzetwiutfclykoavsfabyemqcycqmuhefocniqkgmtefpbkpnefkeglfoqjvtipgsbwzshbopghpjvakcdusmeulufmqxnvktnznqhqsxqkrzovqdjmwqpkjwyydeykwdadinrqzmezbawoubxmhyedzrxhbbhufamoyzmyudyneymacdanqyajxkwwdpptdkqsnudyxlyebivewexcfjrtfmgdsglwsnrhznwtyiyflhvkiwtcecfenkpyiudevvpkuimadofketappgwqkrtviewdvjultecvkvlmetzyynyackfziyvwqvmjneyeaxxxtmbgnnnawfnewmexdvqzsedjvxyjtrvieyzcvwdqyrbxnvnhgovjguicuwjcwgmjjcaasuvmemjugqnzzxcztkqpidqpuoihqrfzojoihtvwbkpokbvzzlvrgwdqlbkaswxgatshrgfkgezaqhvjwqpbyggwhibcgpmkeqsvkrkeiorahcpcshauzevqvyhwdkyfmxaoognswkrxzusdijcwhqbecptuoiahpqclbneczhnnnvlztgoaczeqwjuiwjmdrabohkdtrrzuxynjcgvyuwwtjjwqcrltudhnlqzrsbczsbofqximlxnodpazerkuqffqsdmrrmfvbycxzbdkuaelibywfsbwpxqdaxpgdfshgnnoyoqipxgjvzwbcqpftfdpvggihrrydauafzrncqvmirbfezhiqxouhvbjqwsqjxqnlntptsctsbkflcejrkgnsjnwcpieikxcrpragdddsbgqwtdaijyazofbhjnmwbixucgxtwstxslfsqbsfchjnyjoyfetqqednhlchrpktzvatxotrwndpixvvcjchfpskxmuswyjzjsmyskajpkpijfhrglimqzqhfruopanlfwvxkvvgtjsrjrenzocnblnqwyshhejsamunttxzmxxahehemjztwycskzuuibunxqpshcvbbgmmexfajygxweikopnfaaszpvzkjumwnjwepntdteqsofqredbvtteinwtyvockrzsxpjljhdebuxfeelfmljmuzbnrnlcrcfnbsbpccvvxtywbarmufpxtbjiprbpyszdoemhutfvwxxwzxvmelcicdegrrnxrgdblqqygbikxnrhrxdmrthgbhekvckkkjmllzausqwegibifuwlhrgdujhztyzovsjprgixmuzbnesdelnvleyzwvfysbukpidxzcehpzabemfrnewhsspxlkyfjdjypifqghdhbczajioyaxsbxjngaiohkkgbiuggXXXX' as ntext))