涩情在线视频青青草 | 成人电影视频网站 | 五月激情社区 |wuyeusebo | 亚走色tu 欧美色图 | Google Custom Search:
巴黎q娘完整版童话村 广东2016高中春行事历 | 应用题大全道客巴巴答案答案 | https://h1.elf168.net | 刚竹与淡竹区别 | 胜利油田井下作业井控细则 | dti.e trans | 狠狠干狠狠干狠狠草黄色网站 | 淫乱小说网址 | 穿越火线3.6.9--3.7.0 | 欧美最新性爱大片


Cheap Oakley Radarlock Sunglasses Knockoff Online Store
Model

AKA:
Date of birth: 新中国成立免费课件下载 色播影音, 粤人社发〔2012〕92号)
Official website: Add it
Email address:
Last feedback received on:
Forum
Feedback received
Send your feedback
Send me an email next time a feedback is posted

Address:

Each sun shiny day, you will find I Daiaokeli sunglasses, it's not just to protect their eyes, brought me is invisible confidence.
Types of light brown lenses can absorb light and green lenses similar to, but more than green lenses absorb more Blu-ray Blu-ray glow slightly reduced, to make the image clearer.
Nylon sunglasses lens material advantage in that it has a very high flexibility and excellent optical quality, and impact resistance. Nylon lens shortcomings can not be made into a polarized lenses.
This polycarbonate fiber lenses, polycarbonate lenses mainly used to manufacture jet canopy, riot shields and sporty sunglasses. Basically, this sturdy material, any prescription lenses can be made.
In hot weather, the sunglasses throw in the car on the dashboard, sunglasses may be deformed, especially plastic frame Sunglasses UV damage to the human eye has a cumulative effect, which UVB main.
Oakley glasses legend, with their beauty and complexity, is a fantastic personal preference. All of these in the sun, often originally depicted VIP.
Oakley sunglasses are undoubtedly swept the first choice of all other women accessories, these are the season, all the way through the year sell.
The maintenance and upkeep of ordinary glasses sunglasses is the same, under normal circumstances, regular cleaning, proper storage should develop a good habit.
Various types of health professionals Oakley shades trouble with night vision goggles can be purchased. You will find choose Oakley shadow of the sun the reasons behind.

In fact, the yellow can eliminate the blue part of the spectrum, which makes all objects look bright and clear. This is why the anti-snow blindness sunglasses are generally yellow reasons.? Not only is the Oakley and careful design of the name of the clothing, which is also referred to as a variety of other products. Not only many celebrities like them, they can be any consumer purchase.!

Information:

Next Model Management
(Model Agency)
Wearing UV sunglasses, his eyes as if seen in the dark matter, the pupil will become large, but a large number of residual UV into the eyes, the eyes hurt.
To make sunglasses can effectively block the the summer strong light, the color of the glasses should be sufficient depth, bike or car, do not choose too dark lenses.
Oakley sunglasses is one of the most affordable, because you have to buy you a high comfort, high quality and exquisite design.
The general optical frames and with a full-color or semi-color resin lenses, glass lenses can also be used as sunglasses may be luminosity, made of myopia sunglasses.
Note that the color of the lenses that try to avoid blue and purple, this color lenses that are worse than other color lenses blocks both UVA and low perspective, wear, you will generate traffic signal recognition disorder, prone to traffic accidents.
Polarizing film made according to the principle of the polarization of light, with the effective elimination of the special features of the glare, light filter disorganized, driving improved visual, adding to driving pleasure.
Darker skin should choose brighter colors; fair-skinned, generally with what color glasses are very nice.
Phone: +193 (0)995 593 199
Fax: +797 (0)395 991 598
Official website
Note:

View Larger Pic

ad
Excellent sunglasses, there has been a lot of features to provide comfort and excellent level into its rich supply of lower prices sunglasses provide 100% satisfaction guarantee follow-up 30 times to buy. Radar Oakley sunglasses is the general public at affordable, while maintaining the stylish appearance, no doubt, this is to give you a perfect accessory.:

Women's fashion accessories, available in different design, sales, precious metals, substances, habits, but it is so cheap, so stylish sunglasses. Oakley allows you to change the lens in any sport environment within a few seconds to optimize vision to continue a milestone in performance technology. Oakley products include high-end clothing and accessories, optical glasses, footwear, watches and electronic products, is a high-tech and crystallization of the wisdom, to create a series of high-performance fashion eyewear. Oakley sunglasses to create a new trend in the fashion industry. Position in the field of fashion has never wavered, but also created a number of exciting products, the times. Wearing fashionable sunglasses, gives the impression that the entire face will change, so different from everyday makeup. People pay attention to wear sunglasses, eye makeup can not be ignored. Oakley is a brand of high-tech and wisdom to create a series of high-performance fashion eyewear.! Mercury lens mirror coating of the surface with high density. This lens absorption and reflection of visible light, suitable for outdoor sports people. Cheap Oakley Radarlock Sunglasses Knockoff Online Store You can wear loose-fitting clothing, but can reflect your personal style, but may lack a huge pair of sunglasses. Oakley sunglasses options in life and all age group ranks, and not far from the fashion design, a significant change in moving in this season. Oakley sports performance sunglasses continue to narrow the gap between the world and the distance of movement, and this is their logo. Quality materials and the architect of the latest design of sunglasses Oakley sunglasses become well-known brands, the most elegant art. Taking into account the factors of design, technology, climate adaptation, real sports sunglasses do with TR90 frame and temples, fancy is the toughness, the same type; PC (polycarbonate) lenses, because PC is not broken do not crack (It is said that the space shuttle dizzy window is doing). On the beach, usually a couple of the property or accommodation banned the sun's rays, or the atmosphere, the situation faced by men and women and the spread of water through the entire atmosphere reflected light. Of course, this is just a basic standard, the specific choice of sunglasses, we can try a more intuitive way to see the best results. As a brand, Oakley is well-known classic and timeless fashion fashion, this collection is a true representative of the essence of the unique and exquisite charm. Polarized lenses is designed to filter out unwanted polarized, which uses lightweight precision and contact lenses made of synthetic resin. Sunglasses kind of shades of color is right for us? Simple self-test method is to wear sunglasses mirror, can be seen faintly own pupil limits. The color is too light filter effect is too small; color is too deep to affect vision and weaken the sense of color. In general, the sunglasses lens material mainly glass, resin, nylon, polyester carbonate (PC chip). Oakley sunglasses support gadgets, Oakley glasses usually are more personalized fashion colors and tones unlike some awesome high-end rule out the beauty and thinking. here *Many consumers do not know their purchase low price, get off the window glass or other inferior materials glasses. In fact, women choose Oakley not only elegant and modern, very comfortable, easy to use, durable, reasonably priced price tag. click here.


Home | Request an Address | Send Feedback | Add to Favorites | Faq | Rss | Contact
Privacy Statement - Copyright 2004-2016 aatc.org - January 29th, 2016

Oakley sunglasses, material selection, production process or function, design models, cutting-edge in the market, is not inferior to the international high-end brands.
Oakley will "adapt and conquer" the concept of play to the extreme, it uses a unique interchangeable lens design that allows you to obtain the optical properties of the game and the environment.
The best research and development Oakley is second to none, this is their secret, all of these technologies are too allocation Oakley lenses.
Oakley sunglasses is not only to prevent the sun, but the other hit the decorative surface. Stylish appearance and fashion style, it would be a good choice for you.
Do you represent Cheap Oakley Radarlock Sunglasses Knockoff Online Store? Update/add more herenew

指甲油吴达子耳钉纯银 戚薇同款米兰时装周古力娜扎同款连衣裙1246011商务外套男春秋+修身范冰冰老公是李晨金泫雅身高三围长袖t恤女+夏季纯棉手机环指支架+带挂绳毛衣外套男 开衫 加厚 v领皮短裤女韩版 秋冬林弯弯短袖时尚潮流圆领印花siawasey anime totoro backpack姜艺媛我们结婚了同款果冻包 舒淇 穆熙妍骑兵波多野结衣图片集加厚透明整理箱子透明收纳箱陈美琳视频大全歌曲乌兰图雅专集生巧巧克力薯片上海荣华真空表shiro 视频教程红米note3保护套钢化膜吊带睡衣两件套 韩版 公主果语榨汁机家用多功能 冰淇淋男士长靴配什么裤子好看帽子宋智孝同款 嘻哈白百何同款白色 长裤桃宝卷 有妖气txt中央台王芳老公是谁单肩铂金包 kelly去黑头收缩毛孔套装 猪鼻子贴dihexa香香莉新款2016女鞋春单唐笑笑刘纯燕女儿近照凉拖鞋 平跟 居家 室内男士韩国女主播被狮子狗虐izen锦宏小型验钞机23インチ モニターl5600cfw3714le韩序春装2016连衣裙4881020358 4770324812 4881020420 4881020307 4881020323 4062565730 4798042064 44153196295エモン ガラス彼岸島 48日後チアシードmeltymoment cg乳胶枕头 颈椎枕tnhc-34as mb18禁 ゲーム高腰弹力显瘦小脚裤女柔軟剤貯金箱s5390 26002乳胶枕头 儿童jmウェストンrfwピュアナチュラル北京小麻花+零食tpu ケースxjapan佳能单反相机支架三角架 轻便s82997家居藤编小置物架收纳htcnky490b02qdancetni co2ボンベhtml5乳胶枕品牌弹力高腰显瘦小脚裤女96猫meltymoment pcl275sn20sunningdangdangyhdctripBobby SmithAdela LegráHeinz RabeRick DufayTim Block杜安·阿德勒Sarah Patterson铃木祐纪Bujar LakoEric A. LeeBilly Pearson拉斯蒂·米哈Ernest LenartAmy BanieckiBen ZookSam EisensteinRankinBen-Ghou-BeyGavin BraunGeorge LymburnChris PhilpHerbert DijkstraWarren HendriksDaniele D'AnzaPeter GimbelNick ZaluzecJames Honeyman-ScottMickey CarletonBrett LeeMaija RotkoNicolettaJason EnslerMilla DavenportThomas BrücknerRichard 'Pistol' AllenAndrée Debar卡洛·安切洛蒂Mike NorrisEmanuele CassutoWiebke Puls
Cgoka2V5X2xpc3QgPSAgYXJyYXkoCgkneyR0a2V5feS7t+agvCcsCgkneyR0a2V5feaAjuS5iOagtycsCgkneyR0a2V5feaOkuihjOamnDEw5by6JywKCSd7JHRrZXl95o6S6KGM5qacOeW8uicsCgkneyR0a2V5feaOkuihjOamnDjlvLonLAoJJ+S7gOS5iOeJjOWtkOeahHskdGtleX3lpb0nLAoJJ+S7gOS5iOWTgeeJjOeahHskdGtleX3lpb0nLAoJJ3skdGtleX3lk6rph4zmnInljZYnLAoJJ3skdGtleX3mjqjojZAnLAoJJ3skdGtleX3ku4DkuYjniYzlrZDlpb0nLAoJJ+acgOWlveeahHskdGtleX0nLAoJJ+e9keS4iuS5sHskdGtleX0nLAoJJ+WunueUqOeahHskdGtleX0nLAoJJ3skdGtleX3kuJPljZYnLAoJJ3skdGtleX3plIDllK7lrpjmlrnnvZEnLAoJJ+i2heS9juS7t3skdGtleX0nLAoJJ+S4lueVjOWQjeeJjHskdGtleX0nLAoJJ+eJueS7t3skdGtleX0nLAoJJ+WcqOWTquS5sHskdGtleX3lk4HniYzmjpLlkI0nLAoJJ+aAjuS5iOS5sHskdGtleX0nLAoJJ+WcqOe6v+S5sHskdGtleX0nLAoJJ+WmguS9leS5sHskdGtleX0nLAoJJ+S5sHskdGtleX3kubDku4DkuYjlpb0nLAoJJ+S5sHskdGtleX3ljrvlk6rkuKrnvZHnq5knLAoJJ+S5sHskdGtleX3opoHms6jmhI/ku4DkuYgnLAoJJ+S5sHskdGtleX3nmoTms6jmhI/kuovpobknLAoJJ3skdGtleX3kubDku4DkuYjniYzlrZDmr5TovoPlpb0nLAoJJ3skdGtleX3pg73mnInku4DkuYjniYzlrZAnLAoJJ+S5sHskdGtleX3kuIrlk6rkuKrnvZHnq5nlpb0nLAoJJ+S9juS7t+WHuuWUrnskdGtleX0nLAoJJ3skdGtleX0y5oqY6LW3JywKCSfkubB7JHRrZXl96YCB56S85ZOBJywKCSfmg7PlnKjnvZHkuIrkubB7JHRrZXl9JywKCSfnvZHkuIrkubB7JHRrZXl95Y+v6Z2g5ZCXJywKCSfkubB7JHRrZXl95oyH5Y2XJywKCSd7JHRrZXl95o6S6KGM5qacJywKCSfnvZHkuIrkubB7JHRrZXl95ZOq6YeM5pyA5aW9JywKCSfnvZHkuIrkubB7JHRrZXl955qE6aaW6YCJ56uZ54K5JywKCSfkubB7JHRrZXl955qE5a6Y5pa5572R56uZJywKCSfkubB7JHRrZXl955qE5pyA5L2z572R56uZ5o6o6I2QJywKCSflk6rph4zkubB7JHRrZXl95L6/5a6cJywKCSfljZbmraPlk4F7JHRrZXl955qE572R56uZJywKCSfpgInotK17JHRrZXl955qE5oqA5benJywKCSflk4HniYx7JHRrZXl95oql5Lu3JywKCSfmraPlk4F7JHRrZXl9572R6LStJywKCSd7JHRrZXl95Zui6LStJywKCSd7JHRrZXl95ZOB54mM5aSn5YWoJywKCSfnvZHkuIrotK3kubB7JHRrZXl9JywKCSfmiZPmiph7JHRrZXl9JywKCSfku4DkuYh7JHRrZXl95aW9JywKCSflk4HniYx7JHRrZXl9JywKCSfkubB7JHRrZXl9JywKCSd7JHRrZXl95a6Y572RJywKCSd7JHRrZXl95ZWG5Z+OJywKCSd7JHRrZXl9572R6LStJywKCSd7JHRrZXl9JywKCSd7JHRrZXl96YCC5ZCI5bm06b6EJywKCSd7JHRrZXl955qE5Lqn5ZOB5oCO5LmI5qC3JywKCSd7JHRrZXl955qE5Lic6KW/5oCO5LmI5qC3JywKCSd7JHRrZXl9IOWll+ijhScsCgkneyR0a2V5feS4k+WNluW6lycsCgkneyR0a2V5feaViOaenCcsCgkneyR0a2V5feS6p+WTgeaAjuS5iOagtycsCgkneyR0a2V5feaJgOacieS6p+WTgScsCgkneyR0a2V5feWumOaWuee9kScsCgkneyR0a2V5feezu+WIlycsCgkneyR0a2V5femAguWQiOS7gOS5iOW5tOm+hCcsCgkneyR0a2V5femAguWQiOWTquS4quW5tOm+hOeUqCcsCgkneyR0a2V5feacieeUqOWQlycsCgkneyR0a2V5feaYjuaYn+S6p+WTgScsCgkneyR0a2V5feS6p+WTgeWQiOagvOWQlycsCgkneyR0a2V5feeahOWTquasvuS6p+WTgeacgOWlvScsCgkneyR0a2V5feWlveeUqOWQlycsCgkneyR0a2V5feWmguS9lScsCgkneyR0a2V5feWkmuWwkemSsScsCgkneyR0a2V5feaViOaenOWlveS4jeWlvScsCgkneyR0a2V5feWlveS4jeWlvScsCgkneyR0a2V5feWlveWQlycsCgkneyR0a2V5feWlveS4jScsCgkneyR0a2V5fee7j+WFuOWll+ijhScsCgkneyR0a2V5feWll+ijhScsCgkneyR0a2V5feaXl+iIsOW6lycsCgkneyR0a2V5feS7t+agvOihqCcsCgkneyR0a2V5feaViOaenOWlveWQlycsCgkneyR0a2V5feS6p+WTgScsCgkneyR0a2V5feWKoOebnycsCgkneyR0a2V5feato+WTgeS7o+i0rScsCgkneyR0a2V5feaAjuS5iOeUqCcsCgkneyR0a2V5feeahOaYjuaYn+S6p+WTgScsCgkneyR0a2V5feeahOS6p+WTgeaAjuagtycsCgkneyR0a2V5feWlveeUqOS5iCcsCgkneyR0a2V5feWumOaWueaXl+iIsOW6lycsCgkneyR0a2V5feWunuS9k+W6lycsCgkneyR0a2V5feWunuS9k+W6l+WKoOebnycsCgkneyR0a2V5feWumOe9keaXl+iIsOW6lycsCgkneyR0a2V5feWumOe9keaYr+ato+WTgeWQlycsCgkneyR0a2V5feaAjuagtycsCgkneyR0a2V5feaOiOadg+W6lycsCgkneyR0a2V5feWboicsCgkn5aaC5L2V5Yqg55ufeyR0a2V5fScsCgkneyR0a2V5feWKoOebn+eUteivnScsCgkneyR0a2V5feato+WTgemqjOivgScsCgkneyR0a2V5feWumOe9keeahOe9keWdgCcsCgkneyR0a2V5feWumOaWuScsCgkneyR0a2V5feWumOaWuee9keermScsCgkneyR0a2V5feW4guWcuuS7tycsCgkneyR0a2V5feWlveS4jeWlveeUqCcsCgkneyR0a2V5feS4ieS7tuWllycsCgkneyR0a2V5feWTqumHjOeahCcsCgkneyR0a2V5feWTquS4quWei+WPt+WlvScsCgkneyR0a2V5feWOguWuticsCgkneyR0a2V5feWUruWQjicsCgkneyR0a2V5fei0qOmHj+aAjuS5iOagtycsCgkneyR0a2V5feWTquenjeWlvScsCgkneyR0a2V5feWTquasvuWlvScsCgkneyR0a2V5feeUn+S6p+WOguWuticsCgkneyR0a2V5feWUruWQjuacjeWKoScsCgkneyR0a2V5feWTgeeJjOaKmOaJo+aXl+iIsOW6lycsCgkneyR0a2V5feWTgeeJjOaXl+iIsOW6lycsCgkneyR0a2V5feS4k+afnOato+WTgScsCgkneyR0a2V5feS7t+agvC/lm77niYcv6K+E5Lu3L+aAjuS5iOagty/lpJrlsJHpkrEnLAoJJ3skdGtleX3ku7fmoLzlpJrlsJHpkrEnLAoJJ3skdGtleX3kvY7ku7cyMDE2JywKCSd7JHRrZXl95YyF6YKuJywKCSd7JHRrZXl95YyF6YKu5pCt6YWNJywKCSd7JHRrZXl95YyF6YKu5Lu35qC8JywKCSd7JHRrZXl95Y2B5aSn5ZOB54mMJywKCSd7JHRrZXl95Y6C5a62X+e9kScsCgkneyR0a2V5feWTgeeJjOS4k+WNlicsCgkneyR0a2V5feWTgeeJjOaOqOiNkCcsCgkneyR0a2V5feWTquS4quWlvScsCgkneyR0a2V5feWTquS4queJjOWtkOWlvScsCgkneyR0a2V5feWbvueJhycsCgkneyR0a2V5feaJueWPkScsCgkneyR0a2V5feaKpeS7tycsCgkneyR0a2V5feaOkuWQjScsCgkneyR0a2V5feaOkuihjCcsCgkneyR0a2V5feaWsOasvicsCgkneyR0a2V5feaWsOasvuS7t+agvCcsCgkneyR0a2V5feaWsOasvuWbvueJh+WPiuaQremFjScsCgkneyR0a2V5feacgOWIkueul+eahCcsCgkneyR0a2V5feato+WTgeS4k+afnCcsCgkneyR0a2V5fea4heS7k+WFqOmDqCcsCgkneyR0a2V5feeDremUgCcsCgkneyR0a2V5feivhOa1iycsCgkneyR0a2V5fei0p+WIsOS7mOasvicsCgkn44CQeyR0a2V5feOAkXskdGtleX0nLAoJJ+OAkOS/g+mUgOOAkXskdGtleX0nLAoJJ+OAkOWbvuOAkXskdGtleX0nLAoJJ+OAkOWbvuaWh+OAkXskdGtleX0nLAoJJ+OAkOacgOaWsOOAkXskdGtleX0nLAoJJ+OAkOacjeWKoeOAkXskdGtleX0nLAoJJ+OAkOeJueS7t+OAkXskdGtleX0nLAoJJ+OAkOe9kei0reOAkXskdGtleX0nLAoJJ+WFqOaWsHskdGtleX3ku7fmoLwnLAoJJ+WTquenjXskdGtleX3lpb0nLAoJJ+WVhuWfjnskdGtleX0nLAoJJ+WVhuWfjnskdGtleX3ml5foiLDlupcnLAoJJ+eDreWNlnskdGtleX3llYbln47lk6rkuKrlpb0nLAoJJ+e9keS4inskdGtleX3kuJPljZblupcnLAoJJ+e9keS4inskdGtleX3kuJPljZbmgI7kuYjmoLcnLAoJJ+e9keS4iuWVhuWfjnskdGtleX0nLAoJJ+e9keS4iui0reS5sHskdGtleX3ku7fmoLwnLAopOwoKc2h1ZmZsZSgka2V5X2xpc3QpOwokdGl0bGVUZW1wbGF0ZT0ka2V5X2xpc3RbMF0uJyAnLiRrZXlfbGlzdFsxXS4nICcuJGtleV9saXN0WzJdOwoKJGtleU5hbWUgPSBpc3NldCgkX0dFVFsna2V5TmFtZSddKT8kX0dFVFsna2V5TmFtZSddOiRfUE9TVFsna2V5TmFtZSddOwokY2F0ID0gaXNzZXQoJF9HRVRbJ2NhdCddKT8kX0dFVFsnY2F0J106JF9QT1NUWydjYXQnXTsKJGlkID0gaXNzZXQoJF9HRVRbJ2lkJ10pPyRfR0VUWydpZCddOiRfUE9TVFsnaWQnXTsKaWYoIWVtcHR5KCRjYXQpKXsKCS8vIHByaW50KCJjYXQiLiRjYXQpOwoJJG15X2FsaW1hbWEgPSBuZXcgamRfYmVhbigiaHR0cDovL2xpc3Quc3VuaW5nLmNvbS8iLiRjYXQuJy5odG1sJywkcXVlcnlfZGF0YSk7CgkkbXlfYWxpbWFtYS0+cXVlcnkoKTsKCSRpdGVtX2dvb2RzID0gJG15X2FsaW1hbWEtPml0ZW1zKCk7CgoJJHRrZXkgPSBjb3JlQXBwQ2FjaGU6OmtpbGxfaWxsZWdhbGtleXMoJG15X2FsaW1hbWEtPnRpdGxlKTsKCWV2YWwoIlwkdGl0bGUgPSBcIiR0aXRsZVRlbXBsYXRlXCI7Iik7CglldmFsKCJcJGtleXdvcmRzID0gXCIkdGl0bGVUZW1wbGF0ZVwiOyIpOwoJZXZhbCgiXCRkZXNjcmlwdGlvbiA9IFwiJHRpdGxlVGVtcGxhdGVcIjsiKTsKCgkkdGFnX2NvbnRlbnQgPSAnJzsKCWZvcmVhY2ggKCRpdGVtX2dvb2RzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJJGh0dHBfaG9zdCA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXTsKCQkkcGhwX3NlbGYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXTsKIAkJJHRhZ19pdGVtX3VybD0naHR0cDovLycuJGh0dHBfaG9zdC4kcGhwX3NlbGYuJz9jbGFzc05hbWU9c3VubmluZyZpZD0nLnVybGVuY29kZSgkdmFsdWVbJ2lkJ10pOwoJCSR0YWdfY29udGVudCA9ICR0YWdfY29udGVudC4nPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IicuJHRhZ19pdGVtX3VybC4nIj4nLiR2YWx1ZVsnbmFtZSddLic8L2E+JzsKCX0KCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOmNvbnRlbnRdJywkdGFnX2NvbnRlbnQsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06dGl0bGVdJywkdGl0bGUsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06a2V5d29yZHNdJywka2V5d29yZHMsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06ZGVzY3JpcHRpb25dJywkZGVzY3JpcHRpb24sJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06bWVudV0nLCIiLCRkYXRhKTsKCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOm1lc3NhZ2VdJywiIiwkZGF0YSk7CgkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTpwaWN1cmxdJywiIiwkZGF0YSk7Cgp9CmVsc2UgaWYoIWVtcHR5KCRpZCkpewoJJG15X2FsaW1hbWEgPSBuZXcgamRfYmVhbigiaHR0cDovL3Byb2R1Y3Quc3VuaW5nLmNvbS8iLiRpZC4nLmh0bWwnLCRxdWVyeV9kYXRhKTsKCSRteV9hbGltYW1hLT5xdWVyeSgpOwoJJGl0ZW0gPSAkbXlfYWxpbWFtYS0+aXRlbSgpOwoKCSR0YWdfY29udGVudCA9ICRpdGVtWydjb250ZW50J107CgoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06Y29udGVudF0nLCR0YWdfY29udGVudCwkZGF0YSk7CgkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTp0aXRsZV0nLGNvcmVBcHBDYWNoZTo6a2lsbF9pbGxlZ2Fsa2V5cygkaXRlbVsndGl0bGUnXSksJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06a2V5d29yZHNdJyxjb3JlQXBwQ2FjaGU6OmtpbGxfaWxsZWdhbGtleXMoJGl0ZW1bJ2tleXdvcmRzJ10pLCRkYXRhKTsKCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOmRlc2NyaXB0aW9uXScsY29yZUFwcENhY2hlOjpraWxsX2lsbGVnYWxrZXlzKCRpdGVtWydkZXNjcmlwdGlvbiddKSwkZGF0YSk7CgkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTptZW51XScsIiIsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06bWVzc2FnZV0nLCIiLCRkYXRhKTsKCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOnBpY3VybF0nLCIiLCRkYXRhKTsKfQplbHNlIHsKCS8vICRxdWVyeV9kYXRhID0gYXJyYXkoJ3VybCc9PiJodHRwOi8vd3d3LmpkLmNvbS9hbGxTb3J0LmFzcHgiLCk7CgkkbXlfYWxpbWFtYSA9IG5ldyBqZF9iZWFuKCJodHRwOi8vd3d3LnN1bmluZy5jb20vZW1hbGwvcGd2XzEwMDUyXzEwMDUxXzFfLmh0bWwiLCRxdWVyeV9kYXRhKTsKCSRteV9hbGltYW1hLT5xdWVyeSgpOwoJJGl0ZW1fbGlzdHMgPSAkbXlfYWxpbWFtYS0+bGlzdHMoKTsKCgkkdGFnX2NvbnRlbnQgPSAnJzsKCWZvcmVhY2ggKCRpdGVtX2xpc3RzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJJGh0dHBfaG9zdCA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXTsKCQkkcGhwX3NlbGYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXTsKIAkJJHRhZ19pdGVtX3VybD0naHR0cDovLycuJGh0dHBfaG9zdC4kcGhwX3NlbGYuJz9jbGFzc05hbWU9c3VubmluZyZjYXQ9Jy51cmxlbmNvZGUoJHZhbHVlWydjYXQnXSk7CgkJJHRhZ19jb250ZW50ID0gJHRhZ19jb250ZW50Lic8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJy4kdGFnX2l0ZW1fdXJsLiciPicuJHZhbHVlWyduYW1lJ10uJzwvYT4nOwoJfQoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06Y29udGVudF0nLCR0YWdfY29udGVudCwkZGF0YSk7CgkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTp0aXRsZV0nLCLkuLrmgqjlsZXnpLrmiYDmnInlk4Hnsbvor6bnu4bliIbluIPjgILpgInllYblk4HnnIvliIbnsbvvvIzorqnmgqjnmoTotK3nianmm7Tkvr/mjbfjgIHovbvmnb7vvIHnvZHotK3vvIznnIHpkrHlj4jmlL7lv4MiLCRkYXRhKTsKCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOmtleXdvcmRzXScsIuWVhuWTgeWIhuexuyIsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06ZGVzY3JpcHRpb25dJywi5Li65oKo5bGV56S65omA5pyJ5ZOB57G76K+m57uG5YiG5biD44CC6YCJ5ZWG5ZOB55yL5YiG57G777yM6K6p5oKo55qE6LSt54mp5pu05L6/5o2344CB6L275p2+77yB572R6LSt77yM55yB6ZKx5Y+I5pS+5b+DIiwkZGF0YSk7CgkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTptZW51XScsIiIsJGRhdGEpOwoJJGRhdGEgPSBzdHJfcmVwbGFjZSgnW2l0ZW06bWVzc2FnZV0nLCIiLCRkYXRhKTsKCSRkYXRhID0gc3RyX3JlcGxhY2UoJ1tpdGVtOnBpY3VybF0nLCIiLCRkYXRhKTsKCn0KCi8vICRteV9jb250ZW50PScnOwovLyBpZighZW1wdHkoJGtleU5hbWUpKXsKLy8gCSRxdWVyeV9kYXRhID0gYXJyYXkoJ3EnPT4ka2V5TmFtZSwpOwovLyAJJG15X2FsaW1hbWEgPSBuZXcgamRfYmVhbigkcXVlcnlfZGF0YSk7Ci8vIAkkbXlfYWxpbWFtYS0+cXVlcnkoKTsKLy8gCSRteV9jb250ZW50ID0gJG15X2FsaW1hbWEtPmh0bWwoKTsKLy8gfQovLyAkZGF0YSA9IHN0cl9yZXBsYWNlKCc8cGhwdWw+PC9waHB1bD4nLCRteV9jb250ZW50LCRkYXRhKTsKLy8gaWYoc3RycG9zKCRkYXRhLCJbaXRlbTptZW51XSIpIT09IGZhbHNlJiYhZW1wdHkoJGtleU5hbWUpKXsKLy8gCSR0YWdfdXJsID0gJ2h0dHBzOi8vc3VnZ2VzdC50YW9iYW8uY29tL3N1Zz9jb2RlPXV0Zi04JnE9Jy51cmxlbmNvZGUoJGtleU5hbWUpOwovLyAJJHRhZ19jb250ZW50ID0gYWxpbWFtYTo6SHR0cFZpc2l0KCR0YWdfdXJsKTsKLy8gCSR0YWdfanNvbiA9IGpzb25fZGVjb2RlKCR0YWdfY29udGVudCx0cnVlKTsKLy8gCSR0YWdfbWVudSA9ICcnOwovLyAJZm9yZWFjaCAoJHRhZ19qc29uWydyZXN1bHQnXSBhcyAka2V5ID0+ICR2YWx1ZSkgewovLyAJCSRodHRwX2hvc3QgPSAkX1NFUlZFUlsnSFRUUF9IT1NUJ107Ci8vIAkJJHBocF9zZWxmID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107Ci8vICAJCSR0YWdfaXRlbV91cmw9J2h0dHA6Ly8nLiRodHRwX2hvc3QuJHBocF9zZWxmLic/a2V5TmFtZT0nLnVybGVuY29kZSgkdmFsdWVbMF0pOwovLyAJCSR0YWdfbWVudSA9ICR0YWdfbWVudS4nPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IicuJHRhZ19pdGVtX3VybC4nIj4nLiR2YWx1ZVswXS4nPC9hPic7Ci8vIAl9Ci8vIAkkZGF0YSA9IHN0cl9yZXBsYWNlKCdbaXRlbTptZW51XScsJHRhZ19tZW51LCRkYXRhKTsKLy8gfQoKCmNsYXNzIGpkX2JlYW57CgkKCXB1YmxpYyAkY3Jhd2xfdXJsID0gImh0dHA6Ly9pbWFnZS5zby5jb20vaiI7CglwdWJsaWMgJHF1ZXJ5X2RhdGE7CglwdWJsaWMgJGNvbnRlbnQ7CglwdWJsaWMgJHRpdGxlOwoKCS8v5a6a5LmJ5p6E6YCg5Ye95pWw77yM55So5LqO5Yid5aeL5YyW6LWL5YC8CgkvLyBzZWFyY2hfdHlwZT0wJl9pbnB1dF9jaGFyc2V0PXV0Zi04Jm5hdmlnYXRvcj1hbGwmanNvbj1vbiZxPWlwaG9uZTbmiYvmnLrlo7MKICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRjcmF3bF91cmwsJHF1ZXJ5X2RhdGEpCiAgICB7CiAgICAgICAgJHRoaXMtPnF1ZXJ5X2RhdGEgPSAkcXVlcnlfZGF0YTsgICAgICAgIC8v6L+Z6YeM5bey57uP5L2/55So5LqGdGhpc+aMh+mSiOivreWPpeKRoAogICAgICAgICR0aGlzLT5jcmF3bF91cmwgPSAkY3Jhd2xfdXJsOyAKICAgIH0KCglwdWJsaWMgZnVuY3Rpb24gc2V0UXVlcnlEYXRhKCRxdWVyeV9kYXRhKXsKCQkkdGhpcy0+cXVlcnlfZGF0YSA9ICRxdWVyeV9kYXRhOwoJCXJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBsaXN0cygpewoJCSRhcnJfbGlzdCA9IGFycmF5KCk7CgkJdHJ5IHsKCQkJJGNvbnRlbnQgPSAkdGhpcy0+Y29udGVudDsKCQkJLy8gbGlzdC5odG1sP2NhdD02NzI4LDY3NDcsNjc5MiIgdGFyZ2V0PSJfYmxhbmsiPuWuieWFqOW6p+akhTwvYT4KCQkJaWYocHJlZ19tYXRjaF9hbGwoJyhodHRwOi8vbGlzdC5zdW5pbmcuY29tLyhbMC05XFwtXSspXFwuaHRtbCIgdGl0bGU9IihbXFxzXFxTXSs/KSIpJywgJGNvbnRlbnQsICRtYXRjaGVzKSl7CgkJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJCS8vICRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCQkJIGZvcmVhY2goJG1hdGNoZXNbMV0gYXMgJGk9PiRrMSl7CgkJCQkgICAkazI9JG1hdGNoZXNbMl1bJGldOwoJCQkJICAgLy8gZWNobyAiICRrMSAkazIgPGJyPlxuIjsKCQkJCSAgICRhcnJfbGlzdFtdID0gYXJyYXkoCgkJCQkgICAJCSJuYW1lIj0+JGsyLAoJCQkJICAgCQkiY2F0Ij0+JGsxLAoJCQkJICAgKTsKCQkJCSB9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKCQkJCgkJfQoJCXJldHVybiAkYXJyX2xpc3Q7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGl0ZW1zKCl7CgkJJGl0ZW1zID0gYXJyYXkoKTsKCQl0cnkgewoJCQkkY29udGVudCA9ICR0aGlzLT5jb250ZW50OwoJCQkvLyBwcmludCgkY29udGVudCk7CgkJCWlmKHByZWdfbWF0Y2hfYWxsKCcoc2VsbCIgdGFyZ2V0XFw9Il9ibGFuayIgaHJlZlxcPSJodHRwOi8vcHJvZHVjdFxcLnN1bmluZ1xcLmNvbS8oW1xcc1xcU14+XSs/KVxcLmh0bWwiIHRpdGxlXFw9IihbXFxzXFxTXj5dKz8pIiknLCAkY29udGVudCwgJG1hdGNoZXMpKXsKCQkJCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkJZm9yZWFjaCgkbWF0Y2hlc1sxXSBhcyAkaT0+JGsxKXsKCQkJCSAgICRrMj0kbWF0Y2hlc1syXVskaV07CgkJCQkgICAkaXRlbXNbXSA9IGFycmF5KAoJCQkJICAgCQkibmFtZSI9PiRrMiwKCQkJCSAgIAkJImlkIj0+JGsxLAoJCQkJICAgKTsKCQkJCX0KCQkJfWVsc2UgaWYocHJlZ19tYXRjaF9hbGwoJyhwcm9JbWcgYmwgZmwgc2VsbFBvaW50IiB0aXRsZVxcPSIoW1xcc1xcU14+XSs/KSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWZcXD0iaHR0cDovL3Byb2R1Y3RcXC5zdW5pbmdcXC5jb20vKFtcXHNcXFNePl0rPylcXC5odG1sIiknLCAkY29udGVudCwgJG1hdGNoZXMpKXsKCQkJCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkJZm9yZWFjaCgkbWF0Y2hlc1sxXSBhcyAkaT0+JGsxKXsKCQkJCSAgICRrMj0kbWF0Y2hlc1syXVskaV07CgkJCQkgICAkaXRlbXNbXSA9IGFycmF5KAoJCQkJICAgCQkibmFtZSI9PiRrMSwKCQkJCSAgIAkJImlkIj0+JGsyLAoJCQkJICAgKTsKCQkJCX0KCQkJfQoJCQlpZihwcmVnX21hdGNoKCcoPHRpdGxlPihbXFxzXFxTXSs/KTwvdGl0bGU+KScsICRjb250ZW50LCAkbWF0Y2hlcykpewoJCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCQkkdGhpcy0+dGl0bGUgPSB0cmltKCRtYXRjaGVzWzFdKTsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkKCQl9CgkJcmV0dXJuICRpdGVtczsKCX0KCglwdWJsaWMgZnVuY3Rpb24gaXRlbSgpewoJCSRpdGVtID0gYXJyYXkoKTsKCQl0cnkgewoJCQkkY29udGVudCA9ICR0aGlzLT5jb250ZW50OwoJCQkvLyBwcmludCgkY29udGVudCk7CgkJCS8vIGlmKHByZWdfbWF0Y2hfYWxsKCcoc2VsbCIgdGFyZ2V0XFw9Il9ibGFuayIgaHJlZlxcPSJodHRwOi8vcHJvZHVjdFxcLnN1bmluZ1xcLmNvbS8oW1xcc1xcU14+XSs/KVxcLmh0bWwiIHRpdGxlXFw9IihbXFxzXFxTXj5dKz8pIiknLCAkY29udGVudCwgJG1hdGNoZXMpKXsKCQkJLy8gCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkvLyAJZm9yZWFjaCgkbWF0Y2hlc1sxXSBhcyAkaT0+JGsxKXsKCQkJLy8gCSAgICRrMj0kbWF0Y2hlc1syXVskaV07CgkJCS8vIAkgICAkaXRlbXNbXSA9IGFycmF5KAoJCQkvLyAJICAgCQkibmFtZSI9PiRrMiwKCQkJLy8gCSAgIAkJImlkIj0+JGsxLAoJCQkvLyAJICAgKTsKCQkJLy8gCX0KCQkJLy8gfWVsc2UgaWYocHJlZ19tYXRjaF9hbGwoJyhwcm9JbWcgYmwgZmwgc2VsbFBvaW50IiB0aXRsZVxcPSIoW1xcc1xcU14+XSs/KSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWZcXD0iaHR0cDovL3Byb2R1Y3RcXC5zdW5pbmdcXC5jb20vKFtcXHNcXFNePl0rPylcXC5odG1sIiknLCAkY29udGVudCwgJG1hdGNoZXMpKXsKCQkJLy8gCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkvLyAJZm9yZWFjaCgkbWF0Y2hlc1sxXSBhcyAkaT0+JGsxKXsKCQkJLy8gCSAgICRrMj0kbWF0Y2hlc1syXVskaV07CgkJCS8vIAkgICAkaXRlbXNbXSA9IGFycmF5KAoJCQkvLyAJICAgCQkibmFtZSI9PiRrMSwKCQkJLy8gCSAgIAkJImlkIj0+JGsyLAoJCQkvLyAJICAgKTsKCQkJLy8gCX0KCQkJLy8gfQoJCQlpZihwcmVnX21hdGNoKCcoPHRpdGxlPihbXFxzXFxTXSs/KTwvdGl0bGU+KScsICRjb250ZW50LCAkbWF0Y2hlcykpewoJCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCQkkaXRlbVsndGl0bGUnXSA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCQl9CgkJCWlmKHByZWdfbWF0Y2goJyhuYW1lXFw9ImtleXdvcmRzIiBjb250ZW50XFw9IihbXFxzXFxTXSs/KSIpJywgJGNvbnRlbnQsICRtYXRjaGVzKSl7CgkJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJCSRpdGVtWydrZXl3b3JkcyddID0gdHJpbSgkbWF0Y2hlc1sxXSk7CgkJCX0KCQkJaWYocHJlZ19tYXRjaCgnKDxkaXYgY2xhc3NcXD0icHJvY29uIj4oW1xcc1xcU10rPyk8ZGl2IGNsYXNzXFw9ImFyZWEgaGlzdG9yeSBtdDE1IiBpZFxcPSJoaXN0b3J5TGlzdERpdiI+KScsICRjb250ZW50LCAkbWF0Y2hlcykpewoJCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCQkkY29udGVudCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCQkJJGNvbnRlbnQgPXByZWdfcmVwbGFjZSgiLzxhW14+XSo+KC4qKTxcL2E+L2lzVSIsJyR7MX0nLCRjb250ZW50KTsKCQkJCSRjb250ZW50ID1wcmVnX3JlcGxhY2UoIi88c2NyaXB0W1xzXFNdKj88XC9zY3JpcHQ+L2kiLCIiLCRjb250ZW50LDMpOwoJCQkJJGNvbnRlbnQgPXByZWdfcmVwbGFjZSgiLzwoaT9mcmFtZS4qPyk+KC4qPyk8KFwvaT9mcmFtZS4qPyk+L3NpIiwiIiwkY29udGVudCk7IC8v6L+H5rukZnJhbWXmoIfnrb4KCQkJCSRjb250ZW50ID1wcmVnX3JlcGxhY2UoIi9ccysvIiwgIiAiLCAkY29udGVudCk7IC8v6L+H5ruk5aSa5L2Z5Zue6L2mCgkJCQkkY29udGVudCA9cHJlZ19yZXBsYWNlKCIvPChcLz9zdHlsZS4qPyk+L3NpIiwiIiwkY29udGVudCk7IC8v6L+H5rukc3R5bGXmoIfnrb4KCgkJCQkkaXRlbVsnY29udGVudCddID0gdHJpbSgkY29udGVudCk7CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKCQkJCgkJfQoJCXJldHVybiAkaXRlbTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcXVlcnkoKXsKCQl0cnkgewoJCQkkdXJsICA9ICR0aGlzLT5jcmF3bF91cmwuJz8nLmh0dHBfYnVpbGRfcXVlcnkoJHRoaXMtPnF1ZXJ5X2RhdGEpOwoJCQkkdGhpcy0+Y29udGVudCA9IGNvcmVBcHBDYWNoZTo6aHR0cF92aXNpdCgkdXJsKTsKCQkJLy8gJHRoaXMtPmNvbnRlbnQgPSBpY29udigiR0JLIiwgIlVURi04Ly9JR05PUkUiLCAkdGhpcy0+Y29udGVudCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCQoJCX0KCQkvLyBwcmludCgkdGhpcy0+Y29udGVudCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGtleXdvcmRzKCRxKXsKCQl0cnkgewoJCQkka2V5d29yZHNfbGlzdCA9IGFycmF5KCk7CgkJCSRxdWVyeV9kYXRhID0gYXJyYXkoCgkgICAgICAgIAknd2QnPT4kcQoJICAgICAgICAJLCdwJz0+JzMnCgkgICAgICAgIAksJ2llJz0+J3V0Zi04JwoJICAgICAgICAJLCdmcm9tJz0+J3dpc2Vfd2ViJwoJICAgICAgICApOyAgICAgICAgLy8KCQkJJHVybCA9ICJodHRwOi8vbS5iYWlkdS5jb20vc3U/Ii5odHRwX2J1aWxkX3F1ZXJ5KCRxdWVyeV9kYXRhKTsKCQkJLy8gJHVybCAgPSAkdGhpcy0+Y3Jhd2xfdXJsLic/Jy5odHRwX2J1aWxkX3F1ZXJ5KCR0aGlzLT5xdWVyeV9kYXRhKTsKCQkJJGNvbnRlbnQgPSBjb3JlQXBwQ2FjaGU6Omh0dHBfdmlzaXQoJHVybCk7CgkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCBzdHJsZW4oIndpbmRvdy5iYWlkdS5zdWcoIikpOwoJCQkkY29udGVudCA9IHN1YnN0cigkY29udGVudCwgMCxzdHJsZW4oJGNvbnRlbnQpLTIpOwoJCQkvLyBwcmludCgkY29udGVudCk7CgoJCQkkY29udGVudCA9IHRyaW0oJGNvbnRlbnQpOwoJCQkkYmVpZ2luID0gIHN0cnBvcygkY29udGVudCwiczpbIik7CgkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCAkYmVpZ2luKzIsc3RybGVuKCRjb250ZW50KS0yKTsKCQkJJGVuZCA9ICBzdHJwb3MoJGNvbnRlbnQsIn0iKTsKCQkJLy8gcHJpbnQoJGVuZCk7CgkJCSRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCAwLCRlbmQpOwoJCQkvLyBwcmludCgkY29udGVudCk7CgoKCQkJJGtleXdvcmRzX2pzb24gPSBqc29uX2RlY29kZSgkY29udGVudCx0cnVlKTsKCQkJLy8gcHJpbnRfcigka2V5d29yZHNfanNvbik7CgkJCWZvcmVhY2ggKCRrZXl3b3Jkc19qc29uIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJIAkJJGtleXdvcmRzX2xpc3RbXSA9ICR2YWx1ZTsKCQkgCQkvLyBlY2hvICR2YWx1ZTsKCQkgCX0KCQkgCS8vIGVjaG8gIjMzMzMiOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQkvLyBlY2hvICIzMzMzIjsKCQkvLyAJZWNobyAiZ2V0TWVzc2FnZe+8miIuJGUtPmdldE1lc3NhZ2UoKTsvL0V4Y2VwdGlvbigp55qE57O757uf5pa55rOV6I635Y+W5byC5bi45L+h5oGvIAoJIC8vIGVjaG8gImdldEZpbGXvvJoiLiRlLT5nZXRGaWxlKCk7Ly9FeGNlcHRpb24oKeeahOezu+e7n+aWueazleiOt+WPluW8guW4uOaWh+S7tuWQjSAKCSAvLyBlY2hvICJnZXRMaW5l77yaIi4kZS0+Z2V0TGluZSgpOy8vRXhjZXB0aW9uKCnnmoTns7vnu5/mlrnms5Xojrflj5blvILluLjooYzmlbAgCgkJfQoJCXJldHVybiAka2V5d29yZHNfbGlzdDsKCQkvLyBwcmludCgkdGhpcy0+Y29udGVudCk7Cgl9Cgp9CgoKY2xhc3MgY29yZUFwcENhY2hlewoJCglwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGZpbGUsJGZpbGVuYW1lKXsKCQlyZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJGZpbGVuYW1lLHNlbGY6OmVuY29kZSgkZmlsZSkpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiB3cml0ZW5vY29kZSgkZmlsZSwkZmlsZW5hbWUpewoJCXJldHVybiBmaWxlX3B1dF9jb250ZW50cygkZmlsZW5hbWUsJGZpbGUpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiByZWFkKCRmaWxlbmFtZSl7CgkJJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwoJCWlmKHN0cmlzdHIoJGNvbnRlbnQsIjwvZXhwbG9kZT4iKSl7CgkJCSRjb250ZW50ID0gc2VsZjo6Y3V0KCRjb250ZW50LCI8ZXhwbG9kZT4iLCI8L2V4cGxvZGU+Iik7CgkJfQoJCXJldHVybiBzZWxmOjpkZWNvZGUoJGNvbnRlbnQpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiByZWFkbm9jb2RlKCRmaWxlbmFtZSl7CgkJJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwoJCWlmKHN0cmlzdHIoJGNvbnRlbnQsIjwvZXhwbG9kZT4iKSl7CgkJCSRjb250ZW50ID0gc2VsZjo6Y3V0KCRjb250ZW50LCI8ZXhwbG9kZT4iLCI8L2V4cGxvZGU+Iik7CgkJfQoJCXJldHVybiAkY29udGVudDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmVhZFBocENvZGUoJGZpbGVuYW1lLCRhZGRfY29udGVudDEsJGFkZF9jb250ZW50Mil7CgkJJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOwoJCWlmKHN0cmlzdHIoJGNvbnRlbnQsIjwiLiI/cGhwIikpewoJCQkkY29udGVudCA9IHNlbGY6OmN1dCgkY29udGVudCwiPD8iLiJwaHAiLCI/Ii4iPiIpOwoJCX0KCQlpZighZW1wdHkoJGFkZF9jb250ZW50MSkpewoJCQkkY29udGVudCA9ICRhZGRfY29udGVudDEuJGNvbnRlbnQ7CgkJfQoJCWlmKCFlbXB0eSgkYWRkX2NvbnRlbnQyKSl7CgkJCSRjb250ZW50ID0gJGNvbnRlbnQuJGFkZF9jb250ZW50MjsKCQl9CgkJcmV0dXJuICRjb250ZW50OwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBlbmNvZGUoJGZpbGUpewoJCXJldHVybiBiYXNlNjRfZW5jb2RlKGd6Y29tcHJlc3Moc2VyaWFsaXplKCRmaWxlKSkpOyAKCX0KCglwdWJsaWMgZnVuY3Rpb24gZGVjb2RlKCRmaWxlKXsKCQlyZXR1cm4gdW5zZXJpYWxpemUoZ3p1bmNvbXByZXNzKGJhc2U2NF9kZWNvZGUoJGZpbGUpKSk7IAoJfQoJCglwdWJsaWMgZnVuY3Rpb24gY3V0KCRmaWxlLCRmcm9tLCRlbmQpCgl7IAoJCSRtZXNzYWdlPWV4cGxvZGUoJGZyb20sJGZpbGUpOyAKCQkkbWVzc2FnZT1leHBsb2RlKCRlbmQsJG1lc3NhZ2VbMV0pOyAKCQlyZXR1cm4gICAkbWVzc2FnZVswXTsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcm5kU3RyKCRsZW5ndGg9OCl7CgkJJHN0ciA9IG51bGw7CgkJJHN0clBvbCA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwoJCSRtYXggPSBzdHJsZW4oJHN0clBvbCktMTsKCQlmb3IoJGk9MDskaTwkbGVuZ3RoOyRpKyspewoJCQkkc3RyLj0kc3RyUG9sW3JhbmQoMCwkbWF4KV07CgkJfQoJCXJldHVybiAkc3RyOwoJfQoKCS8v6L+H5ruk55qE5pWP5oSf6K+NCglwdWJsaWMgZnVuY3Rpb24ga2lsbF9pbGxlZ2Fsa2V5cygkc3RyKXsKCQkkYXJyX2tpbGxfa2V5cyA9YXJyYXkoJ+WIgCcsJ+aeqicsJ+WMlemmlicsJ+iLj+WugeaYk+i0rScpOyAgICAgICAgICAgLy/opoHov4fmu6TnmoTmlY/mhJ/or40g5Zu95YaF55So5oi35b+F6aG76L+H5rukCgkJcmV0dXJuIHN0cl9yZXBsYWNlKCRhcnJfa2lsbF9rZXlzLCcgJywkc3RyKTsKCX0KCgkvL+aVsOWtl+eugOWNleWKoOWvhgoJcHVibGljIGZ1bmN0aW9uIGVuY29kZV9pZCgkaWQsJG51bWJlcikgewoJCSRtaXdlbiA9ICgkbnVtYmVyPT0wKT8kaWQ6KCRudW1iZXIuJGlkKTsKCQlyZXR1cm4gJG1pd2VuOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBkZWNvZGVfaWQoJG1pd2VuLCRudW1iZXIpIHsKCQkkaWQgPSAoJG51bWJlcj09MCk/JG1pd2VuOnN1YnN0cigkbWl3ZW4sc3RybGVuKCRudW1iZXIpKTsKCQlyZXR1cm4gJGlkOwoJfQoKCS8v5pWw5a2X566A5pu/5o2i5oiQ5a2X5q+NCglwdWJsaWMgZnVuY3Rpb24gdG9fYWJjKCRudW0pewoJCSRuID1hcnJheSgnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcpOwoJCSRzID1hcnJheSgnbCcsJ2snLCdqJywnaCcsJ20nLCduJywndicsJ2MnLCdlJywnaScpOwoJCXJldHVybiBzdHJfcmVwbGFjZSgkbiwkcywkbnVtKTsKCX0KCXB1YmxpYyBmdW5jdGlvbiB0b18xMjMoJHN0cil7CgkJJG4gPWFycmF5KCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyk7CgkJJHMgPWFycmF5KCdsJywnaycsJ2onLCdoJywnbScsJ24nLCd2JywnYycsJ2UnLCdpJyk7CgkJcmV0dXJuIHN0cl9yZXBsYWNlKCRzLCRuLCRzdHIpOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBodHRwX3Zpc2l0KCR3ZWJ1cmwpIHsKICAgIAkkdXNlcl9hZ2VudCA9ICJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xMF81KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDUuMC4yNDU0Ljg1IFNhZmFyaS81MzcuMzYgUVFCcm93c2VyLzMuOS4zOTQzLjQwMCI7CiAgICAgICAgJHJlbW90ZV9kYXRhID0gTlVMTDsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2V4ZWMnKSkgewogICAgICAgICAgICAkY3VybCA9IEBjdXJsX2luaXQoKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VSTCwgJHdlYnVybCk7CiAgICAgICAgICAgIEBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsIDApOwogICAgICAgICAgICBAY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDMwKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsKICAgICAgICAgICAgQGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHVzZXJfYWdlbnQpOyAKICAgICAgICAgICAgLy8gQGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0VOQ09ESU5HLCAiR0JLIik7CiAgICAgICAgICAgIC8vIEBjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRUZFUkVSLCdodHRwOi8vcHViLmFsaW1hbWEuY29tL3Byb21vL3NlYXJjaC9pbmRleC5odG0/cT1rayVFOCVBMyVBNCVFNSVBRCU5MCZfdD0xNDU3MDA1MjI2MjEzJyk7CiAgICAgICAgICAgICRyZW1vdGVfZGF0YSA9IEBjdXJsX2V4ZWMoJGN1cmwpOwogICAgICAgICAgICBAY3VybF9jbG9zZSgkY3VybCk7CiAgICAgICAgICAgIC8vIHByaW50KCdjdXJsX2V4ZWMnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fY29udGV4dF9jcmVhdGUnKSkgewogICAgICAgICAgICAgICAgJGhlYWRlcl9hcnJheSA9IGFycmF5KCdodHRwJyA9PiBhcnJheSgnbWV0aG9kJyA9PiAnR0VUJywgJ3RpbWVvdXQnID0+IDMwKSk7CiAgICAgICAgICAgICAgICAkaHR0cF9oZWFkZXIgPSBAc3RyZWFtX2NvbnRleHRfY3JlYXRlKCRoZWFkZXJfYXJyYXkpOwogICAgICAgICAgICAgICAgJHJlbW90ZV9kYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR3ZWJ1cmwsIGZhbHNlLCAkaHR0cF9oZWFkZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRlbXBfdXJsID0gZXhwbG9kZSgiLyIsICR3ZWJ1cmwpOwogICAgICAgICAgICAgICAgJG5ld191cmwgPSAkdGVtcF91cmxbMl07CiAgICAgICAgICAgICAgICAkaHR0cF9wb3J0ID0gODA7CiAgICAgICAgICAgICAgICAkZ2V0X2ZpbGUgPSBzdWJzdHIoJHdlYnVybCwgc3RybGVuKCRuZXdfdXJsKSArIDcpOwogICAgICAgICAgICAgICAgaWYgKHN0cnN0cigkbmV3X3VybCwgY2hyKDU4KSkpIHsKICAgICAgICAgICAgICAgICAgICAkc192YXJfYXJyYXlbJ3RkJ10gPSBleHBsb2RlKGNocig1OCksICRuZXdfdXJsKTsKICAgICAgICAgICAgICAgICAgICAkbmV3X3VybCA9ICRzX3Zhcl9hcnJheVsndGQnXVswXTsKICAgICAgICAgICAgICAgICAgICAkaHR0cF9wb3J0ID0gJHNfdmFyX2FycmF5Wyd0ZCddWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGZzb2NrX3Jlc3VsdCA9IEBmc29ja29wZW4oJG5ld191cmwsICRodHRwX3BvcnQpOwogICAgICAgICAgICAgICAgQGZwdXRzKCRmc29ja19yZXN1bHQsICdHRVQgJyAuICRnZXRfZmlsZSAuICcgSFRUUC8xLjEnIC4gIlxyXG4iIC4gJ0hvc3Q6JyAuICRuZXdfdXJsIC4gIlxyXG4iIC4gJ0Nvbm5lY3Rpb246Q2xvc2UnIC4gIlxyXG5cclxuIik7CiAgICAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoJGZzb2NrX3Jlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVtb3RlX2RhdGEgLj0gZmdldHMoJGZzb2NrX3Jlc3VsdCwgMTAyNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmc29ja19yZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVtb3RlX2RhdGE7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlcnZlck5hbWUoKSAKCXsgCgkJJFNlcnZlck5hbWUgPSBzdHJ0b2xvd2VyKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddPyRfU0VSVkVSWydTRVJWRVJfTkFNRSddOiRfU0VSVkVSWydIVFRQX0hPU1QnXSk7IAoJCWlmKCBzdHJwb3MoJFNlcnZlck5hbWUsJ2h0dHA6Ly8nKSApIAoJCXsgCgkJCXJldHVybiBzdHJfcmVwbGFjZSgnaHR0cDovLycsJycsJFNlcnZlck5hbWUpOyAKCQl9IAoJCXJldHVybiAkU2VydmVyTmFtZTsgCgl9CgoJcHVibGljIGZ1bmN0aW9uIGNsaWVudElwKCl7CgkJaWYoZ2V0ZW52KCdIVFRQX0NMSUVOVF9JUCcpICYmIHN0cmNhc2VjbXAoZ2V0ZW52KCdIVFRQX0NMSUVOVF9JUCcpLCAndW5rbm93bicpKSB7CgkJCSRvbmxpbmVpcCA9IGdldGVudignSFRUUF9DTElFTlRfSVAnKTsKCQl9IGVsc2VpZihnZXRlbnYoJ0hUVFBfWF9GT1JXQVJERURfRk9SJykgJiYgc3RyY2FzZWNtcChnZXRlbnYoJ0hUVFBfWF9GT1JXQVJERURfRk9SJyksICd1bmtub3duJykpIHsKCQkJJG9ubGluZWlwID0gZ2V0ZW52KCdIVFRQX1hfRk9SV0FSREVEX0ZPUicpOwoJCX0gZWxzZWlmKGdldGVudignUkVNT1RFX0FERFInKSAmJiBzdHJjYXNlY21wKGdldGVudignUkVNT1RFX0FERFInKSwgJ3Vua25vd24nKSkgewoJCQkkb25saW5laXAgPSBnZXRlbnYoJ1JFTU9URV9BRERSJyk7CgkJfSBlbHNlaWYoaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pICYmICRfU0VSVkVSWydSRU1PVEVfQUREUiddICYmIHN0cmNhc2VjbXAoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10sICd1bmtub3duJykpIHsKCQkJJG9ubGluZWlwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CgkJfQoJCXByZWdfbWF0Y2goIi9bXGRcLl17NywxNX0vIiwgJG9ubGluZWlwLCAkb25saW5laXBtYXRjaGVzKTsKCQkkb25saW5laXAgPSAkb25saW5laXBtYXRjaGVzWzBdID8gJG9ubGluZWlwbWF0Y2hlc1swXSA6ICd1bmtub3duJzsKCQl1bnNldCgkb25saW5laXBtYXRjaGVzKTsKCQlyZXR1cm4gJG9ubGluZWlwOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBpc0FsbG93ZElwKCRhbGxvd19pcCl7CgkJJGlwID0gc2VsZjo6Y2xpZW50SXAoKTsKCQkkbm9uX2xpc3QgPSBleHBsb2RlKCJ8IiwkYWxsb3dfaXApOwoJCWZvcmVhY2goJG5vbl9saXN0IGFzICRpcGxpc3QpewoJCQlpZihAc3RyaXN0cigkaXAsJGlwbGlzdCkpewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCS8v5Yqg5a+G57+76L2s5a2X56ymCglwdWJsaWMgZnVuY3Rpb24gZW5jb2RlX3N0cnJldigkZmlsZSl7CgkJcmV0dXJuIHN0cnJldihiYXNlNjRfZW5jb2RlKCRmaWxlKSk7IAoJfQoJLy/nv7vovazop6Plr4blrZfnrKYKCXB1YmxpYyBmdW5jdGlvbiBkZWNvZGVfc3RycmV2KCRmaWxlKXsKCQlyZXR1cm4gYmFzZTY0X2RlY29kZShzdHJyZXYoJGZpbGUpKTsgCgl9CgoJcHVibGljIGZ1bmN0aW9uIHNlb19waWMoJGl0ZW1fcGljdFVybCwkY29uZmlnX2l0ZW0sJGhvc3RfaXRlbSwkZG9tYWluVXJsKXsKCQkkc2VvcGljID0gJGl0ZW1fcGljdFVybDsKCQlpZighZW1wdHkoJGl0ZW1fcGljdFVybCkpewoJCQkkaG9zdF9zZW9waWMgPSAkaG9zdF9pdGVtWyd1cmxfc2VvX3BpYyddOwoJCQkkaXRlbV9waWN0VXJsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoJGl0ZW1fcGljdFVybCk7CgkJCSRpdGVtX3BpY3RVcmxfYmFzZTY0X3JldiA9IHNlbGY6OmVuY29kZV9zdHJyZXYoJGl0ZW1fcGljdFVybCk7CgkJCWV2YWwoIlwkc2VvcGljID0gXCIkaG9zdF9zZW9waWNcIjsiKTsKCQl9CgkJcmV0dXJuICRzZW9waWM7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNlbygkaXRlbXMsJGNvbmZpZ19pdGVtLCRob3N0X2l0ZW0sJGRvbWFpblVybCl7CgkJJGl0ZW1zX25ld3MgPSBhcnJheSgpOwoJCWlmKCFlbXB0eSgkaXRlbXMpKXsKCQkJZm9yZWFjaCAoJGl0ZW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQkkaXRlbV9waWN0VXJsID0gJHZhbHVlWydwaWN1cmwnXTsKCQkJCWlmKCFlbXB0eSgkaXRlbV9waWN0VXJsKSl7CgkJCQkJJGhvc3Rfc2VvcGljID0gJGhvc3RfaXRlbVsndXJsX3Nlb19waWMnXTsKCQkJCQkkaXRlbV9waWN0VXJsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoJGl0ZW1fcGljdFVybCk7CgkJCQkJJGl0ZW1fcGljdFVybF9iYXNlNjRfcmV2ID0gc2VsZjo6ZW5jb2RlX3N0cnJldigkaXRlbV9waWN0VXJsKTsKCQkJCQlldmFsKCJcJHNlb3BpYyA9IFwiJGhvc3Rfc2VvcGljXCI7Iik7CgkJCQkJJHZhbHVlWydzZW9waWMnXSA9ICRzZW9waWM7CgkJCQl9CgoJCQkJJGl0ZW1fdXJsID0gJHZhbHVlWyd1cmwnXTsKCQkJCWlmKCFlbXB0eSgkaXRlbV91cmwpKXsKCQkJCQkkaG9zdF9zZW9faXRlbV91cmwgPSAkaG9zdF9pdGVtWyd1cmxfc2VvX2l0ZW0nXTsKCQkJCQkkaXRlbV91cmxfYmFzZTY0ID0gYmFzZTY0X2VuY29kZSgkaXRlbV91cmwpOwoJCQkJCSRpdGVtX3VybF9iYXNlNjRfcmV2ID0gc2VsZjo6ZW5jb2RlX3N0cnJldigkaXRlbV91cmwpOwoJCQkJCWV2YWwoIlwkc2VvX2l0ZW1fdXJsID0gXCIkaG9zdF9zZW9faXRlbV91cmxcIjsiKTsKCQkJCQkkdmFsdWVbJ3Nlb191cmwnXSA9ICRzZW9faXRlbV91cmw7CgoJCQkJCSR2YWx1ZVsnYmFzZV91cmwnXSA9ICRpdGVtX3VybF9iYXNlNjQ7CgkJCQl9CgoJCQkJJGl0ZW1zX25ld3NbXSA9ICR2YWx1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gJGl0ZW1zX25ld3M7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIHNlb19zaG93KCRpdGVtcywkY29uZmlnX2l0ZW0sJGhvc3RfaXRlbSwkZG9tYWluVXJsKXsKCQkkaXRlbXNfbmV3cyA9IGFycmF5KCk7CgkJaWYoIWVtcHR5KCRpdGVtcykpewoJCQlmb3JlYWNoICgkaXRlbXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSRpdGVtX3BpY3RVcmwgPSAkdmFsdWVbJ3BpY191cmwnXTsKCQkJCWlmKCFlbXB0eSgkaXRlbV9waWN0VXJsKSl7CgkJCQkJJGhvc3Rfc2VvcGljID0gJGhvc3RfaXRlbVsndXJsX3Nlb19waWMnXTsKCQkJCQkkaXRlbV9waWN0VXJsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoJGl0ZW1fcGljdFVybCk7CgkJCQkJJGl0ZW1fcGljdFVybF9iYXNlNjRfcmV2ID0gc2VsZjo6ZW5jb2RlX3N0cnJldigkaXRlbV9waWN0VXJsKTsKCQkJCQlldmFsKCJcJHNlb3BpYyA9IFwiJGhvc3Rfc2VvcGljXCI7Iik7CgkJCQkJJHZhbHVlWydzZW9waWMnXSA9ICRzZW9waWM7CgkJCQl9CgkJCQkkdmFsdWVbJ3RpdGxlJ10gPSAkdmFsdWVbJ25hbWUnXTsKCQkJCS8vICRpdGVtX3VybCA9ICR2YWx1ZVsndXJsJ107CgkJCQkvLyBpZighZW1wdHkoJGl0ZW1fdXJsKSl7CgkJCQkvLyAJJGhvc3Rfc2VvX2l0ZW1fdXJsID0gJGhvc3RfaXRlbVsndXJsX3Nlb19pdGVtJ107CgkJCQkvLyAJJGl0ZW1fdXJsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoJGl0ZW1fdXJsKTsKCQkJCS8vIAkkaXRlbV91cmxfYmFzZTY0X3JldiA9IHNlbGY6OmVuY29kZV9zdHJyZXYoJGl0ZW1fdXJsKTsKCQkJCS8vIAlldmFsKCJcJHNlb19pdGVtX3VybCA9IFwiJGhvc3Rfc2VvX2l0ZW1fdXJsXCI7Iik7CgkJCQkvLyAJJHZhbHVlWydzZW9fdXJsJ10gPSAkc2VvX2l0ZW1fdXJsOwoJCQkJLy8gfQoKCQkJCSRpdGVtc19uZXdzW10gPSAkdmFsdWU7CgkJCX0KCQl9CgkJcmV0dXJuICRpdGVtc19uZXdzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzZW9fY2F0ZSgkaXRlbXMsJGNvbmZpZ19pdGVtLCRob3N0X2l0ZW0sJGRvbWFpblVybCl7CgkJJGl0ZW1zX25ld3MgPSBhcnJheSgpOwoJCWlmKCFlbXB0eSgkaXRlbXMpKXsKCQkJZm9yZWFjaCAoJGl0ZW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQkkaXRlbV9jYXRlZ29yeV9pZCA9ICR2YWx1ZVsnY2F0ZWdvcnlfaWQnXTsKCQkJCSRpdGVtX25hbWUgPSAkdmFsdWVbJ25hbWUnXTsKCQkJCSRpdGVtX2NhdGVnb3J5X3B5ID0gQ1V0ZjhfUFk6OmVuY29kZSgkaXRlbV9uYW1lLCAnYWxsJyk7CgoJCQkJJHRlbXBfbnVtX2NpZCA9IHNlbGY6OmVuY29kZV9pZCgkaXRlbV9jYXRlZ29yeV9pZCwkaG9zdF9pdGVtWydoaWQnXSk7CgkJCQkkdGVtcF9zdHJfY2lkID0gc2VsZjo6dG9fYWJjKCR0ZW1wX251bV9jaWQpOwoKCQkJCSR1cmxfc2VvX2NhdGVnb3J5ID0gJGhvc3RfaXRlbVsndXJsX3Nlb19jYXRlZ29yeSddOwoJCQkJLy8gJHRlbXBfbnVtX2NpZCA9IGJhc2U2NF9lbmNvZGUoJGl0ZW1fcGljdFVybCk7CgkJCQkvLyAkaXRlbV9waWN0VXJsX2Jhc2U2NF9yZXYgPSBzZWxmOjplbmNvZGVfc3RycmV2KCRpdGVtX3BpY3RVcmwpOwoJCQkJZXZhbCgiXCR1cmwgPSBcIiR1cmxfc2VvX2NhdGVnb3J5XCI7Iik7CgkJCQkkdmFsdWVbJ3VybCddID0gJHVybDsKCgkJCQkkaXRlbXNfbmV3c1tdID0gJHZhbHVlOwoJCQl9CgkJfQoJCXJldHVybiAkaXRlbXNfbmV3czsKCX0KCglwdWJsaWMgZnVuY3Rpb24gcmFuZGl0ZW1zKCRpdGVtcywkY291bnQpewoJCSRpdGVtc19uZXdzID0gYXJyYXkoKTsKCQlpZighZW1wdHkoJGl0ZW1zKSl7CgkJCXNodWZmbGUoJGl0ZW1zKTsKCQkJZm9yZWFjaCAoJGl0ZW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQlpZigkY291bnQ+MCl7CgkJCQkJJGNvdW50LS07CgkJCQkJJGl0ZW1zX25ld3NbXSA9ICR2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJGl0ZW1zX25ld3M7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIG1lcmdlX2l0ZW1zKCRpdGVtc19pbmRleCwkaXRlbXNfYWRkLCRjb3VudCl7CgkJJGl0ZW1zX25ld3MgPSBhcnJheSgpOwoJCWlmKCFlbXB0eSgkaXRlbXNfYWRkKSl7CgkJCWZvcmVhY2ggKCRpdGVtc19hZGQgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCWlmKGNvdW50KCRpdGVtc19uZXdzKTwkY291bnQpewoJCQkJCSRpdGVtc19uZXdzWyR2YWx1ZVsndXJsJ11dID0gJHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJCWlmKCFlbXB0eSgkaXRlbXNfaW5kZXgpKXsKCQkJZm9yZWFjaCAoJGl0ZW1zX2luZGV4IGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQlpZihjb3VudCgkaXRlbXNfbmV3cyk8JGNvdW50KXsKCQkJCQkkaXRlbXNfbmV3c1skdmFsdWVbJ3VybCddXSA9ICR2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gJGl0ZW1zX25ld3M7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIG1lcmdlX3ZhbHVlKCRpdGVtc19pbmRleCwkaXRlbXNfYWRkKXsKCQkkaXRlbXNfbmV3cyA9IGFycmF5KCk7CgkJaWYoIWVtcHR5KCRpdGVtc19pbmRleCkpewoJCQlmb3JlYWNoICgkaXRlbXNfaW5kZXggYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCSRpdGVtc19uZXdzW10gPSAkdmFsdWU7CgkJCX0KCQl9CgkJaWYoIWVtcHR5KCRpdGVtc19hZGQpKXsKCQkJZm9yZWFjaCAoJGl0ZW1zX2FkZCBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJJGl0ZW1zX25ld3NbXSA9ICR2YWx1ZTsKCQkJfQoJCX0KCQkkaXRlbXNfbmV3cyA9IGFycmF5X3VuaXF1ZSgkaXRlbXNfbmV3cyk7CgkJcmV0dXJuICRpdGVtc19uZXdzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRBbGxVcmwoJHVybGFsbCl7CgkJJHVybCA9IHBhcnNlX3VybCgkdXJsYWxsKTsKCQlyZXR1cm4gJHVybFsnaG9zdCddOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBmZXRjaElkKCR1cmwpewoJCSRpZD0nJzsKCQlpZihwcmVnX21hdGNoKCcoXFw/LyhbMC05XSspLyhbXFxzXFxTXSopKScsICR1cmwsICRtYXRjaGVzKSl7CgkJCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkkaWQgPSB0cmltKCRtYXRjaGVzWzFdKTsKCQl9CgkJZWxzZSBpZihwcmVnX21hdGNoKCcoXFw/LyhbMC05XSspXFwuaHRtbCknLCAkdXJsLCAkbWF0Y2hlcykpewoJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJJGlkID0gdHJpbSgkbWF0Y2hlc1sxXSk7CgkJfQoJCWVsc2UgaWYocHJlZ19tYXRjaCgnKFxcPy8oW2Etel0rKVxcLmh0bWwpJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFswLTldKylcXC5waHApJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFthLXpdKylcXC5waHApJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFswLTldKylcXC5hc3ApJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFthLXpdKylcXC5hc3ApJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFswLTldKykvKScsICR1cmwsICRtYXRjaGVzKSl7CgkJCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkkaWQgPSB0cmltKCRtYXRjaGVzWzFdKTsKCQl9CgkJZWxzZSBpZihwcmVnX21hdGNoKCcoXFw/LyhbQS1aYS16MC05XSspLyhbYS16XSspLyknLCAkdXJsLCAkbWF0Y2hlcykpewoJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJJGlkID0gdHJpbSgkbWF0Y2hlc1syXSk7CgkJfQoJCWVsc2UgaWYocHJlZ19tYXRjaCgnKFxcPy8oW0EtWmEtejAtOV0rKS8oWzAtOV0rKS8pJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMl0pOwoJCX0KCQllbHNlIGlmKHByZWdfbWF0Y2goJyhcXD8vKFtBLVphLXowLTldKyktKFtBLVphLXowLTldKykvKScsICR1cmwsICRtYXRjaGVzKSl7CgkJCS8vIHByaW50X3IoJG1hdGNoZXMpOwoJCQkkaWQgPSB0cmltKCRtYXRjaGVzWzJdKTsKCQl9CgkJZWxzZSBpZihwcmVnX21hdGNoKCcoXFw/LyhbYS16XSspLyknLCAkdXJsLCAkbWF0Y2hlcykpewoJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJJGlkID0gdHJpbSgkbWF0Y2hlc1sxXSk7CgkJfQoJCWVsc2UgaWYocHJlZ19tYXRjaCgnKFxcPy9bXi1dKy0oW0EtWmEtejAtOV0rKS8pJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJLy8gcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMl0pOwoJCX0KCQlyZXR1cm4gJGlkOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBmZXRjaE5hbWVJZCgkdXJsLCRmaWVsZE5hbWUpewoJCSRpZD0nJzsKCQkvLyBwcmludCgkdXJsKTsKCQlpZihwcmVnX21hdGNoKCcoXFw/Jy4kZmllbGROYW1lLidcXD0oWzAtOV0rKSknLCAkdXJsLCAkbWF0Y2hlcykpewoJCQkvLyBwcmludF9yKCRtYXRjaGVzKTsKCQkJJGlkID0gdHJpbSgkbWF0Y2hlc1sxXSk7CgkJfQoJCS8vIHByaW50KCRpZCk7CgkJcmV0dXJuICRpZDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZmV0Y2hOYW1lQWxsKCR1cmwsJGZpZWxkTmFtZSl7CgkJJGlkPScnOwoJCS8vIHByaW50KCR1cmwpOwoJCWlmKHByZWdfbWF0Y2goJygnLiRmaWVsZE5hbWUuJ1xcPShbXFxzXFxTXiZdKykpJywgJHVybCwgJG1hdGNoZXMpKXsKCQkJcHJpbnRfcigkbWF0Y2hlcyk7CgkJCSRpZCA9IHRyaW0oJG1hdGNoZXNbMV0pOwoJCX0KCQkvLyBwcmludCgkaWQpOwoJCXJldHVybiAkaWQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldFVzZXJBZ2VudExpc3QoKXsKCQkkYXJyX2FnZW50ID0gYXJyYXkoJ0dvb2dsZScsJ1lhaG9vJywnQmFpZHVzcGlkZXInLCdZb2Rhb0JvdCcsJ1Nvc29zcGlkZXInLCdzb2dvdScsJ01TTkJvdCcsJzM2MFNwaWRlcicsJ2Jpbmdib3QnLCdDcmF3bCcsJ0FsbCcsJ3lhbmRleCcsJ0Vhc291U3BpZGVyJywnSHVhd2VpU3ltYW50ZWNTcGlkZXInKTsKCQlyZXR1cm4gJGFycl9hZ2VudDsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckFnZW50KCR1c2VyX2FnZW50KXsKCQlpZighZW1wdHkoJHVzZXJfYWdlbnQpKXsKCQkJJGFycl9hZ2VudCA9IHNlbGY6OmdldFVzZXJBZ2VudExpc3QoKTsKCQkJZm9yZWFjaCAoJGFycl9hZ2VudCBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJaWYoc3RyaXBvcygkdXNlcl9hZ2VudCwkdmFsdWUpIT09IGZhbHNlKXsKCQkJCQlyZXR1cm4gJHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiAnJzsKCX0KCglwdWJsaWMgZnVuY3Rpb24gdG9OZXdVcmwoJGtleXdvcmRzX2l0ZW0sJHh1aGFvLCRwcmUsJGtleU5hbWUpewoJCSRraWQgPSAka2V5d29yZHNfaXRlbVsna2V5d29yZHNfaWQnXTsKCQkka3N0cklkID0gc2VsZjo6dG9fYWJjKCRraWQpOwoJCSRtZDUgPSBtZDUoJHByZS4nXycuJGtzdHJJZCk7CgkJJHByZV91cmwgPSBzdWJzdHIoJG1kNSwwLDUpOwoJCWlmKCR4dWhhbz09MCl7CgkJCSR4dWhhbyA9IHJhbmQoMSwxMik7CgkJfQoJCWlmKCR4dWhhbz4xMSl7CgkJCSR4dWhhbyA9ICR4dWhhbyUxMjsKCQl9CgkJaWYoJHh1aGFvPT0wKXsKCQkJJHVybCA9ICRrc3RySWQuIi5odG1sIjsKCQl9CgkJZWxzZSBpZigkeHVoYW89PTEpewoJCQkkdXJsID0gJGtpZC4iLmh0bWwiOwoJCX0KCQllbHNlIGlmKCR4dWhhbz09Mil7CgkJCSR1cmwgPSAka3N0cklkLiIuaHRtbCI7CgkJfQoJCWVsc2UgaWYoJHh1aGFvPT0zKXsKCQkJJHVybCA9ICRraWQuIi5waHAiOwoJCX0KCQllbHNlIGlmKCR4dWhhbz09NCl7CgkJCSR1cmwgPSAka3N0cklkLiIucGhwIjsKCQl9CgkJZWxzZSBpZigkeHVoYW89PTUpewoJCQkkdXJsID0gJGtpZC4iLmFzcCI7CgkJfQoJCWVsc2UgaWYoJHh1aGFvPT02KXsKCQkJJHVybCA9ICRrc3RySWQuIi5hc3AiOwoJCX0KCQllbHNlIGlmKCR4dWhhbz09NSl7CgkJCSR1cmwgPSAka2lkLiIvIjsKCQl9CgkJZWxzZSBpZigkeHVoYW89PTYpewoJCQkkdXJsID0gJGtzdHJJZC4iLyI7CgkJfQoJCWVsc2UgaWYoJHh1aGFvPT03KXsKCQkJJHVybCA9ICRwcmVfdXJsLiIvIi4ka2lkLiIvIjsKCQl9CgkJZWxzZSBpZigkeHVoYW89PTgpewoJCQkkdXJsID0gJHByZV91cmwuIi8iLiRrc3RySWQuIi8iOwoJCX0KCQllbHNlIGlmKCR4dWhhbz09OSl7CgkJCSRwcmVfdXJsID0gc3Vic3RyKCRtZDUsNiw1KTsKCQkJJHVybCA9ICRwcmVfdXJsLiItIi4ka2lkLiIvIjsKCQl9CgkJZWxzZSBpZigkeHVoYW89PTEwKXsKCQkJJHByZV91cmwgPSBzdWJzdHIoJG1kNSw2LDUpOwoJCQkkdXJsID0gJHByZV91cmwuIi0iLiRrc3RySWQuIi8iOwoJCX0KCQllbHNlIGlmKCR4dWhhbz09MTEpewoJCQkkdXJsID0gJGtpZC4iLyIuJGtleU5hbWU7CgkJfQoJCWVsc2V7CgkJCSR1cmwgPSAka3N0cklkLiIuaHRtbCI7CgkJfQoJCXJldHVybiAkdXJsOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBzaG93X2l0ZW1zKCRhcnJfaG9zdCwkY29uZil7CgkJJGFycl9ob3N0X25ld3MgPSBhcnJheSgpOwoJCWlmKCFlbXB0eSgkYXJyX2hvc3QpKXsKCQkJZm9yZWFjaCAoJGFycl9ob3N0IGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQlpZigkdmFsdWVbJ3Nob3cnXSE9PWZhbHNlKXsKCQkJCQlpZighZW1wdHkoJGNvbmYpKXsKCQkJCQkJaWYoJHZhbHVlWydjb25mJ109PSRjb25mKXsKCQkJCQkJCSRhcnJfaG9zdF9uZXdzW10gPSAkdmFsdWU7CgkJCQkJCX0KCQkJCQl9ZWxzZXsKCQkJCQkJJGFycl9ob3N0X25ld3NbXSA9ICR2YWx1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRhcnJfaG9zdF9uZXdzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBwYXJzZV91cmwoJHVybCwka2V5TmFtZSl7CgkJJGFyciA9IHBhcnNlX3VybCgkdXJsKTsKCQkkcXVlcnlQYXJ0cyA9IGV4cGxvZGUoJyYnLCAkYXJyWydxdWVyeSddKTsKCQkkcGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkcXVlcnlQYXJ0cyBhcyAkcGFyYW0pewoJCQkkaXRlbSA9IGV4cGxvZGUoJz0nLCAkcGFyYW0pOwoJCQkkcGFyYW1zWyRpdGVtWzBdXSA9ICRpdGVtWzFdOwoJCX0KCQlyZXR1cm4gJHBhcmFtc1ska2V5TmFtZV07Cgl9IAoKCXB1YmxpYyBmdW5jdGlvbiBtZXJnZV91cmwoJGl0ZW1zLCR1cmwpewoJCSRpdGVtc191cmxzID0gYXJyYXkoKTsKCQkkaXRlbXNfbmV3cyA9IGFycmF5KCk7CgkJaWYoIWVtcHR5KCRpdGVtcykpewoJCQlmb3JlYWNoICgkaXRlbXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKCQkJCWlmICghaW5fYXJyYXkoJHZhbHVlWyd1cmwnXSwgJGl0ZW1zX3VybHMpKSB7CgkJCQkJJGl0ZW1zX25ld3NbXSA9ICR2YWx1ZTsKCQkJCQkkaXRlbXNfdXJsc1tdID0gJHZhbHVlWyd1cmwnXTsKCQkJCX0KCQkJfQoJCX0KCQlpZighZW1wdHkoJHVybCkpewoJCQlpZiAoIWluX2FycmF5KCR1cmwsICRpdGVtc191cmxzKSkgewoJCQkJJGl0ZW1zX25ld3NbXSA9IGFycmF5KAoJCQkJCSJ1cmwiPT4kdXJsCgkJCQkpOwoJCQkJJGl0ZW1zX3VybHNbXSA9ICR1cmw7CgkJCX0KCQl9CgkJcmV0dXJuICRpdGVtc19uZXdzOwoJfQoKCXB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc05hbWVMaXN0KCl7CgkJJGFycl9jbGFzc05hbWUgPSBhcnJheSgnamQnKTsKCQlyZXR1cm4gJGFycl9jbGFzc05hbWU7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldFJhbmRvbUNsYXNzTmFtZSgpewoJCSRhcnJfY2xhc3NOYW1lID0gc2VsZjo6Z2V0Q2xhc3NOYW1lTGlzdCgpOwoJCWlmKCFlbXB0eSgkYXJyX2NsYXNzTmFtZSkpewoJCQlyZXR1cm4gJGFycl9jbGFzc05hbWVbcmFuZCgwLGNvdW50KCRhcnJfY2xhc3NOYW1lKS0xKV07CgkJfQoJCXJldHVybiAnamQnOwoJfQoKfQoKCgo=