Initial commit
No files matched your search
@@ -0,0 +1,8 @@
|
|||||||
|
node_modules/
|
||||||
|
coverage/
|
||||||
|
dist/
|
||||||
|
scratch/
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Deighton AR Training System
|
||||||
|
|
||||||
|
This is the repository for the Deighton AR Training System.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
Ensure the [snap-tools]() are installed. Then clone the repository, and from the root do:
|
||||||
|
|
||||||
|
```
|
||||||
|
snap install
|
||||||
|
snap start
|
||||||
|
```
|
||||||
|
|
||||||
|
This will start the website, server and mobile app.
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1418px" height="932px" viewBox="0 0 1418 932" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Deighton AR System</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="5.65288774%" y1="49.7500002%" x2="96.8479147%" y2="49.7500002%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#D9D9D9" offset="0%"></stop>
|
||||||
|
<stop stop-color="#FFFFFF" offset="74.1230867%"></stop>
|
||||||
|
<stop stop-color="#D9D9D9" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<rect id="path-2" x="0" y="0" width="101" height="101" rx="15"></rect>
|
||||||
|
<rect id="path-3" x="347" y="600" width="732" height="305" rx="20"></rect>
|
||||||
|
<mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="732" height="305" fill="white">
|
||||||
|
<use xlink:href="#path-3"></use>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="Deighton-AR-System">
|
||||||
|
<g id="Deighton-AR-Cloud" transform="translate(166.000000, 112.000000)">
|
||||||
|
<path d="M61.9666767,263.630536 C61.9666767,263.630536 13.8823758,266.642564 2.14585145,223.105034 C-9.59067294,179.567505 30.6421304,149.777478 30.6421304,149.777478 C30.6421304,149.777478 3.86713774,88.9148862 48.0221034,59.4026571 C92.177069,29.890428 132.137392,65.0961481 132.137392,65.0961481 C132.137392,65.0961481 146.882195,9.30099158 213.387402,0.942799034 C279.892608,-7.41539351 307.464966,42.5490795 307.464966,42.5490795 C307.464966,42.5490795 379.94436,-8.27020865 439.077164,28.4129697 C498.209969,65.0961481 476.357577,123.281621 476.357577,123.281621 C476.357577,123.281621 536.316599,151.787877 529.452639,208.995308 C522.588679,266.202739 463.005692,277.459669 463.005692,277.459669 C463.005692,277.459669 469.848467,311.731424 421.287008,332.695502 C372.72555,353.65958 324.990309,332.695502 324.990309,332.695502 C324.990309,332.695502 306.72398,353 265,353 C223.27602,353 199.633,332.695502 199.633,332.695502 C199.633,332.695502 111.211847,365.183754 73.76725,332.695502 C36.3226528,300.20725 61.9666767,263.630536 61.9666767,263.630536 Z" id="Line" stroke="#979797" stroke-width="4" stroke-linecap="square"></path>
|
||||||
|
<text id="Text" font-family="AvenirNext-Medium, Avenir Next" font-size="24" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="202.816" y="89">Deighton AR Cloud</tspan>
|
||||||
|
</text>
|
||||||
|
<g id="Database" transform="translate(102.000000, 115.000000)" stroke="#979797" stroke-width="3">
|
||||||
|
<path d="M88,14 L88,84.738255 C88,92.6147997 68.3005302,99 44,99 C19.6994698,99 1.66095379e-06,91.8691275 0,84.738255 L0,14" id="Sides" fill="url(#linearGradient-1)"></path>
|
||||||
|
<ellipse id="Top" fill="#D9D9D9" cx="44" cy="14" rx="44" ry="14"></ellipse>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(259.000000, 202.000000)">
|
||||||
|
<g id="Rectangle">
|
||||||
|
<use fill="#D8D8D8" fill-rule="evenodd" xlink:href="#path-2"></use>
|
||||||
|
<rect stroke="#979797" stroke-width="3" x="1.5" y="1.5" width="98" height="98" rx="15"></rect>
|
||||||
|
</g>
|
||||||
|
<text id="api-+-static" font-family="AvenirNext-Medium, Avenir Next" font-size="20" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="36.65" y="30">api</tspan>
|
||||||
|
<tspan x="44.34" y="57">+</tspan>
|
||||||
|
<tspan x="27.13" y="84">static</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Google-Cloud" transform="translate(729.000000, 117.000000)">
|
||||||
|
<path d="M61.9666767,263.630536 C61.9666767,263.630536 13.8823758,266.642564 2.14585145,223.105034 C-9.59067294,179.567505 30.6421304,149.777478 30.6421304,149.777478 C30.6421304,149.777478 3.86713774,88.9148862 48.0221034,59.4026571 C92.177069,29.890428 132.137392,65.0961481 132.137392,65.0961481 C132.137392,65.0961481 146.882195,9.30099158 213.387402,0.942799034 C279.892608,-7.41539351 307.464966,42.5490795 307.464966,42.5490795 C307.464966,42.5490795 379.94436,-8.27020865 439.077164,28.4129697 C498.209969,65.0961481 476.357577,123.281621 476.357577,123.281621 C476.357577,123.281621 536.316599,151.787877 529.452639,208.995308 C522.588679,266.202739 463.005692,277.459669 463.005692,277.459669 C463.005692,277.459669 469.848467,311.731424 421.287008,332.695502 C372.72555,353.65958 324.990309,332.695502 324.990309,332.695502 C324.990309,332.695502 306.72398,353 265,353 C223.27602,353 199.633,332.695502 199.633,332.695502 C199.633,332.695502 111.211847,365.183754 73.76725,332.695502 C36.3226528,300.20725 61.9666767,263.630536 61.9666767,263.630536 Z" id="Line" stroke="#979797" stroke-width="4" stroke-linecap="square"></path>
|
||||||
|
<text id="Text" font-family="AvenirNext-Medium, Avenir Next" font-size="24" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="174.904" y="112">Google Cloud</tspan>
|
||||||
|
</text>
|
||||||
|
<g id="google" transform="translate(202.000000, 177.000000)" fill-rule="nonzero">
|
||||||
|
<path d="M91,47.9368519 L91,92 L77.3570726,89.4368331 L71.3423929,82.1135571 L46,53.5172716 L67.5161024,38 C78.2938994,52.4396524 78.6337659,48.919524 78.6337659,48.919524 C78.6337659,48.919524 83.9575433,40.8520571 90.7875834,47.7844102 L91,47.9368519 Z" id="Shape" fill="#CCCCCC"></path>
|
||||||
|
<path d="M38.6152093,45 L84,102.960048 C83.7357573,102.985746 83.4686821,103 83.1987742,103 L9,103 L38.6152093,45 Z" id="Shape" fill="#518EF8"></path>
|
||||||
|
<path d="M67,38.24173 L0,95 L0,20.2375192 C0,15.6869933 3.66589034,12 8.18408913,12 L57.0430129,12 C54.9449765,15.6295862 62.724199,17.9592242 62.724199,22.4610349 C62.724199,26.9917513 64.8764586,34.5949621 67,38.24173 Z" id="Shape" fill="#28B446"></path>
|
||||||
|
<path d="M91,91.9033423 L91,94.7589459 C91,99.0598279 87.7649535,102.596208 83.6252806,103 L46,65.3573245 L55.107601,56 L76.1280869,77.0280699 L77.2888871,78.1904704 L91,91.9033423 Z" id="Shape" fill="#F2F2F2"></path>
|
||||||
|
<path d="M64.7672582,46.4135458 L54.7595809,56.5364496 L45.62246,65.7789787 L8.82602129,103 L8.19517463,103 C3.67085585,103 0,99.3359873 0,94.8201028 L57.1631127,37 C58.2335612,38.8291962 65.5951816,36.9771175 67.0909538,38.45866 L69.8399732,41.985779 C71.1815027,43.4135276 63.6141582,44.8978802 64.7672582,46.4135458 Z" id="Shape" fill="#FFD837"></path>
|
||||||
|
<path d="M21,46 C13.8316728,46 8,40.1683272 8,33 C8,25.8316728 13.8316728,20 21,20 C24.4700565,20 27.7337193,21.3528696 30.190625,23.8095751 L27.1763963,26.8232033 C25.5252468,25.1716534 23.3315881,24.2621999 21,24.2621999 C16.1818784,24.2621999 12.2624001,28.1818784 12.2624001,32.9997998 C12.2624001,37.8177212 16.1820786,41.7373997 21,41.7373997 C25.0830318,41.7373997 28.5212584,38.9223579 29.4747532,35.1307997 L21,35.1307997 L21,30.8685998 L34,30.8685998 L34,32.9997998 C33.9997998,40.1683272 28.1683272,46 21,46 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<path d="M57.3049966,12.2066616 C61.5467744,4.90899518 69.4507532,0 78.5,0 C92.0311063,0 103,10.9722665 103,24.5075334 C103,27.9021199 102.308734,31.1336503 101.063247,34.073894 C99.8149437,37.0141377 98.0096021,39.6600753 95.7816525,41.8772356 C93.9249943,43.8516236 92.2597171,45.9375339 90.7628795,48.0691401 C80.9565605,62.0444572 78.5,78 78.5,78 C78.5,78 75.8321355,60.6757924 64.957423,46.3175955 C63.8035016,44.7975503 62.5580152,43.3087072 61.2155301,41.8772356 L61.2183475,41.8772356 C59.7215099,40.3914121 58.419072,38.7113303 57.3478611,36.8768485 C55.2197275,33.2451261 54,29.0191548 54,24.5073321 C54,20.0242958 55.2026219,15.8210719 57.3049966,12.2066616 Z" id="Shape" fill="#F14336"></path>
|
||||||
|
<path d="M78.0017055,11 C85.1811559,11 91,16.8222551 91,24.0017055 C91,31.1811559 85.1811559,37 78.0017055,37 C70.8222551,37 65,31.1811559 65,24.0017055 C65,16.8222551 70.8224558,11 78.0017055,11 Z" id="Shape" fill="#7E2D25"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="iphone" transform="translate(747.000000, 646.000000)">
|
||||||
|
<path d="M78.9280215,0 L6.07351579,0 C2.72377728,0 0,2.7369505 0,6.1009901 L0,149.900554 C0,153.264594 2.72377728,156 6.07351579,156 L78.9280215,156 C82.2777601,156 84.9999993,153.264594 84.9999993,149.900554 L84.9999993,6.1009901 C85.0015373,2.7369505 82.2777601,0 78.9280215,0 Z M36.54414,142.871287 C36.54414,139.565941 39.2079357,136.886139 42.5007687,136.886139 C45.7982156,136.886139 48.4573974,139.565941 48.4573974,142.871287 C48.4573974,146.178178 45.7982156,148.856436 42.5007687,148.856436 C39.2079357,148.856436 36.54414,146.178178 36.54414,142.871287 Z M4.61550289,132.613901 L4.61550289,18.9686733 L80.3891104,18.9686733 L80.3891104,132.613901 L4.61550289,132.613901 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
|
||||||
|
<text id="iOS" font-family="AvenirNext-Medium, Avenir Next" font-size="24" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="22.376" y="228">iOS</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g id="samsung-galaxy-2" transform="translate(925.000000, 645.000000)">
|
||||||
|
<path d="M75.7096136,157 L11.2871365,157 C5.06344907,157 0,151.977612 0,145.802413 L0,11.199199 C0,5.024 5.06344907,0 11.2871365,0 L75.7112385,0 C81.9365509,0 87,5.024 87,11.199199 L87,145.799189 C87,151.974388 81.9349259,157 75.7096136,157 Z M11.2871365,1.61232349 C5.96044005,1.61232349 1.62498366,5.91400257 1.62498366,11.199199 L1.62498366,145.799189 C1.62498366,151.084385 5.96044005,155.386064 11.2871365,155.386064 L75.7112385,155.386064 C81.0395599,155.386064 85.3750163,151.084385 85.3750163,145.799189 L85.3750163,11.199199 C85.3750163,5.91400257 81.0395599,1.61232349 75.7112385,1.61232349 L11.2871365,1.61232349 Z M50.8132389,151.72609 L36.188386,151.72609 C33.4259138,151.72609 31.1769364,149.496246 31.1769364,146.753684 C31.1769364,144.014347 33.4259138,141.784503 36.188386,141.784503 L50.8132389,141.784503 C53.5740862,141.784503 55.8246885,144.014347 55.8246885,146.753684 C55.8230636,149.496246 53.5740862,151.72609 50.8132389,151.72609 Z M36.1867611,143.396827 C34.3196548,143.396827 32.8002951,144.904349 32.8002951,146.753684 C32.8002951,148.604632 34.3196548,150.113766 36.1867611,150.113766 L50.811614,150.113766 C52.6770952,150.113766 54.1980799,148.604632 54.1980799,146.753684 C54.1980799,144.904349 52.6770952,143.396827 50.811614,143.396827 L36.1867611,143.396827 Z M82.5637946,140.107687 L4.43620538,140.107687 L4.43620538,16.8890886 L82.5637946,16.8890886 L82.5637946,140.107687 Z M6.06118904,138.495363 L80.938811,138.495363 L80.938811,18.5014121 L6.06118904,18.5014121 L6.06118904,138.495363 Z M54.1639552,10.4462439 L32.8360448,10.4462439 C32.1080521,10.4462439 31.514933,9.85935815 31.514933,9.1354249 C31.514933,8.41149166 32.1064271,7.82460591 32.8360448,7.82460591 L54.1639552,7.82460591 C54.8919479,7.82460591 55.483442,8.41149166 55.483442,9.1354249 C55.483442,9.85935815 54.8919479,10.4462439 54.1639552,10.4462439 Z M32.8360448,8.63237997 C32.5565476,8.63237997 32.3274249,8.85971759 32.3274249,9.13703723 C32.3274249,9.41435687 32.5565476,9.64169448 32.8360448,9.64169448 L54.1639552,9.64169448 C54.4434524,9.64169448 54.6709501,9.41435687 54.6709501,9.13703723 C54.6709501,8.85971759 54.4418275,8.63237997 54.1639552,8.63237997 L32.8360448,8.63237997 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
|
||||||
|
<text id="Android" font-family="AvenirNext-Medium, Avenir Next" font-size="24" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="0.188" y="227">Android</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g id="monitor-2" transform="translate(377.000000, 624.000000)">
|
||||||
|
<path d="M268.813647,0 L8.19642939,0 C3.67730335,0 0,3.65748115 0,8.15533006 L0,151.888319 C0,151.888319 0.00504085449,151.893336 0.00504085449,151.898353 L0.00504085449,159.080362 C0.00504085449,161.736927 2.165047,163.886764 4.8291386,163.886764 L111.49362,163.886764 C111.060106,173.339019 108.963111,192.308754 99.1031992,196.467947 C99.1031992,196.467947 95.2771906,200 105.983966,200 L124.309992,200 L149.567193,200 L167.898261,200 C178.605036,200 174.779027,196.467947 174.779027,196.467947 C164.919116,192.308754 162.817079,173.336511 162.388607,163.886764 L272.264112,163.886764 C274.938285,163.886764 276.979831,161.736927 276.979831,159.080362 L276.979831,152.114089 C276.979831,152.036324 276.999995,151.963576 276.999995,151.888319 L276.999995,8.15533006 C277.005036,3.65748115 273.332773,0 268.813647,0 Z M133.252468,162.301353 C133.252468,160.056192 135.079778,158.239994 137.33304,158.239994 C139.588822,158.239994 141.413611,160.0587 141.413611,162.301353 C141.413611,164.544006 139.586302,166.362713 137.33304,166.362713 C135.079778,166.362713 133.252468,164.546515 133.252468,162.301353 Z M268.813647,152.781366 L8.19642939,152.781366 L8.19642939,8.79752154 C8.19642939,8.16034718 8.71311698,7.64107517 9.3533055,7.64107517 L267.65173,7.64107517 C268.291919,7.64107517 268.813647,8.16034718 268.813647,8.79752154 L268.813647,152.781366 Z" id="Shape" fill="#000000" fill-rule="nonzero"></path>
|
||||||
|
<text id="Text-Copy" font-family="AvenirNext-Medium, Avenir Next" font-size="24" font-weight="400" fill="#888888">
|
||||||
|
<tspan x="44.488" y="250">Desktop Browser</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<path d="M474.296875,590 L474.296875,437.820312" id="Path-2-Copy" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<path id="Path-2-Copy-decoration-1" d="M477.296875,448.620313 L474.296875,437.820312 L471.296875,448.620313" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<path d="M476,292.453125 C476,268.151042 467.590008,256 450.770024,256 C433.950041,256 408.026699,261.6875 373,273.0625" id="Path-2-Copy-2" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<path id="Path-2-Copy-2-decoration-1" d="M382.345297,266.873362 L373,273.0625 L384.198535,272.579982" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<path d="M979,590 L979,415" id="Path-2-Copy-4" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<path id="Path-2-Copy-4-decoration-1" d="M982,425.8 L979,415 L976,425.8" stroke="#979797" stroke-width="6"></path>
|
||||||
|
<use id="Rectangle-2" stroke="#979797" mask="url(#mask-4)" stroke-width="6" stroke-dasharray="9" xlink:href="#path-3"></use>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
@@ -0,0 +1,36 @@
|
|||||||
|
#?RADIANCE
|
||||||
|
# Made with Adobe Photoshop
|
||||||
|
FORMAT=32-bit_rle_rgbe
|
||||||
|
|
||||||
|
-Y 327 +X 500
|
||||||
|
魡檱殥泟欻櫃槝棗枛晻敁搾憫悘弾崓寢妸増垏唵厔剝倐亐€�����鲺趔篁耩痫铑眄祆腚腙觋嗛忚囬勱O腚腱祉眍铒镳瘃蝌篝貂鲼������€€亖倐儍剠厗唶垑墛媽實帍彁憭摀敃枛棙槞櫄洓湝湞潉瀻焼瀯潊渽泤殔檱槇棅枴晻敗摐拵摷攰晧�梿檱殥泟欻櫃槝棗枛晻敁搾憫悘弾崓寢妸増垏唵厔剝倐亐€�����鲺趔篁耩痫铑眄祆腚腙觋嗛忚囬勱O腚腱祉眍铒镳瘃蝌篝貂鲼������€€亖倐儍剠厗唶垑墛媽實帍彁憭摀敃枛棙槞櫄洓湝湞潉瀻焼瀯潊渽泤殔檱槇棅枴晻敗摐拵摷攰晧�梿檱殥泟欻櫃槝棗枛晻敁搾憫悘弾崓寢妸増垏唵厔剝倐亐€�����鲺趔篁耩痫铑眄祆腚腙觋嗛忚囬勱O腚腱祉眍铒镳瘃蝌篝貂鲼������€€亖倐儍剠厗唶垑墛媽實帍彁憭摀敃枛棙槞櫄洓湝湞潉瀻焼瀯潊渽泤殔檱槇棅枴晻敗摐拵摷攰晧�椞~遾�~�~藒魠檱殥汯殮殭櫂槜棖枙敂搾拺悘弾崒媼妷垐噯厔剝倐亐€���黯豸蝰痧镱盱腙觊梃珂驽邃溷沣勨樶勨勩N滗邋骀珑梃殛觌祉眍镳耨蝮趱貊鼬����€亖倐儎厖唶垑墛媽崕彁悜挀敃晼棙槞殮洓湝潩劄悷厼劃劀厸厷厵啒垪姈煏摂崜窉帗粩墪墫厵嚉挍K殮殭櫂槜棖枙敂搾拺悘弾崒媼妷垐噯厔剝倐亐€���黯豸蝰痧镱盱腙觊梃珂驽邃溷沣勨樶勨勩N滗邋骀珑梃殛觌祉眍镳耨蝮趱貊鼬����€亖倐儎厖唶垑墛媽崕彁悜挀敃晼棙槞殮洓湝潩劄悷厼劃劀厸厷厵啒垪姈煏摂崜窉帗粩墪墫厵嚉挍K殮殭櫂槜棖枙敂搾拺悘弾崒媼妷垐噯厔剝倐亐€���黯豸蝰痧镱盱腙觊梃珂驽邃溷沣勨樶勨勩N滗邋骀珑梃殛觌祉眍镳耨蝮趱貊鼬����€亖倐儎厖唶垑墛媽崕彁悜挀敃晼棙槞殮洓湝潩劄悷厼劃劀厸厷厵啒垪姈煏摂崜窉帗粩墪墫莮雧�~�~膥魟檰殙泝渾汳殮殭櫂槜棖枙敁搾憪弿帊寢妷増噯厔儍倎€����豸篑痫铐祀觊桤驽溷忖徉噙揶葺苘圹蹍跂賲趧跼苘葺揶哌噌徕沣溴骀玷殛觌祉铒痧耱篝貊���€€亗儎剠唶垑妺實帍悜挀摂晼棙槞殯洔湞潪灋厽嚑啛劄劃厹剾剼啓啒嚄姈灂悢姄�姂搾彄敂悡敂墪嚃剻啔墰儨啗M殮殭櫂槜棖枙敁搾憪弿帊寢妷増噯厔儍倎€����豸篑痫铐祀觊桤驽溷忖徉噙揶葺苘圹蹍跂賲趧跼苘葺揶哌噌徕沣溴骀玷殛觌祉铒痧耱篝貊���€€亗儎剠唶垑妺實帍悜挀摂晼棙槞殯洔湞潪灋厽嚑啛劄劃厹剾剼啓啒嚄姈灂悢姄�姂搾彄敂悡敂墪嚃剻啔墰儨啗M殮殭櫂槜棖枙敁搾憪弿帊寢妷増噯厔儍倎€����豸篑痫铐祀觊桤驽溷忖徉噙揶葺苘圹蹍跂賲趧跼苘葺揶哌噌徕沣溴骀玷殛觌祉铒痧耱篝貊���€€亗儎剠唶垑妺實帍悜挀摂晼棙槞殯洔湞潪灋厽嚑啛劄劃厹剾剼啓啒嚄姈灂悢姄�姂搾彄敂悡敂墪嚃羱鰙�~�~縹魞檰殘泤渽汳殮殭櫂槜枛晹搾拺悘帊寢妷垏唴厔儌亐���鲺篁痫盱觊桤驿汊徉咿蒈苒谫刎鬃终赵杂佑勔堁壭壯呉T佑栽哉罩肿刎仝谯茌蒉哙後忏溴骀玷殛腱眍瘃蝮貊���€亗儎厗噲墛媽崕彁憭摂晼棙櫄殯湝潩灋劅嫚厽劄劃劀剾剼厵啒嚄嫋湑帞墦垝祽寬笓崝墪問儥啔垱厹厸M殮殭櫂槜枛晹搾拺悘帊寢妷垏唴厔儌亐���鲺篁痫盱觊桤驿汊徉咿蒈苒谫刎鬃终赵杂佑勔堁壭壯呉T佑栽哉罩肿刎仝谯茌蒉哙後忏溴骀玷殛腱眍瘃蝮貊���€亗儎厗噲墛媽崕彁憭摂晼棙櫄殯湝潩灋劅嫚厽劄劃劀剾剼厵啒嚄嫋湑帞墦垝祽寬笓崝墪問儥啔垱厹厸M殮殭櫂槜枛晹搾拺悘帊寢妷垏唴厔儌亐���鲺篁痫盱觊桤驿汊徉咿蒈苒谫刎鬃终赵杂佑勔堁壭壯呉T佑栽哉罩肿刎仝谯茌蒉哙後忏溴骀玷殛腱眍瘃蝮貊���€亗儎厗噲墛媽崕彁憭摂晼棙櫄殯湝潩灋劅嫚厽劄劃劀剾剼厵啒嚄嫋湑帞墦垝祽寬笓崝墪問絶�}�~�~簙魞檯殗泦渽汷殮櫃槝棖枙敁拺悘弽寢妷垏唴剝倎€��黪篑痤祀殓驽汊噙掭圳儇字赵佑已行衔瓮吞趟耸适吷柸吷勈U怂烫屯挝闲醒矣釉罩肿刭谮圮蒉哙後怃彐玷觌祛锺篚鼬��€亗儏唶垑妼崕彁憭摂枛棙櫄洔湞潪灍煆爠焺瀮潉渼泟殔檯槆棇枤晫攭搯拠懆悙憢捀搵攬晠杻檯殗泦渽汷殮櫃槝棖枙敁拺悘弽寢妷垏唴剝倎€��黪篑痤祀殓驽汊噙掭圳儇字赵佑已行衔瓮吞趟耸适吷柸吷勈U怂烫屯挝闲醒矣釉罩肿刭谮圮蒉哙後怃彐玷觌祛锺篚鼬��€亗儏唶垑妼崕彁憭摂枛棙櫄洔湞潪灍煆爠焺瀮潉渼泟殔檯槆棇枤晫攭搯拠懆悙憢捀搵攬晠杻檯殗泦渽汷殮櫃槝棖枙敁拺悘弽寢妷垏唴剝倎€��黪篑痤祀殓驽汊噙掭圳儇字赵佑已行衔瓮吞趟耸适吷柸吷勈U怂烫屯挝闲醒矣釉罩肿刭谮圮蒉哙後怃彐玷觌祛锺篚鼬��€亗儏唶垑妼崕彁憭摂枛棙櫄洔湞潪灍煆爠焺瀮潉渼泟殔檯槆棇枤晫攭搯拠懆悙憢捀搵攬晠柟~�}坿�~�~秪魝檯殗泦渼決殮殭櫂棗枙敁拺悘帊寢妷噯厔儌€���趄痤礻殓邈忄掭圳刈终右研衔吞耸缮惹破排拿妹侣亮羺罆繂繷亮谅侣妹哪牌魄热墒仕掏挝闲岩矣哉肿棕仝茌捱噔沐玷觎铕螋鳄�€亗儏唶墛媽帍悜摂晼棙櫄洓湞灋煙劆垺厾劅優劃儨剾剼剻啒嚄崠槙姅嚀啋啈啇潖晲姂姃窊姅垥儢倷厷嚊啘剾Q殮殭櫂棗枙敁拺悘帊寢妷噯厔儌€���趄痤礻殓邈忄掭圳刈终右研衔吞耸缮惹破排拿妹侣亮羺罆繂繷亮谅侣妹哪牌魄热墒仕掏挝闲岩矣哉肿棕仝茌捱噔沐玷觎铕螋鳄�€亗儏唶墛媽帍悜摂晼棙櫄洓湞灋煙劆垺厾劅優劃儨剾剼剻啒嚄崠槙姅嚀啋啈啇潖晲姂姃窊姅垥儢倷厷嚊啘剾Q殮殭櫂棗枙敁拺悘帊寢妷噯厔儌€���趄痤礻殓邈忄掭圳刈终右研衔吞耸缮惹破排拿妹侣亮羺罆繂繷亮谅侣妹哪牌魄热墒仕掏挝闲岩矣哉肿棕仝茌捱噔沐玷觎铕螋鳄�€亗儏唶墛媽帍悜摂晼棙櫄洓湞灋煙劆垺厾劅優劃儨剾剼剻啒嚄崠槙姅嚀啋啈啇潖晲姂姃窊姅垥儢祣�}弣�~�~硚�檰殔泧渼汻殮殭槝棖晹敁憪弾崒妷垏厔儌€��黪蝠铎殓邈徇蒈谪终右邢吞耸惹婆拿铝晾烤窘技换汉构垢父叿敹嚪\父腹构汉换冀骄靠懒谅媚呐魄热墒怂掏蜗醒矣灾棕谲葸徙彗殡铕篚�齹亗剠噲妺寧彁挀敃棙櫄洓湞灋煙牋尅劆儫劄潩潨湝剾剼剻啒嚄悥摃墧嚀厭厬剱啅湈拸姁垜嫆祿垟墪�檰殔泧渼汻殮殭槝棖晹敁憪弾崒妷垏厔儌€��黪蝠铎殓邈徇蒈谪终右邢吞耸惹婆拿铝晾烤窘技换汉构垢父叿敹嚪\父腹构汉换冀骄靠懒谅媚呐魄热墒怂掏蜗醒矣灾棕谲葸徙彗殡铕篚�齹亗剠噲妺寧彁挀敃棙櫄洓湞灋煙牋尅劆儫劄潩潨湝剾剼剻啒嚄悥摃墧嚀厭厬剱啅湈拸姁垜嫆祿垟墪�檰殔泧渼汻殮殭槝棖晹敁憪弾崒妷垏厔儌€��黪蝠铎殓邈徇蒈谪终右邢吞耸惹婆拿铝晾烤窘技换汉构垢父叿敹嚪\父腹构汉换冀骄靠懒谅媚呐魄热墒怂掏蜗醒矣灾棕谲葸徙彗殡铕篚�齹亗剠噲妺寧彁挀敃棙櫄洓湞灋煙牋尅劆儫劄潩潨湝剾剼剻啒嚄悥摃墧嚀厭厬剱啅湈拸姁垜嫆祿垟墪柌~�}晑�~�~皛�檯殕泦渼汻殮櫃槜棖晹搾憦帊寠増唴儌���黥耧扉珏忄捃僮赵倚翁松绕琶铝谰郊缓构阜兜荡吵膊北鞍隘�叜暛嚠\��鞍北膊吵Line truncated
|
||||||
|
�������厐唩剛厓儎剠唵唶噰垐垑墛妸媼媽實崓剮剰厫☉垝嚀倲儦嫑O殮櫂槜枖搾悘崑墖厓€�箢殇咣盅腿目环嘲�ア煖殫敀悗寠垏厔倎€��鲺趄耩镱眄祆腚觋陮閰陝雲鞄韰�镲镳耨蝮篝貊鼬�����剙唩剛@儍剟厗噲墜寧悞敄櫅灐え�撤豢萌脱舟噱腽斛�倕噴寧悡晽槡湞灎、ⅲい���#ⅱⅰ�牊煘灊潩湝湜洓剼啓悩姉厲3晻晹敂摀搾拺憪悘弾帊崒寢媻墘垐噯唴剟儌倎亐€����麊鷦�
|
||||||
|
�������厐唩剛厓儎剠唵唶噰垐垑墛妸媼媽實崓剮剰厫☉垝嚀倲儦嫑O殮櫂槜枖搾悘崑墖厓€�箢殇咣盅腿目环嘲�ア煖殫敀悗寠垏厔倎€��鲺趄耩镱眄祆腚觋陮閰陝雲鞄韰�镲镳耨蝮篝貊鼬�����剙唩剛@儍剟厗噲墜寧悞敄櫅灐え�撤豢萌脱舟噱腽斛�倕噴寧悡晽槡湞灎、ⅲい���#ⅱⅰ�牊煘灊潩湝湜洓剼啓悩姉厲3晻晹敂摀搾拺憪悘弾帊崒寢媻墘垐噯唴剟儌倎亐€����麊鷦�
|
||||||
|
�������厐唩剛厓儎剠唵唶噰垐垑墛妸媼媽實崓剮剰厫☉垝嚀倲��貄穧�~媬渳鱺魞殙汯殮殭槜棔敁憪帉妶唲侢�镪遴壑烟锹焦窗�ぁ潥棓憥寜噮儊��鲶耧黼殓驿汊徉哌揶葺徿勢 揶捱哌噜鄥釓鈩�滗溴骀玷栝觌祉铑镳耨蝌咉堲?貂鲼���亗剠噳寧憮枡潬え�垂铰翘炎茚珈蝼齺剢墜帎摃棛殰灍牎ⅲい垾いぃ#ⅱ 牋煙灋潩潨湝洓泟殘檻槅梽�3晻晹敂摀拻憫悙弿帋崓寢媻妷垐噯厖剝儌亐€����黯鲺鯃�貂貊鲻鼢�����������剙剚"倐們儍剟剠厗唵噰垐墘墛妺媽寣崓崕帋剰厫☉噿嚀儦墰K殮殭槜棔敁憪帉妶唲侢�镪遴壑烟锹焦窗�ぁ潥棓憥寜噮儊��鲶耧黼殓驿汊徉哌揶葺徿勢 揶捱哌噜鄥釓鈩�滗溴骀玷栝觌祉铑镳耨蝌咉堲?貂鲼���亗剠噳寧憮枡潬え�垂铰翘炎茚珈蝼齺剢墜帎摃棛殰灍牎ⅲい垾いぃ#ⅱ 牋煙灋潩潨湝洓泟殘檻槅梽�3晻晹敂摀拻憫悙弿帋崓寢媻妷垐噯厖剝儌亐€����黯鲺鯃�貂貊鲻鼢�����������剙剚"倐們儍剟剠厗唵噰垐墘墛妺媽寣崓崕帋剰厫☉噿嚀儦墰K殮殭槜棔敁憪帉妶唲侢�镪遴壑烟锹焦窗�ぁ潥棓憥寜噮儊��鲶耧黼殓驿汊徉哌揶葺徿勢 揶捱哌噜鄥釓鈩�滗溴骀玷栝觌祉铑镳耨蝌咉堲?貂鲼���亗剠噳寧憮枡潬え�垂铰翘炎茚珈蝼齺剢墜帎摃棛殰灍牎ⅲい垾いぃ#ⅱ 牋煙灋潩潨湝洓泟殘檻槅梽�3晻晹敂摀拻憫悙弿帋崓寢媻妷垐噯厖剝儌亐€����黯鲺鯃�貂貊鲻鼢�����������剙剚"倐們儍剟剠厗唵噰垐墘墛妺媽寣崓崕帋剰厫☉噿嚀焴�鱸��~厏瘆閪魟殗汬殮櫃槜枙敁憦帉妵厓€�耢玑苤阉屏挤箔━牅檿拵媹唭価�耦腓邂噢苴僮终杂已研袑蟿�蜒岩矣佑栽照罩謩讌貝�谮圹圮葺捱噜徕沣溴鍕鎳�=骀玷殡盹螋��亜唹審挄櫇ˉ┊撤悸峭邑捭轱觖€儐墜帎摃棛洔灍、#����いぃ"ⅰ�牊煘灊潩湝湜洓厷嫏崢厳剸4晻敂敁搾拺憪弿帋崒寢妸増垏唴厔儌倎€���黯豸篁耩镲铑図K铑铒镳瘃耱蝮篌趑貂鲻鼢���������€€€亖倐們儎剠厗唶噲垑墛妸媼寣崓崕帋弿弳惂憞拝搫殗汬殮櫃槜枙敁憦帉妵厓€�耢玑苤阉屏挤箔━牅檿拵媹唭価�耦腓邂噢苴僮终杂已研袑蟿�蜒岩矣佑栽照罩謩讌貝�谮圹圮葺捱噜徕沣溴鍕鎳�=骀玷殡盹螋��亜唹審挄櫇ˉ┊撤悸峭邑捭轱觖€儐墜帎摃棛洔灍、#����いぃ"ⅰ�牊煘灊潩湝湜洓厷嫏崢厳剸4晻敂敁搾拺憪弿帋崒寢妸増垏唴厔儌倎€���黯豸篁耩镲铑図K铑铒镳瘃耱蝮篌趑貂鲻鼢���������€€€亖倐們儎剠厗唶噲垑墛妸媼寣崓崕帋弿弳惂憞拝搫殗汬殮櫃槜枙敁憦帉妵厓€�耢玑苤阉屏挤箔━牅檿拵媹唭価�耦腓邂噢苴僮终杂已研袑蟿�蜒岩矣佑栽照罩謩讌貝�谮圹圮葺捱噜徕沣溴鍕鎳�=骀玷殡盹螋��亜唹審挄櫇ˉ┊撤悸峭邑捭轱觖€儐墜帎摃棛洔灍、#����いぃ"ⅰ�牊煘灊潩湝湜洓厷嫏崢厳剸4晻敂敁搾拺憪弿帋崒寢妸増垏唴厔儌倎€���黯豸篁耩镲铑図K铑铒镳瘃耱蝮篌趑貂鲻鼢���������€€€亖倐們儎剠厗唶噲垑墛妸媼寣崓崕帋弿弳惂憞拝摓~潁�|億渳�~絵邁魟殔汫殮殭櫂棖晹拺弽媺噭���镩爿匾唐粱侗��檿憤妴儉�耢桎噍谧砸形趟扇瞧拍拿脟聞�哪呐牌魄侨壬墒仕颂掏臀蜗舷勑捬乙矣釉哉种棕刭谮圹蹍躆圹圳谫儇刈鬃肿鬃刭谲萼忮桁雉�亜噵帓枤灒ō卜铰任在噫眢��倕垕帎摃棛洕灎、¥ゥ��ゥイい#ⅱ 牋煙灋潩潨湝洓泦殣檱槃�7枛枙晹敁搾拺憪悘帋崒寢妷増噯唴剝倎亐��黯趔耩铐祀觊桤鐖鍺珑玷栝殛觌腱祉眍铒镳瘃耱蝮篝趱貊鼢������€€亖倐儍剟厗唶噲垑墛妺媽實崓帋帍弿啇憫崘墤啋儞剼厸G殮殭櫂棖晹拺弽媺噭���镩爿匾唐粱侗��檿憤妴儉�耢桎噍谧砸形趟扇瞧拍拿脟聞�哪呐牌魄侨壬墒仕颂掏臀蜗舷勑捬乙矣釉哉种棕刭谮圹蹍躆圹圳谫儇刈鬃肿鬃刭谲萼忮桁雉�亜噵帓枤灒ō卜铰任在噫眢��倕垕帎摃棛洕灎、¥ゥ��ゥイい#ⅱ 牋煙灋潩潨湝洓泦殣檱槃�7枛枙晹敁搾拺憪悘帋崒寢妷増噯唴剝倎亐��黯趔耩铐祀觊桤鐖鍺珑玷栝殛觌腱祉眍铒镳瘃耱蝮篝趱貊鼢������€€亖倐儍剟厗唶噲垑墛妺媽實崓帋帍弿啇憫崘墤啋儞剼厸G殮殭櫂棖晹拺弽媺噭���镩爿匾唐粱侗��檿憤妴儉�耢桎噍谧砸形趟扇瞧拍拿脟聞�哪呐牌魄侨壬墒仕颂掏臀蜗舷勑捬乙矣釉哉种棕刭谮圹蹍躆圹圳谫儇刈鬃肿鬃刭谲萼忮桁雉�亜噵帓枤灒ō卜铰任在噫眢��倕垕帎摃棛洕灎、¥ゥ��ゥイい#ⅱ 牋煙灋潩潨湝洓泦殣檱槃�7枛枙晹敁搾拺憪悘帋崒寢妷増噯唴剝倎亐��黯趔耩铐祀觊桤鐖鍺珑玷栝殛觌腱祉眍铒镳瘃耱蝮篝趱貊鼢������€€亖倐儍剟厗唶噲垑墛妺媽實崓帋帍弿啇憫崘墤啋儞渵泒�|媩殅鷡莭貇魦欰櫃槜枙敀憦崑墕剚�蜢驵谠稳录栋�牄枓帀厒�痣遴茇孕褪桥吕拷蓟构阜穱�%贩犯腹购夯技浇究坷亮旅媚排破乔热缮适蕯�烫掏臀蜗闲醒乙覈�
乙蜒邢瓮吞耸蕝�;仕掏涎又佥徨觑酊€儑嫃摌潰К哺灸市纵潢聍䝼厛嫀悡晿殰潫牏¥ぅ垿ゥイぃ"ⅰ牋煙煘灊潉渼泩殠檯槃�9枛晻敂摀拻憪悘帋崒媼妷垏噯厔儌亖€��黪篑镱礻殓驽汊後噙哌呣N哌哙噌徕忏沅溴彐骁梃殚觋腚祆眄铒镳耱蝮趱鲻鼬����€€亖們儎剠唵噲垑墛妺媽實崕帋剰噽姂攼噾噿嫐A櫃槜枙敀憦崑墕剚�蜢驵谠稳录栋�牄枓帀厒�痣遴茇孕褪桥吕拷蓟构阜穱�%贩犯腹购夯技浇究坷亮旅媚排破乔热缮适蕯�烫掏臀蜗闲醒乙覈�
乙蜒邢瓮吞耸蕝�;仕掏涎又佥徨觑酊€儑嫃摌潰К哺灸市纵潢聍䝼厛嫀悡晿殰潫牏¥ぅ垿ゥイぃ"ⅰ牋煙煘灊潉渼泩殠檯槃�9枛晻敂摀拻憪悘帋崒媼妷垏噯厔儌亖€��黪篑镱礻殓驽汊後噙哌呣N哌哙噌徕忏沅溴彐骁梃殚觋腚祆眄铒镳耱蝮趱鲻鼬����€€亖們儎剠唵噲垑墛妺媽實崕帋剰噽姂攼噾噿嫐A櫃槜枙敀憦崑墕剚�蜢驵谠稳录栋�牄枓帀厒�痣遴茇孕褪桥吕拷蓟构阜穱�%贩犯腹购夯技浇究坷亮旅媚排破乔热缮适蕯�烫掏臀蜗闲醒乙覈�
乙蜒邢瓮吞耸蕝�;仕掏涎又佥徨觑酊€儑嫃摌潰К哺灸市纵潢聍䝼厛嫀悡晿殰潫牏¥ぅ垿ゥイぃ"ⅰ牋煙煘灊潉渼泩殠檯槃�9枛晻敂摀拻憪悘帋崒媼妷垏噯厔儌亖€��黪篑镱礻殓驽汊後噙哌呣N哌哙噌徕忏沅溴彐骁梃殚觋腚祆眄铒镳耱蝮趱鲻鼬����€€亖們儎剠唵噲垑墛妺媽實崕帋剰噽姂攼噾噿泘榼�|抾榼鰚蟷觺魤欴櫃槝棖晸拹弽妶唭€�痍爿仔拭椒鲍�殨悑唫�铉巅盅倘牧交付床隘����獎�(���鞍辈炒档斗腹购患浇究览谅旅哪排牌破暻热壬墒仕颂烫喭烫耸缮瞧拍寐晾烤絼�:浇究撩湃讼易坩骒篾€剦崚棞¨�估仆咱徼秭齺厛嫀憮枠殰灎、¥��ゥイぃ" 牋煙灋灊潉渽泹殘檮�=棗棖枙晹敁搾憫悘帋崒媻妷垏唴剝倐亐��鲷蝠铎觇驽�Line truncated
|
||||||
|
萼忮骅殛腱€慕淡�晬咘贳屠氮�晲帉崕憰殶ガ澈寥险坩骐痿�䜣亙剠唶墛媿彂摃棛湠。Ι�驳讣柯粕托宰圻沔觐蝣�€倓厙墛實彁憭敃枟槞殰潪煚、ぅΘ┆���渤吹斗腹箛�6垢贩荡潮��Д�潥槙拸媹厒�螂驵谡刑敲澜焊洞巢脖北膊吵嚧r巢爱�Г牆櫀拵媹厓倎亖儏墠挊灕�可臆骘鴢剤審挃棙櫄洓殭槜晸憥媹厑�礞哓咽木勾艾�ΕゥΘ�按坊棵忍性刿哜彗觎盹瘃蝮篌勽岓勽貂貊鲻咓咗咓€鲻鲺豸篌蝰痫铐礻殓驿汜咻圪渍友贤巳颇吕炯焊兜潮��┄Εぃ�煘潨湜殭槜枙敁拺悗崑妶唭価�礴彳盅饲驴己垢够韭峭蛰骛麅墢枩ⅸ�豪攀嫌宗
|
||||||
|
萼忮骅殛腱€慕淡�晬咘贳屠氮�晲帉崕憰殶ガ澈寥险坩骐痿�䜣亙剠唶墛媿彂摃棛湠。Ι�驳讣柯粕托宰圻沔觐蝣�€倓厙墛實彁憭敃枟槞殰潪煚、ぅΘ┆���渤吹斗腹箛�6垢贩荡潮��Д�潥槙拸媹厒�螂驵谡刑敲澜焊洞巢脖北膊吵嚧r巢爱�Г牆櫀拵媹厓倎亖儏墠挊灕�可臆骘鴢剤審挃棙櫄洓殭槜晸憥媹厑�礞哓咽木勾艾�ΕゥΘ�按坊棵忍性刿哜彗觎盹瘃蝮篌勽岓勽貂貊鲻咓咗咓€鲻鲺豸篌蝰痫铐礻殓驿汜咻圪渍友贤巳颇吕炯焊兜潮��┄Εぃ�煘潨湜殭槜枙敁拺悗崑妶唭価�礴彳盅饲驴己垢够韭峭蛰骛麅墢枩ⅸ�豪攀嫌宗
|
||||||
|
萼忮骅殛腱墋�瘆衺蕔檦�}瘆渱泒魛梁倡�搵凍缳丝椽�枓悘悞暀灓�缚仆在噫腽豇��亗儏唶垔媽帎挃枠殱煝ェ�俺逗嚼们释言剀咩珉铗鳅齹倓唶墜寧彂挀晼棛殯湞煚、%Η┆��辈吹斗购换冀絽�0浇技缓阜荡舶��ア煗殫攽崐噭侟鲳赇呲招倘怕拷缓父喎腹构労q垢范床���洏攽崑垎厖厗垕彅櫊М房梢坼铟€剤嫀憯枟櫃殮櫂棖敀弽妴儉�赉苷先陆复碍�èī��倒搅派脱召萼沔殡盹痱篌趑庻鲻鲼鼬�������弨€������鲺篁痤礻桄溻噍圪衷严褪绕昧考焊洞舶��éイⅰ牊灊湜殭槝棖晹搾憪弾寠垎剛��镩爿匾腿牧炯换季缕艘阝祧€唽挊煡�芳虑诵幼谳噔滏玷殛€梁倡�搵凍缳丝椽�枓悘悞暀灓�缚仆在噫腽豇��亗儏唶垔媽帎挃枠殱煝ェ�俺逗嚼们释言剀咩珉铗鳅齹倓唶墜寧彂挀晼棛殯湞煚、%Η┆��辈吹斗购换冀絽�0浇技缓阜荡舶��ア煗殫攽崐噭侟鲳赇呲招倘怕拷缓父喎腹构労q垢范床���洏攽崑垎厖厗垕彅櫊М房梢坼铟€剤嫀憯枟櫃殮櫂棖敀弽妴儉�赉苷先陆复碍�èī��倒搅派脱召萼沔殡盹痱篌趑庻鲻鲼鼬�������弨€������鲺篁痤礻桄溻噍圪衷严褪绕昧考焊洞舶��éイⅰ牊灊湜殭槝棖晹搾憪弾寠垎剛��镩爿匾腿牧炯换季缕艘阝祧€唽挊煡�芳虑诵幼谳噔滏玷殛€梁倡�搵凍缳丝椽�枓悘悞暀灓�缚仆在噫腽豇��亗儏唶垔媽帎挃枠殱煝ェ�俺逗嚼们释言剀咩珉铗鳅齹倓唶墜寧彂挀晼棛殯湞煚、%Η┆��辈吹斗购换冀絽�0浇技缓阜荡舶��ア煗殫攽崐噭侟鲳赇呲招倘怕拷缓父喎腹构労q垢范床���洏攽崑垎厖厗垕彅櫊М房梢坼铟€剤嫀憯枟櫃殮櫂棖敀弽妴儉�赉苷先陆复碍�èī��倒搅派脱召萼沔殡盹痱篌趑庻鲻鲼鼬�������弨€������鲺篁痤礻桄溻噍圪衷严褪绕昧考焊洞舶��éイⅰ牊灊湜殭槝棖晹搾憪弾寠垎剛��镩爿匾腿牧炯换季缕艘阝祧€唽挊煡�芳虑诵幼谳噔滏玷殛墋�瘆襼蓕檦衹弤衹泑泒魛痉皑牁憠侒渲示唱�様搾敄櫈)�侥艘剡尻雉�€亙剠噲墜寧彂摃棛湠。Ι�驳富玖湃宋艺佘噤珉矧鳅䜣倓唸墜崕悜摂枟槡洔灍牏¥Ηí��背吹�
|
||||||
|
腹患骄坷亮喡/亮揽窘缓付党爱�Г�湙枔弻墕儉�镩溥谥椅是琶量緡�揪靠劺r烤郊焊冻艾━�殩搻崑妷墛寧憱洝ǒ房妊垆眦䞍噴帎摃枠槞櫂棖晸悗媹厒�镨嶷油橇几幢����贝泛韭剖斡宗掎彗觎铕蝮趱貊鲻婘������€€亖倐儍剟剟厞唲厐剟儍倎亐���躞痤扉驿徇苜自严躺悄驴胶付床��éィⅰ煘潨洑殭槜棖晻敁拺悗崑墖厓€�痍暹僭鲜泼谰揪柯攀凶掮覃儔彆洝Л彻久忍性宗葸徙彐玷€痉皑牁憠侒渲示唱�様搾敄櫈)�侥艘剡尻雉�€亙剠噲墜寧彂摃棛湠。Ι�驳富玖湃宋艺佘噤珉矧鳅䜣倓唸墜崕悜摂枟槡洔灍牏¥Ηí��背吹�
|
||||||
|
腹患骄坷亮喡/亮揽窘缓付党爱�Г�湙枔弻墕儉�镩溥谥椅是琶量緡�揪靠劺r烤郊焊冻艾━�殩搻崑妷墛寧憱洝ǒ房妊垆眦䞍噴帎摃枠槞櫂棖晸悗媹厒�镨嶷油橇几幢����贝泛韭剖斡宗掎彗觎铕蝮趱貊鲻婘������€€亖倐儍剟剟厞唲厐剟儍倎亐���躞痤扉驿徇苜自严躺悄驴胶付床��éィⅰ煘潨洑殭槜棖晻敁拺悗崑墖厓€�痍暹僭鲜泼谰揪柯攀凶掮覃儔彆洝Л彻久忍性宗葸徙彐玷€痉皑牁憠侒渲示唱�様搾敄櫈)�侥艘剡尻雉�€亙剠噲墜寧彂摃棛湠。Ι�驳富玖湃宋艺佘噤珉矧鳅䜣倓唸墜崕悜摂枟槡洔灍牏¥Ηí��背吹�
|
||||||
|
腹患骄坷亮喡/亮揽窘缓付党爱�Г�湙枔弻墕儉�镩溥谥椅是琶量緡�揪靠劺r烤郊焊冻艾━�殩搻崑妷墛寧憱洝ǒ房妊垆眦䞍噴帎摃枠槞櫂棖晸悗媹厒�镨嶷油橇几幢����贝泛韭剖斡宗掎彗觎铕蝮趱貊鲻婘������€€亖倐儍剟剟厞唲厐剟儍倎亐���躞痤扉驿徇苜自严躺悄驴胶付床��éィⅰ煘潨洑殭槜棖晻敁拺悗崑墖厓€�痍暹僭鲜泼谰揪柯攀凶掮覃儔彆洝Л彻久忍性宗葸徙彐玷墋�皚詞蓕梸莭�苶殀殅魛淮�灃巻�嵩冉唱�櫀晻棛潰Л春辽兄葶轭篪鼆們厗垑妼崗憭敄槢潬ⅴí�扯菇烂粕绦又谳徜桦矬鳅䜣倓唸墜崗悞摃棙殯湠煛ⅲウī��辈炊饭杭 骄懒旅呐艊�0拍寐晾窘还返潮�│!灈槙憥媹厒��铋溥圩有退汕颇膮�哪排吰o排穆谰脊冻�В牅槙拹帊崓彂敇潰┌防妊阢祯齻唺崘挃枟棙槜枙搼弽妵剙�戾挢阉评几幢���俺蹈伎们绦载苓沔殡铕耋趱鲼鲊鴦����䜣€亖們儎厖唶噲墘妸妺媼寣€媼妸墘垏唴剝倎€��赳铍桢膺苜钟形巳怕澜焊党悲�┃イⅰ牉潨洑殭槝棖枙敁拺悘崒妶唭価黢腈嘹招饲穆览缆派卧坫祧€唻憲潱┋岛磕赏性宗苻噔沅鍊淮�灃巻�嵩冉唱�櫀晻棛潰Л春辽兄葶轭篪鼆們厗垑妼崗憭敄槢潬ⅴí�扯菇烂粕绦又谳徜桦矬鳅䜣倓唸墜崗悞摃棙殯湠煛ⅲウī��辈炊饭杭 骄懒旅呐艊�0拍寐晾窘还返潮�│!灈槙憥媹厒��铋溥圩有退汕颇膮�哪排吰o排穆谰脊冻�В牅槙拹帊崓彂敇潰┌防妊阢祯齻唺崘挃枟棙槜枙搼弽妵剙�戾挢阉评几幢���俺蹈伎们绦载苓沔殡铕耋趱鲼鲊鴦����䜣€亖們儎厖唶噲墘妸妺媼寣€媼妸墘垏唴剝倎€��赳铍桢膺苜钟形巳怕澜焊党悲�┃イⅰ牉潨洑殭槝棖枙敁拺悘崒妶唭価黢腈嘹招饲穆览缆派卧坫祧€唻憲潱┋岛磕赏性宗苻噔沅鍊淮�灃巻�嵩冉唱�櫀晻棛潰Л春辽兄葶轭篪鼆們厗垑妼崗憭敄槢潬ⅴí�扯菇烂粕绦又谳徜桦矬鳅䜣倓唸墜崗悞摃棙殯湠煛ⅲウī��辈炊饭杭 骄懒旅呐艊�0拍寐晾窘还返潮�│!灈槙憥媹厒��铋溥圩有退汕颇膮�哪排吰o排穆谰脊冻�В牅槙拹帊崓彂敇潰┌防妊阢祯齻唺崘挃枟棙槜枙搼弽妵剙�戾挢阉评几幢���俺蹈伎们绦载苓沔殡铕耋趱鲼鲊鴦����䜣€亖們儎厖唶噲墘妸妺媼寣€媼妸墘垏唴剝倎€��赳铍桢膺苜钟形巳怕澜焊党悲�┃イⅰ牉潨洑殭槝棖枙敁拺悘崒妶唭価黢腈嘹招饲穆览缆派卧坫祧€唻憲潱┋岛磕赏性宗苻噔沅鍒}�皚諂蓕梸羮眫羮檤殅魛副�洆寗�抟苹勃�洏槝殱ˇ�缚仆咱徼眢�€倓唶墛實彁挃枠殰煛ぇ┈�蹈痪僚人窝载坜忮桁矬鼹䜣倓唸妺崗憭敄棛殰灍、ぅЖ��辈炊饭患究� 履牌侨墒蕟�0噬惹婆寐谰己傅嘲�ē 潥枔悕妵剚�箢殄噍僦友贤趟囀x怂烫掏吞趟噬桥驴脊当�Β灈棔搾憫挃棜煠�咐妊兮媵鼈厜審憮晼枟棖晹拹帇垍傼�赉苤惺爬几党卑鞍辈捶航僚赏颜佥噤珀祜耋赧鼢��咜#�����€€亗們剠唶垐墛媽崓帍彁憫拻拫搥拻憫悙弾崒媻増唴剛���鲶镬殒膺苜找咸善美胶傅嘲��Δ!牊潨湜殭櫂棗枙晹搾憪帉媹唲価�戽噗招倘琶侣门忍沿哞覃倛帞殸カ倍焕派托灾氽葸噔銆副�洆寗�抟苹勃�洏槝殱ˇ�缚仆咱徼眢�€倓唶墛實彁挃枠殰煛ぇ┈�蹈痪僚人窝载坜忮桁矬鼹䜣倓唸妺崗憭敄棛殰灍、ぅЖ��辈炊饭患究� 履牌侨墒蕟�0噬惹婆寐谰己傅嘲�ē 潥枔悕妵剚�箢殄噍僦友贤趟囀x怂烫掏吞趟噬桥驴脊当�Β灈棔搾憫挃棜煠�咐妊兮媵鼈厜審憮晼枟棖晹拹帇垍傼�赉苤惺爬几党卑鞍辈捶航僚赏颜佥噤珀祜耋赧鼢��咜#�����€€亗們剠唶垐墛媽崓帍彁憫拻拫搥拻憫悙弾崒媻増唴剛���鲶镬殒膺苜找咸善美胶傅嘲��Δ!牊潨湜殭櫂棗枙晹搾憪帉媹唲価�戽噗招倘琶侣门忍沿哞覃倛帞殸カ倍焕派托灾氽葸噔銆副�洆寗�抟苹勃�洏槝殱ˇ�缚仆咱徼眢�€倓唶墛實彁挃枠殰煛ぇ┈�蹈痪僚人窝载坜忮桁矬鼹䜣倓唸妺崗憭敄棛殰灍、ぅЖ��辈炊饭患究� 履牌侨墒蕟�0噬惹婆寐谰己傅嘲�ē 潥枔悕妵剚�箢殄噍僦友贤趟囀x怂烫掏吞趟噬桥驴脊当�Β灈棔搾憫挃棜煠�咐妊兮媵鼈厜審憮晼枟棖晹拹帇垍傼�赉苤惺爬几党卑鞍辈捶航僚赏颜佥噤珀祜耋赧鼢��咜#�����€€亗們剠唶垐墛媽崓帍彁憫拻拫搥拻憫悙弾崒媻増唴剛���鲶镬殒膺苜找咸善美胶傅嘲��Δ!牊潨湜殭櫂棗枙晹搾憪帉媹唲価�戽噗招倘琶侣门忍沿哞覃倛帞殸カ倍焕派托灾氽葸噔銏}爘皚讆葈杶緘箏緘檤檥魛串�槕墏鏖芟暮豹�湚殯潬オ�济室龠骒蝼鼆倓唸妺崗悞敄槡湠。Θ�贝泛嚼闷释杏仲茑沔轫痿鼹䜩倓唸妺崗憮敄槡洕煚ⅳェ┇�安车饭患纠旅徘仁颂臀舷喰1舷瓮淌汕琶量交傅嘲�ē�湗晵弻墕剚�箢赕氵苴刂杂覈褉乙佑釉佑右严嗡善每几窗��潥槚晻枟櫇ˇ�估刃籴牝麃厛嫀悞敃晼晻敀憦寠噭侟躅玑谠紊睦脊洞巢渤炊够柯剖我众葆彖腠痱趱鼬�������"�€€亗們剠唶垑妺實帍憭挀敃枟棙櫃殮殘泙殮殭櫂棖晹搾憪弽寠墖唲倎�黥痨殄廪谧孕蜕泼澜悍挡碍�Дあ�灊湜殮櫃槜棖晻敁拹弽媺噭侢�戽噗昭躺颇哪徘讼哲沆��厞悥湣Л卜剂派托又刳茌哙€串�槕墏鏖芟暮豹�湚殯潬オ�济室龠骒蝼鼆倓唸妺崗悞敄槡湠。Θ�贝泛嚼闷释杏仲茑沔轫痿鼹䜩倓唸妺崗憮敄槡洕煚ⅳェ┇�安车饭患纠旅徘仁颂臀舷喰1舷瓮淌汕琶量交傅嘲�ē�湗晵弻墕剚�箢赕氵苴刂杂覈褉乙佑釉佑右严嗡善每几窗��潥槚晻枟櫇ˇ�估刃籴牝麃厛嫀悞敃晼晻敀憦寠噭侟躅玑谠紊睦脊洞巢渤炊够柯剖我众葆彖腠痱趱鼬�������"�€€亗們剠唶垑妺實帍憭挀敃枟棙櫃殮殘泙殮殭櫂棖晹搾憪弽寠墖唲倎�黥痨殄廪谧孕蜕泼澜悍挡碍�Дあ�灊湜殮櫃槜棖晻敁拹弽媺噭侢�戽噗昭躺颇哪徘讼哲沆��厞悥湣Л卜剂派托又刳茌哙€串�槕墏鏖芟暮豹�湚殯潬オ�济室龠骒蝼鼆倓唸妺崗悞敄槡湠。Θ�贝泛嚼闷释杏仲茑沔轫痿鼹䜩倓唸妺崗憮敄槡洕煚ⅳェ┇�安车饭患纠旅徘仁颂臀舷喰1舷瓮淌汕琶量交傅嘲�ē�湗晵弻墕剚�箢赕氵苴刂杂覈褉乙佑釉佑右严嗡善每几窗��潥槚晻枟櫇ˇ�估刃籴牝麃厛嫀悞敃晼晻敀憦寠噭侟躅玑谠紊睦脊洞巢渤炊够柯剖我众葆彖腠痱趱鼬�������"�€€亗們剠唶垑妺實帍憭挀敃枟棙櫃殮殘泙殮殭櫂棖晹搾憪弽寠墖唲倎�黥痨殄廪谧孕蜕泼澜悍挡碍�Дあ�灊湜殮櫃槜棖晻敁拹弽媺噭侢�戽噗昭躺颇哪徘讼哲沆��厞悥湣Л卜剂派托又刳茌哙坿焲皚賬莭杶簘羱粆檤榼魛豹�枎噣箦偻鹿豹�潨湠牑ō澈寥现蒌牮鳇€儏噳媽帎挀晽櫅灎ⅴí�扯辜柯派滔艺刿掎溏觐耵�䜩倓唸妼崗憮晽槡湠牏%З��泊陡杭纠履迫仕�闲岩釉諉�2照杂倚贤松桥吕交傅嘲�Г�殫攽帇墕Line truncated
|
||||||
|
#ぅΗ┆�弽寘�.實彃暀潰ó到磐奏牾€厠憲潱ó春琅氏再葆滂觏锺篝鯈�;鼬���亗剢垔崘摉殲ⅵ�岛琅艘剡屐篾亜垕彄枤潬ぇ��炊负唤究縿纮靠窘缓付床�│ 潤晵帄唭�镨噘姨趴勾��洍攼崐噮儊��篑镯祀觊桤珂邋滗沣忉噢蒇僮匝嗡敲炕侗��棏寚傷蜷嶷晕赡辆己垢父购杭骄坷谅媚€魄壬送弦肇茑尻瘀鼇厜崙暀潯ォ�锤痪屡人涡又佘嚆骊铗鼽€儐墝彃枤灑Κ�咕蒙卧卩骒蝤�倖墝彃晿洕牐ェ┇�氨渤创档荡闯巢悲��Δ�湙枔悕5妴傼鲲邕紫强赴�檼媱�阖兔翰�湕憤垊価黧镫桢汜咻苒谫賶貐�!谮谫儋刈终砸严褪扰美胶反帛�┃イ��
|
||||||
|
#ぅΗ┆�弽寘�.實彃暀潰ó到磐奏牾€厠憲潱ó春琅氏再葆滂觏锺篝鯈�;鼬���亗剢垔崘摉殲ⅵ�岛琅艘剡屐篾亜垕彄枤潬ぇ��炊负唤究縿纮靠窘缓付床�│ 潤晵帄唭�镨噘姨趴勾��洍攼崐噮儊��篑镯祀觊桤珂邋滗沣忉噢蒇僮匝嗡敲炕侗��棏寚傷蜷嶷晕赡辆己垢父购杭骄坷谅媚€魄壬送弦肇茑尻瘀鼇厜崙暀潯ォ�锤痪屡人涡又佘嚆骊铗鼽€儐墝彃枤灑Κ�咕蒙卧卩骒蝤�倖墝彃晿洕牐ェ┇�氨渤创档荡闯巢悲��Δ�湙枔悕5妴傼鲲邕紫强赴�檼媱�阖兔翰�湕憤垊価黧镫桢汜咻苒谫賶貐�!谮谫儋刈终砸严褪扰美胶反帛�┃イ��
|
||||||
|
#ぅΗ┆�殅瘇�祤�眫畗��硛�憕蛚�悘巹�.帍悡暀潯Л郴滤赞栩齽姁枩)岸悸晌在咪桧耵鼹�€€墎唨9亖們剠唸妼帒敆洖ⅵ�春颗搜邹屐篾€剤審摋殲ˉǐ�扯负季懒旅喣€寐量炯焊党碍� 湙晳崏厑�戾葜仙录繁��殩拸寠噮儊��黪篁耧镱盱祀腚觋殍珂邃忉哕谧有倘目旱矮�殨強厐黝孢匾腿牧炯缓汗汉患骄坷谅门苀巧侍窝宰圻潢秭鼈厜崚枤煟К按讣棵剖托又佘哜彖腼篦麁倕垔帒敇湢え�痘榔搜纵汩秕鼇剣嫀憯棜潬&í�辈吹犯构喓E垢范党卑�┃ぁ灈槙憥妵凗鲱孓滞沤淡�晭噣箸坌偶唱�枑媷凗�铌驺徇蒇谫賲�儋谮圮蒉哙後忏銋�'汊徉捃谪钟型是美胶反悲�┄ЁΖΗЖ┆��悘巹�.帍悡暀潯Л郴滤赞栩齽姁枩)岸悸晌在咪桧耵鼹�€€墎唨9亖們剠唸妼帒敆洖ⅵ�春颗搜邹屐篾€剤審摋殲ˉǐ�扯负季懒旅喣€寐量炯焊党碍� 湙晳崏厑�戾葜仙录繁��殩拸寠噮儊��黪篁耧镱盱祀腚觋殍珂邃忉哕谧有倘目旱矮�殨強厐黝孢匾腿牧炯缓汗汉患骄坷谅门苀巧侍窝宰圻潢秭鼈厜崚枤煟К按讣棵剖托又佘哜彖腼篦麁倕垔帒敇湢え�痘榔搜纵汩秕鼇剣嫀憯棜潬&í�辈吹犯构喓E垢范党卑�┃ぁ灈槙憥妵凗鲱孓滞沤淡�晭噣箸坌偶唱�枑媷凗�铌驺徇蒇谫賲�儋谮圮蒉哙後忏銋�'汊徉捃谪钟型是美胶反悲�┄ЁΖΗЖ┆��悘巹�.帍悡暀潯Л郴滤赞栩齽姁枩)岸悸晌在咪桧耵鼹�€€墎唨9亖們剠唸妼帒敆洖ⅵ�春颗搜邹屐篾€剤審摋殲ˉǐ�扯负季懒旅喣€寐量炯焊党碍� 湙晳崏厑�戾葜仙录繁��殩拸寠噮儊��黪篁耧镱盱祀腚觋殍珂邃忉哕谧有倘目旱矮�殨強厐黝孢匾腿牧炯缓汗汉患骄坷谅门苀巧侍窝宰圻潢秭鼈厜崚枤煟К按讣棵剖托又佘哜彖腼篦麁倕垔帒敇湢え�痘榔搜纵汩秕鼇剣嫀憯棜潬&í�辈吹犯构喓E垢范党卑�┃ぁ灈槙憥妵凗鲱孓滞沤淡�晭噣箸坌偶唱�枑媷凗�铌驺徇蒇谫賲�儋谮圮蒉哙後忏銋�'汊徉捃谪钟型是美胶反悲�┄ЁΖΗЖ┆�畾}檦�穩�眫瑌��秬�弤蝳�憪厪-悜摉櫆ˇ�咐妊阱嵇儔彆湥┌肪潘邑咤牮貔䜩倓厗噲垉噰�7噰垑媽帎摃槢煟Й�箍氖凶蒌腧鶂剤審摋洖ⅴ┈�蹈杭苛履牌菂葊乔婆昧谰还冻碍��湗攼寛剙�獒谟唐抗串─牅様憥媺噮儊€��黯豸篌蝌耨耩痫镱盱觊珏忄葙忠紊目旱��檽巿凗蹯漭籽倘穆烤技换技骄坷谅媚艀侨侍窝宰圻溟秭鼈唺帓棞牓�撤焕那讼艺佘哜彖腩聃�€倕噴崘摉殲ⅵ�垂久任在噫祢鶂儐墠悡棜潬&ǐ�泊陡夯冀究坷览靠揪交焊返嘲�│ 湙�0拵媷凗蹴遘运潞博�憡凐脒尤敬�湑強厑�镪驺噍圳儇勛刎仝圮捱徕滏玳觎眍镳咇痫铎觇邂哕卦淹膳戮桓党爱�珔����憪厪-悜摉櫆ˇ�咐妊阱嵇儔彆湥┌肪潘邑咤牮貔䜩倓厗噲垉噰�7噰垑媽帎摃槢煟Й�箍氖凶蒌腧鶂剤審摋洖ⅴ┈�蹈杭苛履牌菂葊乔婆昧谰还冻碍��湗攼寛剙�獒谟唐抗串─牅様憥媺噮儊€��黯豸篌蝌耨耩痫镱盱觊珏忄葙忠紊目旱��檽巿凗蹯漭籽倘穆烤技换技骄坷谅媚艀侨侍窝宰圻溟秭鼈唺帓棞牓�撤焕那讼艺佘哜彖腩聃�€倕噴崘摉殲ⅵ�垂久任在噫祢鶂儐墠悡棜潬&ǐ�泊陡夯冀究坷览靠揪交焊返嘲�│ 湙�0拵媷凗蹴遘运潞博�憡凐脒尤敬�湑強厑�镪驺噍圳儇勛刎仝圮捱徕滏玳觎眍镳咇痫铎觇邂哕卦淹膳戮桓党爱�珔����憪厪-悜摉櫆ˇ�咐妊阱嵇儔彆湥┌肪潘邑咤牮貔䜩倓厗噲垉噰�7噰垑媽帎摃槢煟Й�箍氖凶蒌腧鶂剤審摋洖ⅴ┈�蹈杭苛履牌菂葊乔婆昧谰还冻碍��湗攼寛剙�獒谟唐抗串─牅様憥媺噮儊€��黯豸篌蝌耨耩痫镱盱觊珏忄葙忠紊目旱��檽巿凗蹯漭籽倘穆烤技换技骄坷谅媚艀侨侍窝宰圻溟秭鼈唺帓棞牓�撤焕那讼艺佘哜彖腩聃�€倕噴崘摉殲ⅵ�垂久任在噫祢鶂儐墠悡棜潬&ǐ�泊陡夯冀究坷览靠揪交焊返嘲�│ 湙�0拵媷凗蹴遘运潞博�憡凐脒尤敬�湑強厑�镪驺噍圳儇勛刎仝圮捱徕滏玳觎眍镳咇痫铎觇邂哕卦淹膳戮桓党爱�珔���畽}晘�箑�瘇珆��箑�弤蝳�5拻憫悜憭敄櫆牓�督盼揍祺亣帞洟┌缚莆哲汴瘅鼇儐垔媿帍弲怐弿帋崓寣寢媼寣崕彂摃棜潬'�垂灸市周汴聩€剣嫃摋洖ⅵ┉俺豆季烂钠壬仕藙�>耸扇桥昧考悍幢�Β灈棐帄唫�礤葜先录栋��殩搻崑垏厓倎€���鶇�0鼢黯鲺趔蝠铎赙溧葚韵逝篮弹�潣拲噧�脘葑彝善昧揽劸p坷懒旅钠侨侍窝宰圻溟秭齻唺彄槤ⅶ�痘磕忍言剀哜彖腩耵��亙厙妼彃暀湢ぉ�痘榔搜纵汩瘀齺厛嫃挅櫆煝エ�背蹈杭娇懒妹膮臸哪寐揽郊悍党碍�ぁ潥枓帄唫�脞谘瓤樊�晬嘅疸姿蓝�潠悐厐�龛溧蒇儇字种棕仝圯捺怃骈腠痱赧���唨���箴扈溧圩游势驴桓冻卑�叚��5拻憫悜憭敄櫆牓�督盼揍祺亣帞洟┌缚莆哲汴瘅鼇儐垔媿帍弲怐弿帋崓寣寢媼寣崕彂摃棜潬'�垂灸市周汴聩€剣嫃摋洖ⅵ┉俺豆季烂钠壬仕藙�>耸扇桥昧考悍幢�Β灈棐帄唫�礤葜先录栋��殩搻崑垏厓倎€���鶇�0鼢黯鲺趔蝠铎赙溧葚韵逝篮弹�潣拲噧�脘葑彝善昧揽劸p坷懒旅钠侨侍窝宰圻溟秭齻唺彄槤ⅶ�痘磕忍言剀哜彖腩耵��亙厙妼彃暀湢ぉ�痘榔搜纵汩瘀齺厛嫃挅櫆煝エ�背蹈杭娇懒妹膮臸哪寐揽郊悍党碍�ぁ潥枓帄唫�脞谘瓤樊�晬嘅疸姿蓝�潠悐厐�龛溧蒇儇字种棕仝圯捺怃骈腠痱赧���唨���箴扈溧圩游势驴桓冻卑�叚��5拻憫悜憭敄櫆牓�督盼揍祺亣帞洟┌缚莆哲汴瘅鼇儐垔媿帍弲怐弿帋崓寣寢媼寣崕彂摃棜潬'�垂灸市周汴聩€剣嫃摋洖ⅵ┉俺豆季烂钠壬仕藙�>耸扇桥昧考悍幢�Β灈棐帄唫�礤葜先录栋��殩搻崑垏厓倎€���鶇�0鼢黯鲺趔蝠铎赙溧葚韵逝篮弹�潣拲噧�脘葑彝善昧揽劸p坷懒旅钠侨侍窝宰圻溟秭齻唺彄槤ⅶ�痘磕忍言剀哜彖腩耵��亙厙妼彃暀湢ぉ�痘榔搜纵汩瘀齺厛嫃挅櫆煝エ�背蹈杭娇懒妹膮臸哪寐揽郊悍党碍�ぁ潥枓帄唫�脞谘瓤樊�晬嘅疸姿蓝�潠悐厐�龛溧蒇儇字种棕仝圯捺怃骈腠痱赧���唨���箴扈溧圩游势驴桓冻卑�叚�瘶}搤�簚�畘﹠爚�粈�弤�唦��5摀拻挀摃棛湡(�宦嗽掼��厡挋〃案壳献哏铞齻厛媿彂摃枟梽�
|
||||||
|
棗枛晹摀拻剳v拻摂枟櫆灐え�垂久上哲忾瘌�儑嫃摋殲ⅵ┉按泛娇履迫仕臀舷行邢衔吞嗜悄吕胶反碍━�檿憤垊€�栳僖四靖箔à煕様憦寠垏厔儌亖€€��€����趄镬桎嘬滓糖粱弹�潡拰噦�脘挢酉松颇寐铝侣旅呐魄壬送弦载坂潢瘀齻唻彅櫈ぉ�咕萌鸵众掴骈祓篥��亗剢垔崗挄槣煟Й按咕蒙卧卩�!眢鷢儑妿憯槢灑エ�背陡唤苛履徘热蓞蔄扇绕拍吕炯悍床�ē�殩拵妴侞蜷嘧闻汲�檻墏鲨巯墓哀灄悐厑�扃氵苴賲�刭圮捺沐桦眇篦�€亗剠唶垎�垏唴儊��耢玑茏椅膳辆焊荡脖皠瘋�5摀拻挀摃棛湡(�宦嗽掼��厡挋〃案壳献哏铞齻厛媿彂摃枟梽�
|
||||||
|
棗枛晹摀拻剳v拻摂枟櫆灐え�垂久上哲忾瘌�儑嫃摋殲ⅵ┉按泛娇履迫仕臀舷行邢衔吞嗜悄吕胶反碍━�檿憤垊€�栳僖四靖箔à煕様憦寠垏厔儌亖€€��€����趄镬桎嘬滓糖粱弹�潡拰噦�脘挢酉松颇寐铝侣旅呐魄壬送弦载坂潢瘀齻唻彅櫈ぉ�咕萌鸵众掴骈祓篥��亗剢垔崗挄槣煟Й按咕蒙卧卩�!眢鷢儑妿憯槢灑エ�背陡唤苛履徘热蓞蔄扇绕拍吕炯悍床�ē�殩拵妴侞蜷嘧闻汲�檻墏鲨巯墓哀灄悐厑�扃氵苴賲�刭圮捺沐桦眇篦�€亗剠唶垎�垏唴儊��耢玑茏椅膳辆焊荡脖皠瘋�5摀拻挀摃棛湡(�宦嗽掼��厡挋〃案壳献哏铞齻厛媿彂摃枟梽�
|
||||||
|
棗枛晹摀拻剳v拻摂枟櫆灐え�垂久上哲忾瘌�儑嫃摋殲ⅵ┉按泛娇履迫仕臀舷行邢衔吞嗜悄吕胶反碍━�檿憤垊€�栳僖四靖箔à煕様憦寠垏厔儌亖€€��€����趄镬桎嘬滓糖粱弹�潡拰噦�脘挢酉松颇寐铝侣旅呐魄壬送弦载坂潢瘀齻唻彅櫈ぉ�咕萌鸵众掴骈祓篥��亗剢垔崗挄槣煟Й按咕蒙卧卩�!眢鷢儑妿憯槢灑エ�背陡唤苛履徘热蓞蔄扇绕拍吕炯悍床�ē�殩拵妴侞蜷嘧闻汲�檻墏鲨巯墓哀灄悐厑�扃氵苴賲�刭圮捺沐桦眇篦�€亗剠唶垎�垏唴儊��耢玑茏椅膳辆焊荡脖皠瘋皹}憕�粈�珇�瀪�線�巭瀩攡渳鬌敂敁敂晽櫆煟К哺廊汹滹鷥姁槦Н房刃籴牝鷣厛審挄棜湞灍牋 牋煘潨湜殭槝剹5槝櫅湠牐Ι�倒久任咱徼秭䞍唺帓枤灑Ι�捶痪烂迫侍拖醒覅�>已邢吞嗜琶澜悍嘲��湗搹媶傸綮滠瘴抢捍�ァ潤枔悗寠垏唴剟儍儌倐寖*倎亐��耥殇呲韵擅级蔼�槖崌凖蹴驵壑蚁淌惹吰€乔壬仕拖延仲葆骐聍䞍噷悤洜Λ狈悸韧易茚彘眈赭�€們厗垔寧悡晿洘ⅵ�撤剂翘邑掬犟齄倕墝悡棜灐ぇ�俺豆痪缆钠巧仕掏挝蜗挝瓮趟嗜桥美净箄冻艾━�殩拲墔€�孳邮粮�潟崊�嵩冉唱�拰唫�铊溧蒇谫刎仝圮捺沔桁矧鳅齹倓唸妼崗悜挀摂敁搾憦帉墖剛�蜢驵谡兴敲考狗荡膊劚D敂敁敂晽櫆煟К哺廊汹滹鷥姁槦Н房刃籴牝鷣厛審挄棜湞灍牋 牋煘潨湜殭槝剹5槝櫅湠牐Ι�倒久任咱徼秭䞍唺帓枤灑Ι�捶痪烂迫侍拖醒覅�>已邢吞嗜琶澜悍嘲��湗搹媶傸綮滠瘴抢捍�ァ潤枔悗寠垏唴剟儍儌倐寖*倎亐��耥殇呲韵擅级蔼�槖崌凖蹴驵壑蚁淌惹吰€乔壬仕拖延仲葆骐聍䞍噷悤洜Λ狈悸韧易茚彘眈赭�€們厗垔寧悡晿洘ⅵ�撤剂翘邑掬犟齄倕墝悡棜灐ぇ�俺豆痪缆钠巧仕掏挝蜗挝瓮趟嗜桥美净箄冻艾━�殩拲墔€�孳邮粮�潟崊�嵩冉唱�拰唫�铊溧蒇谫刎仝圮捺沔桁矧鳅齹倓唸妼崗悜挀摂敁搾憦帉墖剛�蜢驵谡兴敲考狗荡膊劚D敂敁敂晽櫆煟К哺廊汹滹鷥姁槦Н房刃籴牝鷣厛審挄棜湞灍牋 牋煘潨湜殭槝剹5槝櫅湠牐Ι�倒久任咱徼秭䞍唺帓枤灑Ι�捶痪烂迫侍拖醒覅�>已邢吞嗜琶澜悍嘲��湗搹媶傸綮滠瘴抢捍�ァ潤枔悗寠垏唴剟儍儌倐寖*倎亐��耥殇呲韵擅级蔼�槖崌凖蹴驵壑蚁淌惹吰€乔壬仕拖延仲葆骐聍䞍噷悤洜Λ狈悸韧易茚彘眈赭�€們厗垔寧悡晿洘ⅵ�撤剂翘邑掬犟齄倕墝悡棜灐ぇ�俺豆痪缆钠巧仕掏挝蜗挝瓮趟嗜桥美净箄冻艾━�殩拲墔€�孳邮粮�潟崊�嵩冉唱�拰唫�铊溧蒇谫刎仝圮捺沔桁矧鳅齹倓唸妼崗悜挀摂敁搾憦帉墖剛�蜢驵谡兴敲考狗荡膊劚梷悀�紑�檦�泘�纮�巭泒泘榼魠旲枟櫆灑Λ岸侥椭嚯鰜噹暆キ毒切巽祯䞍垖悡棜潬ⅳΗī�┅èЕぃⅰ牊灋劃4灍牎%ǐ�岛久任在噻铛齻唺帓枤灑ォ�锤痪聊巧送涎以照呏7赵右严退绕美胶恫�Б灇枒崍剙黠邕仔陕级鲍Б灈棓拸崒妷垏噳唭噰�,噰唴剝���箢殂挢阉啪副�灆搸墑€�赇咣自严瓮虅薽掏蜗幸又刿咩珥蝙€剤崙棞ⅶ�豪铺易葩珈瘐�€亙厗垑媽帎挃棛湡ⅵ┉捕焕攀姓垅桀觖亜垕彃枡潬'�俺豆痪烂徘墒掏闲岩覄觓乙研衔趟汕穆拷悍嘲�ァ潤晳寛凗蹯赓掀酱�檻墎翮偻路�湑弶���扃汜掭苘茌捺怃骈眇豇鼆倓噳嫀悞敄槡湞瀰�!灊洑棔拸寜唫�痖廛盅糖每己付闯巢矃旲枟櫆灑Λ岸侥椭嚯鰜噹暆キ毒切巽祯䞍垖悡棜潬ⅳΗī�┅èЕぃⅰ牊灋劃4灍牎%ǐ�岛久任在噻铛齻唺帓枤灑ォ�锤痪聊巧送涎以照呏7赵右严退绕美胶恫�Б灇枒崍剙黠邕仔陕级鲍Б灈棓拸崒妷垏噳唭噰�,噰唴剝���箢殂挢阉啪副�灆搸墑€�赇咣自严瓮虅薽掏蜗幸又刿咩珥蝙€剤崙棞ⅶ�豪铺易葩珈瘐�€亙厗垑媽帎挃棛湡ⅵ┉捕焕攀姓垅桀觖亜垕彃枡潬'�俺豆痪烂徘墒掏闲岩覄觓乙研衔趟汕穆拷悍嘲�ァ潤晳寛凗蹯赓掀酱�檻墎翮偻路�湑弶���扃汜掭苘茌捺怃骈眇豇鼆倓噳嫀悞敄槡湞瀰�!灊洑棔拸寜唫�痖廛盅糖每己付闯巢矃旲枟櫆灑Λ岸侥椭嚯鰜噹暆キ毒切巽祯䞍垖悡棜潬ⅳΗī�┅èЕぃⅰ牊灋劃4灍牎%ǐ�岛久任在噻铛齻唺帓枤灑ォ�锤痪聊巧送涎以照呏7赵右严退绕美胶恫�Б灇枒崍剙黠邕仔陕级鲍Б灈棓拸崒妷垏噳唭噰�,噰唴剝���箢殂挢阉啪副�灆搸墑€�赇咣自严瓮虅薽掏蜗幸又刿咩珥蝙€剤崙棞ⅶ�豪铺易葩珈瘐�€亙厗垑媽帎挃棛湡ⅵ┉捕焕攀姓垅桀觖亜垕彃枡潬'�俺豆痪烂徘墒掏闲岩覄觓乙研衔趟汕穆拷悍嘲�ァ潤晳寛凗蹯赓掀酱�檻墎翮偻路�湑弶���扃汜掭苘茌捺怃骈眇豇鼆倓噳嫀悞敄槡湞瀰�!灊洑棔拸寜唫�痖廛盅糖每己付闯巢矕}悀�線�榽�檦�聙�崀榼�晑魟�0棙櫅灐ォ�毫梢苕颀厡摏+唇菩巽眵€厞彄棝煟Ι��矂矰脖悲��┃Εい#¥ぅЗ�俺坊磕晌再噫眙鼇厜崙暀潯ォ�锤痪履鞘滔岩灾棕嗁5刈终砸形松泼兰沟杯━�槗強唩�赈谝四靖箔à牅櫀搼弽寢妶�妸媼寣寚�+寣媻墖厓侢�铊廛瘴攘撼�牃晲媶傸躏赍彷谪衷訁襩佑罩刳苓怄觑觞亝墡摌灒�督檬兄葶桀篪齹倓唸墜崕悜摃枡洕牐Ι�岛久任淤咤祢鶂儑妿憰槣煝Ι�扯够玖门鞘送闲矣哉种勛€种赵右形褪绕美胶烦艾ē牅様弸唫�柁账鹿�灂崊�嘤羌博�拰噧�耥殒溷忖忏彗殪矧鳅䜩儐墜帒摉櫆灐%З����┃あ煖様悓垊€�赉苤兴敲�己付荡硠�0棙櫅灐ォ�毫梢苕颀厡摏+唇菩巽眵€厞彄棝煟Ι��矂矰脖悲��┃Εい#¥ぅЗ�俺坊磕晌再噫眙鼇厜崙暀潯ォ�锤痪履鞘滔岩灾棕嗁5刈终砸形松泼兰沟杯━�槗強唩�赈谝四靖箔à牅櫀搼弽寢妶�妸媼寣寚�+寣媻墖厓侢�铊廛瘴攘撼�牃晲媶傸躏赍彷谪衷訁襩佑罩刳苓怄觑觞亝墡摌灒�督檬兄葶桀篪齹倓唸墜崕悜摃枡洕牐Ι�岛久任淤咤祢鶂儑妿憰槣煝Ι�扯够玖门鞘送闲矣哉种勛€种赵右形褪绕美胶烦艾ē牅様弸唫�柁账鹿�灂崊�嘤羌博�拰噧�耥殒溷忖忏彗殪矧鳅䜩儐墜帒摉櫆灐%З����┃あ煖様悓垊€�赉苤兴敲�己付荡硠�0棙櫅灐ォ�毫梢苕颀厡摏+唇菩巽眵€厞彄棝煟Ι��矂矰脖悲��┃Εい#¥ぅЗ�俺坊磕晌再噫眙鼇厜崙暀潯ォ�锤痪履鞘滔岩灾棕嗁5刈终砸形松泼兰沟杯━�槗強唩�赈谝四靖箔à牅櫀搼弽寢妶�妸媼寣寚�+寣媻墖厓侢�铊廛瘴攘撼�牃晲媶傸躏赍彷谪衷訁襩佑罩刳苓怄觑觞亝墡摌灒�督檬兄葶桀篪齹倓唸墜崕悜摃枡洕牐Ι�岛久任淤咤祢鶂儑妿憰槣煝Ι�扯够玖门鞘送闲矣哉种勛€种赵右形褪绕美胶烦艾ē牅様弸唫�柁账鹿�灂崊�嘤羌博�拰噧�耥殒溷忖忏彗殪矧鳅䜩儐墜帒摉櫆灐%З����┃あ煖様悓垊€�赉苤兴敲�己付荡硸}巭�縺�杶焳梸�艀�巭晑�拀魟�0槡洖牑ì哺酒呜忭鴤墣槧┍荒呜沩鴣唽憱洘え�驳饭患劷E蓟焊返床隘���┆��俺倒祭派卧龠骓Line truncated
|
||||||
|
侣铝晾览靠劸^浇郊技换汗垢范党舶��Д 灉櫁晵悕媺噭個�躜镬殓邈忉徉後沅骈祜篦鼆儐墝彄枤灐ォ�撤航缆徘伤掏蜗喰2舷瓮吞松惹颇寐谰交狗党悲�┃あ牉湚槚敀憦帉媻増噯厖垊/厖唶垐墛媽實帍彁憫拻摀敂敃晼枟棙櫄殯湞灋煚 ⅲ��#ⅰ牊灊洑槜晹拺弾寢妷垏唴剝儌倎亐€€����篑铍桎嘬卦纤屏几朝� 灈櫂棗棙櫅灐え�都氯握茔犟鶂剣嫃摋殲ⅵ�钡讣柯湃宋杏兆氽苻哙忖�溴鍒�邋溷徉捃僦有倘镁勾��棏媴�柁C汩瘅䞍噵悤殸Μ哺科驮坫牝鷣厜崙暀湢ぇ�背陡购患技缓垢洞舶�┃ィ�灊渼�湞灍牏%З��车饭杭娇懒谅埫
|
||||||
|
侣铝晾览靠劸^浇郊技换汗垢范党舶��Д 灉櫁晵悕媺噭個�躜镬殓邈忉徉後沅骈祜篦鼆儐墝彄枤灐ォ�撤航缆徘伤掏蜗喰2舷瓮吞松惹颇寐谰交狗党悲�┃あ牉湚槚敀憦帉媻増噯厖垊/厖唶垐墛媽實帍彁憫拻摀敂敃晼枟棙櫄殯湞灋煚 ⅲ��#ⅰ牊灊洑槜晹拺弾寢妷垏唴剝儌倎亐€€����篑铍桎嘬卦纤屏几朝� 灈櫂棗棙櫅灐え�都氯握茔犟鶂剣嫃摋殲ⅵ�钡讣柯湃宋杏兆氽苻哙忖�溴鍒�邋溷徉捃僦有倘镁勾��棏媴�柁C汩瘅䞍噵悤殸Μ哺科驮坫牝鷣厜崙暀湢ぇ�背陡购患技缓垢洞舶�┃ィ�灊渼�湞灍牏%З��车饭杭娇懒谅埫
|
||||||
|
侣铝晾览靠劸^浇郊技换汗垢范党舶��Д 灉櫁晵悕媺噭個�躜镬殓邈忉徉後沅骈祜篦鼆儐墝彄枤灐ォ�撤航缆徘伤掏蜗喰2舷瓮吞松惹颇寐谰交狗党悲�┃あ牉湚槚敀憦帉媻増噯厖垊/厖唶垐墛媽實帍彁憫拻摀敂敃晼枟棙櫄殯湞灋煚 ⅲ��#ⅰ牊灊洑槜晹拺弾寢妷垏唴剝儌倎亐€€����篑铍桎嘬卦纤屏几朝� 灈櫂棗棙櫅灐え�都氯握茔犟鶂剣嫃摋殲ⅵ�钡讣柯湃宋杏兆氽苻哙忖�溴鍒�邋溷徉捃僦有倘镁勾��棏媴�柁厏��€噣��€竴�蓘��,牮鳊倖妿摌潰ō澈榔驮垅轳鴢儑嫃摋殲ˉǐ�泊斗吀0范闯悲�éあ牉潧殭櫂槝櫄殯潪牎%З��渤刀腹夯患壗技换缓汉构箘竆贩范抖荡闯脖爱��Δ�灉殬晸憦寠垎儊��麴黻珏汜咿蒈苘蒉哚沔轫聃��倕垕彃枡潬え�驳富嚼履魄壬蕠�1噬扇瞧拍寐揽炯还范床爱�éあ牉湚槚敁憦帉媻増噯厔剤�.剟厗唶垑妺媽崕弿悙憭拻摀敂敃晼枟棙槞殮洔湞灋煙嚑€煙灊湜殭槚晹拺弾寢増噯厔儌亐€�����黯躞耧黼桢徂谥彝饶亢蛋��洏晸憦弾帍憭晿洘ぉ�估仆咱忾聒€儑嫃摉殲ⅴ┉按泛玖钠商涡以重氽茌�哌噌後嗏後噙捃圪衷盐势陆赋��棏媶€鲭�,牮鳊倖妿摌潰ō澈榔驮垅轳鴢儑嫃摋殲ˉǐ�泊斗吀0范闯悲�éあ牉潧殭櫂槝櫄殯潪牎%З��渤刀腹夯患壗技换缓汉构箘竆贩范抖荡闯脖爱��Δ�灉殬晸憦寠垎儊��麴黻珏汜咿蒈苘蒉哚沔轫聃��倕垕彃枡潬え�驳富嚼履魄壬蕠�1噬扇瞧拍寐揽炯还范床爱�éあ牉湚槚敁憦帉媻増噯厔剤�.剟厗唶垑妺媽崕弿悙憭拻摀敂敃晼枟棙槞殮洔湞灋煙嚑€煙灊湜殭槚晹拺弾寢増噯厔儌亐€�����黯躞耧黼桢徂谥彝饶亢蛋��洏晸憦弾帍憭晿洘ぉ�估仆咱忾聒€儑嫃摉殲ⅴ┉按泛玖钠商涡以重氽茌�哌噌後嗏後噙捃圪衷盐势陆赋��棏媶€鲭�,牮鳊倖妿摌潰ō澈榔驮垅轳鴢儑嫃摋殲ˉǐ�泊斗吀0范闯悲�éあ牉潧殭櫂槝櫄殯潪牎%З��渤刀腹夯患壗技换缓汉构箘竆贩范抖荡闯脖爱��Δ�灉殬晸憦寠垎儊��麴黻珏汜咿蒈苘蒉哚沔轫聃��倕垕彃枡潬え�驳富嚼履魄壬蕠�1噬扇瞧拍寐揽炯还范床爱�éあ牉湚槚敁憦帉媻増噯厔剤�.剟厗唶垑妺媽崕弿悙憭拻摀敂敃晼枟棙槞殮洔湞灋煙嚑€煙灊湜殭槚晹拺弾寢増噯厔儌亐€�����黯躞耧黼桢徂谥彝饶亢蛋��洏晸憦弾帍憭晿洘ぉ�估仆咱忾聒€儑嫃摉殲ⅴ┉按泛玖钠商涡以重氽茌�哌噌後嗏後噙捃圪衷盐势陆赋��棏媶€鲭釀~��€厐��€畝�蓘�鬮瘀鼇厛寫暁煠┋祷燎驮坩栾鳋倖墠憯槢煝エ��渤吹档闯脖��Д!煗湚櫂棖枙晼枟槞殰潫牏うЗ��安炒档抖嚪劧档荡创叧劜Z北鞍���┄Д"牉湚槚攽弽媺噭個�躜铍桢忄捃谫刎鬃刭谲捺沔觐篪齺剣妿憯槢煟Ι�车负季缆媚排吰2排哪寐晾烤郊还付党舶��Д!煗洐槚敀憦帉媻墖唴厔儍噦/儍儎厖唶垑妸媽崕帍悙憫拻挀摂敂晻晼枟棙槞櫄殮洓泤渶洓殮櫂棖晹搾悘崒媺垎厔儌亐���黯貂趔篁耩铐腴珏膺圬孕饲陆赋��洍搻崐垏唴唵垔審摋洜カ狈灸艘籴桊��儑妿挅櫇·ǐ�蹈痪聊粕送涎以罩刭仝圹苘囕苘圳僮沼盐巳睦挤箔á潡憣唩黜鉨瘀鼇厛寫暁煠┋祷燎驮坩栾鳋倖墠憯槢煝エ��渤吹档闯脖��Д!煗湚櫂棖枙晼枟槞殰潫牏うЗ��安炒档抖嚪劧档荡创叧劜Z北鞍���┄Д"牉湚槚攽弽媺噭個�躜铍桢忄捃谫刎鬃刭谲捺沔觐篪齺剣妿憯槢煟Ι�车负季缆媚排吰2排哪寐晾烤郊还付党舶��Д!煗洐槚敀憦帉媻墖唴厔儍噦/儍儎厖唶垑妸媽崕帍悙憫拻挀摂敂晻晼枟棙槞櫄殮洓泤渶洓殮櫂棖晹搾悘崒媺垎厔儌亐���黯貂趔篁耩铐腴珏膺圬孕饲陆赋��洍搻崐垏唴唵垔審摋洜カ狈灸艘籴桊��儑妿挅櫇·ǐ�蹈痪聊粕送涎以罩刭仝圹苘囕苘圳僮沼盐巳睦挤箔á潡憣唩黜鉨瘀鼇厛寫暁煠┋祷燎驮坩栾鳋倖墠憯槢煝エ��渤吹档闯脖��Д!煗湚櫂棖枙晼枟槞殰潫牏うЗ��安炒档抖嚪劧档荡创叧劜Z北鞍���┄Д"牉湚槚攽弽媺噭個�躜铍桢忄捃谫刎鬃刭谲捺沔觐篪齺剣妿憯槢煟Ι�车负季缆媚排吰2排哪寐晾烤郊还付党舶��Д!煗洐槚敀憦帉媻墖唴厔儍噦/儍儎厖唶垑妸媽崕帍悙憫拻挀摂敂晻晼枟棙槞櫄殮洓泤渶洓殮櫂棖晹搾悘崒媺垎厔儌亐���黯貂趔篁耩铐腴珏膺圬孕饲陆赋��洍搻崐垏唴唵垔審摋洜カ狈灸艘籴桊��儑妿挅櫇·ǐ�蹈痪聊粕送涎以罩刭仝圹苘囕苘圳僮沼盐巳睦挤箔á潡憣唩黜銉~��€儉��€█�莯�鬰鳇亜噵彄槣ˇ�都燎驮卩珥酐亜垕帓晿湡·З��氨北隘��éあ牉湚櫁枙敁搾挀摂敃枠櫄湞煛ⅳェī����皢眲皠瘏畢�0����ěΔ"牊潧櫁枖憦崑墖厓���箴扉驺噍圪渍杂勔(釉重谳嚆珉瘐鷢儐墝悡枤潯ぇ�安捣购冀究览劻2览靠窘技缓狗兜床悲��Дあ牉湜櫁晹拹弽寢増噯厔剝倐噥倐儍剠厗噲墛妺實帋弿悙憫剴創償剷儢厳倶剹€枛晹敁拺弾崒妷噯厓倎€��黪趔蝰痧镱铐盱腙殓驿徇苜忠问爬欢爆Б潣攺媹厒€����亙唺帓棞ⅷ�宦裳剡骖觚倕墠悢槢煝Ι�扯富纠门巧颂蜗岩釉照种鬃囏字赵友型巳帕竞当��棏寙侙镥c鳇亜噵彄槣ˇ�都燎驮卩珥酐亜垕帓晿湡·З��氨北隘��éあ牉湚櫁枙敁搾挀摂敃枠櫄湞煛ⅳェī����皢眲皠瘏畢�0����ěΔ"牊潧櫁枖憦崑墖厓���箴扉驺噍圪渍杂勔(釉重谳嚆珉瘐鷢儐墝悡枤潯ぇ�安捣购冀究览劻2览靠窘技缓狗兜床悲��Дあ牉湜櫁晹拹弽寢増噯厔剝倐噥倐儍剠厗噲墛妺實帋弿悙憫剴創償剷儢厳倶剹€枛晹敁拺弾崒妷噯厓倎€��黪趔蝰痧镱铐盱腙殓驿徇苜忠问爬欢爆Б潣攺媹厒€����亙唺帓棞ⅷ�宦裳剡骖觚倕墠悢槢煝Ι�扯富纠门巧颂蜗岩釉照种鬃囏字赵友型巳帕竞当��棏寙侙镥c鳇亜噵彄槣ˇ�都燎驮卩珥酐亜垕帓晿湡·З��氨北隘��éあ牉湚櫁枙敁搾挀摂敃枠櫄湞煛ⅳェī����皢眲皠瘏畢�0����ěΔ"牊潧櫁枖憦崑墖厓���箴扉驺噍圪渍杂勔(釉重谳嚆珉瘐鷢儐墝悡枤潯ぇ�安捣购冀究览劻2览靠窘技缓狗兜床悲��Дあ牉湜櫁晹拹弽寢増噯厔剝倐噥倐儍剠厗噲墛妺實帋弿悙憫剴創償剷儢厳倶剹€枛晹敁拺弾崒妷噯厓倎€��黪趔蝰痧镱铐盱腙殓驿徇苜忠问爬欢爆Б潣攺媹厒€����亙唺帓棞ⅷ�宦裳剡骖觚倕墠悢槢煝Ι�扯富纠门巧颂蜗岩釉照种鬃囏字赵友型巳帕竞当��棏寙侙镥倊��€€��€��唦�苺�鬌麁儐妿憰殲(�芳虑陀龠咫蝤�倖墝彃晿洖。ェ┆����┄Δ!煗洐棖敁拺悇�悙憫挀晼棛殯潪煛ⅲぅΗī⿳獑﹪�0ЁЕΕイ"�灊湚槜晸憦崑墖厓���麴黹驺噍谪衷倚衔呁&涡延仲苓汨祚鼾亜噵帒晿洖·И�背刀腹汉嚮1汉垢阜兜闯舶���Д"牉潧櫂枖搼悗崒妷垏唴剝儌亖亞€Line truncated
|
||||||
|
鼷�亗剠唶噯�噰唴剝倎���趄痤韯�眄镳螋鳄��亗剠噲妺寧彁憭摂敃嚃€晻敁拹弽媺噭傼�脘葜先梁抄�殧強唫�耢殒溷沅彖腩蝼麁儐墝彃敆殱煝う┇�背捣够娇缆呐魄热惹颇驴几钞�潠悏傰缳司饱殢咓孀示传�殫晻晼W槡潬え�锤祭娜滔幼圻汨眢��儑寫枩ⅸ案廊眼漕鴣唻憱洜オ�讣滥鞘托矣哉种赵友贤是睦焦蛋��淥妽憯槣牑ì钡菇缕释言刿捺沐玳腠铕耋趱鲼鼬���黪趄痤腓邂捋子纤敲炕烦艾│!灉洐槄梹槞洔灎&ǐ�豆搅派脱召葆骊铗鳅䜩倓唶垑妸媼妸増噮剛€�耢玮茏烟屏挤箔━牅槙憥妵剚�箢赕廪圬衷已行岩灾佥徭祗鷣厞彅櫉お岸悸任再咪轭�
|
||||||
|
鼷�亗剠唶噯�噰唴剝倎���趄痤韯�眄镳螋鳄��亗剠噲妺寧彁憭摂敃嚃€晻敁拹弽媺噭傼�脘葜先梁抄�殧強唫�耢殒溷沅彖腩蝼麁儐墝彃敆殱煝う┇�背捣够娇缆呐魄热惹颇驴几钞�潠悏傰缳司饱殢咓孀示传�殫晻晼W槡潬え�锤祭娜滔幼圻汨眢��儑寫枩ⅸ案廊眼漕鴣唻憱洜オ�讣滥鞘托矣哉种赵友贤是睦焦蛋��淥妽憯槣牑ì钡菇缕释言刿捺沐玳腠铕耋趱鲼鼬���黪趄痤腓邂捋子纤敲炕烦艾│!灉洐槄梹槞洔灎&ǐ�豆搅派脱召葆骊铗鳅䜩倓唶垑妸媼妸増噮剛€�耢玮茏烟屏挤箔━牅槙憥妵剚�箢赕廪圬衷已行岩灾佥徭祗鷣厞彅櫉お岸悸任再咪轭�
|
||||||
|
鼷�亗剠唶噯�噰唴剝倎���趄痤韯�眄镳螋鳄��亗剠噲妺寧彁憭摂敃嚃€晻敁拹弽媺噭傼�脘葜先梁抄�殧強唫�耢殒溷沅彖腩蝼麁儐墝彃敆殱煝う┇�背捣够娇缆呐魄热惹颇驴几钞�潠悏傰缳司饱殢咓孀示传�殫晻晼W槡潬え�锤祭娜滔幼圻汨眢��儑寫枩ⅸ案廊眼漕鴣唻憱洜オ�讣滥鞘托矣哉种赵友贤是睦焦蛋��滙攢�泘�晙���憕�妦﹠憕�魛墝悡棝煟К暗菇缕饰艺佘哜溏殡盹痱篚鲼������鲷蝻礻驺咣子纤锹竞恫�à�潧櫁枛晻晼棙櫅潬ⅴì�逗韭扑嫌总噱轭蝣��亙厙垔媽崓帋崓^寢妶噮個�耢驵壅鲜目旱矮Б灇枓弸垍傼�铌遽挹渍友邢舷岩肇茑咫蝙€厜帗櫈お岸济上在噱觑豇鼆們剢噰垍�垐噯厔儌����篑痤韯�眍锺篚�齹們厙垔實彁憮敃枟棙槅橲槜枙敀憦崐垍���脬苷推糠癌�枒媶傸躅殄徇葺蒉嚆骊铙�倕垕帒晿洕牐エ��车饭唤苛门侨蕝�嗜泼兰凡��攳嘄镝悠弓�寖翦资慷��洐槝槞殰煛う┈�捶辜玖娜讼迂掬塍麄噸摎〃肮滤赞轶齽墡敊灒ō钡菇聊粕颂挝舷瓮淌绕美焦恫�Β灇梹墝悡棝煟К暗菇缕饰艺佘哜溏殡盹痱篚鲼������鲷蝻礻驺咣子纤锹竞恫�à�潧櫁枛晻晼棙櫅潬ⅴì�逗韭扑嫌总噱轭蝣��亙厙垔媽崓帋崓^寢妶噮個�耢驵壅鲜目旱矮Б灇枓弸垍傼�铌遽挹渍友邢舷岩肇茑咫蝙€厜帗櫈お岸济上在噱觑豇鼆們剢噰垍�垐噯厔儌����篑痤韯�眍锺篚�齹們厙垔實彁憮敃枟棙槅橲槜枙敀憦崐垍���脬苷推糠癌�枒媶傸躅殄徇葺蒉嚆骊铙�倕垕帒晿洕牐エ��车饭唤苛门侨蕝�嗜泼兰凡��攳嘄镝悠弓�寖翦资慷��洐槝槞殰煛う┈�捶辜玖娜讼迂掬塍麄噸摎〃肮滤赞轶齽墡敊灒ō钡菇聊粕颂挝舷瓮淌绕美焦恫�Β灇梹墝悡棝煟К暗菇缕饰艺佘哜溏殡盹痱篚鲼������鲷蝻礻驺咣子纤锹竞恫�à�潧櫁枛晻晼棙櫅潬ⅴì�逗韭扑嫌总噱轭蝣��亙厙垔媽崓帋崓^寢妶噮個�耢驵壅鲜目旱矮Б灇枓弸垍傼�铌遽挹渍友邢舷岩肇茑咫蝙€厜帗櫈お岸济上在噱觑豇鼆們剢噰垍�垐噯厔儌����篑痤韯�眍锺篚�齹們厙垔實彁憮敃枟棙槅橲槜枙敀憦崐垍���脬苷推糠癌�枒媶傸躅殄徇葺蒉嚆骊铙�倕垕帒晿洕牐エ��车饭唤苛门侨蕝�嗜泼兰凡��攳嘄镝悠弓�寖翦资慷��洐槝槞殰煛う┈�捶辜玖娜讼迂掬塍麄噸摎〃肮滤赞轶齽墡敊灒ō钡菇聊粕颂挝舷瓮淌绕美焦恫�Β灇楎杸�泘�杸���搤�媬珆悀��'垕彃枤灑Й按菇缕饰抑谳嚆骅腠锺螋鲼��鼏齆��鲷耦腓溽葚孕饲镁憾伯�ぁ灉殬枙晹敃晼槞洕牐Ι�锤祭纳鸵舟咪轫蝼麁倓唸妼崕彁剳w悙弽寠垎儊�耠驵谠紊镁勾�ァ潤晳崐唭€�痣驸捋卣友邢舷幸肇茑咫蝥亝姀敊煡�方氖兄茚珈聆�亗剠噲垑墛妸墘垐噯厓倎���篑镱韯�眍瘃赧��亙剢垔實彂挃晼棙櫄洓厹U洓殭槚晸憥寜唭€�脬茉棠降�牃搸垉�镩溥苴儇仝苓沌祚鼾亝垕彃暀湡ⅳЗ�背捣杭纠履侨侍臀勏i翁是睦环鲍�槕妰�芟露獰晪傰尜兔撼� 潨洑殯湞灍、ぅЖ��贝逗铰铺于怆鮻唽摏+唇茄坼瘥倛崜槤ⅵ�撤航缆钠莿�桥穆拷憾朝��湙晳'垕彃枤灑Й按菇缕饰抑谳嚆骅腠锺螋鲼��鼏齆��鲷耦腓溽葚孕饲镁憾伯�ぁ灉殬枙晹敃晼槞洕牐Ι�锤祭纳鸵舟咪轫蝼麁倓唸妼崕彁剳w悙弽寠垎儊�耠驵谠紊镁勾�ァ潤晳崐唭€�痣驸捋卣友邢舷幸肇茑咫蝥亝姀敊煡�方氖兄茚珈聆�亗剠噲垑墛妸墘垐噯厓倎���篑镱韯�眍瘃赧��亙剢垔實彂挃晼棙櫄洓厹U洓殭槚晸憥寜唭€�脬茉棠降�牃搸垉�镩溥苴儇仝苓沌祚鼾亝垕彃暀湡ⅳЗ�背捣杭纠履侨侍臀勏i翁是睦环鲍�槕妰�芟露獰晪傰尜兔撼� 潨洑殯湞灍、ぅЖ��贝逗铰铺于怆鮻唽摏+唇茄坼瘥倛崜槤ⅵ�撤航缆钠莿�桥穆拷憾朝��湙晳'垕彃枤灑Й按菇缕饰抑谳嚆骅腠锺螋鲼��鼏齆��鲷耦腓溽葚孕饲镁憾伯�ぁ灉殬枙晹敃晼槞洕牐Ι�锤祭纳鸵舟咪轫蝼麁倓唸妼崕彁剳w悙弽寠垎儊�耠驵谠紊镁勾�ァ潤晳崐唭€�痣驸捋卣友邢舷幸肇茑咫蝥亝姀敊煡�方氖兄茚珈聆�亗剠噲垑墛妸墘垐噯厓倎���篑镱韯�眍瘃赧��亙剢垔實彂挃晼棙櫄洓厹U洓殭槚晸憥寜唭€�脬茉棠降�牃搸垉�镩溥苴儇仝苓沌祚鼾亝垕彃暀湡ⅳЗ�背捣杭纠履侨侍臀勏i翁是睦环鲍�槕妰�芟露獰晪傰尜兔撼� 潨洑殯湞灍、ぅЖ��贝逗铰铺于怆鮻唽摏+唇茄坼瘥倛崜槤ⅵ�撤航缆钠莿�桥穆拷憾朝��湙晳�檧�殈�杸�█�攡�媬瑌弤��'噴崙暀潯Κ�附缕氏幼谵徜珀祛耋貊����唨N���鲷耦赕戕谥淹饶炕恫�Г�洐槚晹敂晻枠殰灐ぇ�捕嚎萌萄遮咪轭篦鼆儏噳媿彂挀攧昢敁拺弽媺噭価�戽嘹晕让礁钞─牅様悓墔傼�铋溧葙衷已行醒又佥徭祗麃唺彆殸Μ哺颗搜纵汩铙�€們厗垐墕�墘垏唴儌���黪篑镱韯�眍痱赭�€倓唸妺崗憮敄棛殯湞灋厽€灋潨殭棔搻崐噭侜箅阚铀眉船�槕媶侜螂遴苜字肿刿掴珈蝤䝼唹崘敆殱·Ι�背陡唤苛钠仁涛醒矣栽右形倘爬欢蔼�枏垇翮偬来�攱凎贻胰拦箔━�灊湝剾N湝湞潪灍牎%ǐ�妇盘者轷亣彈煥被畔黉嵇倛崚棞ˉ�钡富娇懒侣铝揽交苟嘲�Β灇棑弻'噴崙暀潯Κ�附缕氏幼谵徜珀祛耋貊����唨N���鲷耦赕戕谥淹饶炕恫�Г�洐槚晹敂晻枠殰灐ぇ�捕嚎萌萄遮咪轭篦鼆儏噳媿彂挀攧昢敁拺弽媺噭価�戽嘹晕让礁钞─牅様悓墔傼�铋溧葙衷已行醒又佥徭祗麃唺彆殸Μ哺颗搜纵汩铙�€們厗垐墕�墘垏唴儌���黪篑镱韯�眍痱赭�€倓唸妺崗憮敄棛殯湞灋厽€灋潨殭棔搻崐噭侜箅阚铀眉船�槕媶侜螂遴苜字肿刿掴珈蝤䝼唹崘敆殱·Ι�背陡唤苛钠仁涛醒矣栽右形倘爬欢蔼�枏垇翮偬来�攱凎贻胰拦箔━�灊湝剾N湝湞潪灍牎%ǐ�妇盘者轷亣彈煥被畔黉嵇倛崚棞ˉ�钡富娇懒侣铝揽交苟嘲�Β灇棑弻'噴崙暀潯Κ�附缕氏幼谵徜珀祛耋貊����唨N���鲷耦赕戕谥淹饶炕恫�Г�洐槚晹敂晻枠殰灐ぇ�捕嚎萌萄遮咪轭篦鼆儏噳媿彂挀攧昢敁拺弽媺噭価�戽嘹晕让礁钞─牅様悓墔傼�铋溧葙衷已行醒又佥徭祗麃唺彆殸Μ哺颗搜纵汩铙�€們厗垐墕�墘垏唴儌���黪篑镱韯�眍痱赭�€倓唸妺崗憮敄棛殯湞灋厽€灋潨殭棔搻崐噭侜箅阚铀眉船�槕媶侜螂遴苜字肿刿掴珈蝤䝼唹崘敆殱·Ι�背陡唤苛钠仁涛醒矣栽右形倘爬欢蔼�枏垇翮偬来�攱凎贻胰拦箔━�灊湝剾N湝湞潪灍牎%ǐ�妇盘者轷亣彈煥被畔黉嵇倛崚棞ˉ�钡富娇懒侣铝揽交苟嘲�Β灇棑弻�唨�泙�殈�梹�﹢�攡�媬瓆巭�鬙厜寪敇湢オ�附疗氏幼坜忮桦铕蝓鼯���€€亖亗倎亖€€��赳黹遽茇游逝兰烦�Г�湚槜杽�(枠櫅潬&┉钡咕虑诵遮咪轭篪齺剢垕崗憮敄棙剻^槜枙搼弽媹厒��戽嘹晕Line truncated
|
||||||
|
妷増噰唵厖噭€厖唶垑妺崕悞摃槡湡·З�扯辜烂鞘窝肇圻忮桕盹耋貅�����黯趄痤腴驺噍谥有蜕泼考苟嘲�ē�潧櫀敀悗寠墖厔倎€��趔耩铐祀腙殚梃珑�&驽滗汊噙捃谫渍友翁嗜颇吕炯还阜兜创吵巢劤/创刀犯够季缆那商弦众掴骐瘐��倕垕崘摉櫅灎ⅳΘ┇瑖���ěΔ"�煘潨渼�(湝湞灍牏%Θ��泊豆唤柯钠仁涛醒诱肿刭谮勠S谮儇字砸严淌扰美交傅帛�Г�潥槙搼帉妶唲個�鲵镫桢膺苜钟形巳泼量己付床隘��éゥぃ��#いぅゥ啨ゥい"�灊湚櫂枙搾悘帉媻増噯�4妺媽實帋彁憭摂晼槞洕煛う┈俺坊棵韧阎坂尻雉�€倓唶垑妵�
|
||||||
|
妷増噰唵厖噭€厖唶垑妺崕悞摃槡湡·З�扯辜烂鞘窝肇圻忮桕盹耋貅�����黯趄痤腴驺噍谥有蜕泼考苟嘲�ē�潧櫀敀悗寠墖厔倎€��趔耩铐祀腙殚梃珑�&驽滗汊噙捃谫渍友翁嗜颇吕炯还阜兜创吵巢劤/创刀犯够季缆那商弦众掴骐瘐��倕垕崘摉櫅灎ⅳΘ┇瑖���ěΔ"�煘潨渼�(湝湞灍牏%Θ��泊豆唤柯钠仁涛醒诱肿刭谮勠S谮儇字砸严淌扰美交傅帛�Г�潥槙搼帉妶唲個�鲵镫桢膺苜钟形巳泼量己付床隘��éゥぃ��#いぅゥ啨ゥい"�灊湚櫂枙搾悘帉媻増噯�4妺媽實帋彁憭摂晼槞洕煛う┈俺坊棵韧阎坂尻雉�€倓唶垑妵�
|
||||||
|
妷増噰唵厖噭€厖唶垑妺崕悞摃槡湡·З�扯辜烂鞘窝肇圻忮桕盹耋貅�����黯趄痤腴驺噍谥有蜕泼考苟嘲�ē�潧櫀敀悗寠墖厔倎€��趔耩铐祀腙殚梃珑�&驽滗汊噙捃谫渍友翁嗜颇吕炯还阜兜创吵巢劤/创刀犯够季缆那商弦众掴骐瘐��倕垕崘摉櫅灎ⅳΘ┇瑖���ěΔ"�煘潨渼�(湝湞灍牏%Θ��泊豆唤柯钠仁涛醒诱肿刭谮勠S谮儇字砸严淌扰美交傅帛�Г�潥槙搼帉妶唲個�鲵镫桢膺苜钟形巳泼量己付床隘��éゥぃ��#いぅゥ啨ゥい"�灊湚櫂枙搾悘帉媻増噯啲�€寑��€唨��5寣崓帋彁悜挀敃枟槡洕煛&┇�倒搅攀斡剀徭觑篦��亗剠唶噯�噰唵厖剟儍儎�4儍儎厗噲墛實彂摃棛洖牐Ι�驳辜棵剖窝肇圻忮桦眇螋鲼�嘂j��趄痤扉驺噍谧有蜕泼考苟嘲�Г�潧槚敀悗寠垏厓倎���趄痫盱腙殍桤骀邋溷汊徉咿苒儇衷倚翁嗜颇昧拷己垢范荡磮矴吹刀犯够季缆钠商弦召茑彘铗鼽亙唹寧憯枡洖牏ぅЖ┆���┅ěΕぃ�煘潨湜泤�洔湞灍、ぅЗ��炊负娇撩迫侍蜗延灾棕儋谮圹谮谫刈赵倚翁嗜琶澜桓挡��あ煗殬晸憥寠垎剛€�鲶痨殒汔葳渍蚁褪扰昧考焊兜潮爱��ěΖゥ墹儱叇偋劍イぃⅰ牊潨洐槚晹拺弾崒媻増噯5寣崓帋彁悜挀敃枟槡洕煛&┇�倒搅攀斡剀徭觑篦��亗剠唶噯�噰唵厖剟儍儎�4儍儎厗噲墛實彂摃棛洖牐Ι�驳辜棵剖窝肇圻忮桦眇螋鲼�嘂j��趄痤扉驺噍谧有蜕泼考苟嘲�Г�潧槚敀悗寠垏厓倎���趄痫盱腙殍桤骀邋溷汊徉咿苒儇衷倚翁嗜颇昧拷己垢范荡磮矴吹刀犯够季缆钠商弦召茑彘铗鼽亙唹寧憯枡洖牏ぅЖ┆���┅ěΕぃ�煘潨湜泤�洔湞灍、ぅЗ��炊负娇撩迫侍蜗延灾棕儋谮圹谮谫刈赵倚翁嗜琶澜桓挡��あ煗殬晸憥寠垎剛€�鲶痨殒汔葳渍蚁褪扰昧考焊兜潮爱��ěΖゥ墹儱叇偋劍イぃⅰ牊潨洐槚晹拺弾崒媻増噯5寣崓帋彁悜挀敃枟槡洕煛&┇�倒搅攀斡剀徭觑篦��亗剠唶噯�噰唵厖剟儍儎�4儍儎厗噲墛實彂摃棛洖牐Ι�驳辜棵剖窝肇圻忮桦眇螋鲼�嘂j��趄痤扉驺噍谧有蜕泼考苟嘲�Г�潧槚敀悗寠垏厓倎���趄痫盱腙殍桤骀邋溷汊徉咿苒儇衷倚翁嗜颇昧拷己垢范荡磮矴吹刀犯够季缆钠商弦召茑彘铗鼽亙唹寧憯枡洖牏ぅЖ┆���┅ěΕぃ�煘潨湜泤�洔湞灍、ぅЗ��炊负娇撩迫侍蜗延灾棕儋谮圹谮谫刈赵倚翁嗜琶澜桓挡��あ煗殬晸憥寠垎剛€�鲶痨殒汔葳渍蚁褪扰昧考焊兜潮爱��ěΖゥ墹儱叇偋劍イぃⅰ牊潨洐槚晹拺弾崒媻増噯��€墍��€唨��5崓帋彁悜憭摂晼棙櫄湞煛%ǐ�捶豢们诵载葆骊铗鳄��亗儎剣�剟儍儌倛�4倐儎厗噲墜寧悞敄槡潬ⅴǐ�蹈豢缕释言刿哜彖腩痱赧��匋k��黪篑铎殒汔葳子刑善驴脊挡��ぁ煗殬枔憦崒妶唴儌€��躞耧铎腙殍珂邃溷忖徉咿蒈圳刈赵倚瓮松桥昧谰交汗范兜创嚦2创档斗腹患纠履迫宋言刿咩珈瘐��倓噴審挃枡洕煛ⅳウЁ劏ЁΕイ"�灋潨洑殕�&殮洔潪牎%Θ��车泛季撩徘伤拖岩哉肿刭嗂T儇刂赵倚翁嗜琶澜桓挡��ア煗殬晸憦崐垎剛侢�麴黻玟徂圪钟盐淌桥昧拷还返床悲���èЁ姦姧Ζゥぃⅰ牊潨洐槜晹搼悘帉媻妷垏5崓帋彁悜憭摂晼棙櫄湞煛%ǐ�捶豢们诵载葆骊铗鳄��亗儎剣�剟儍儌倛�4倐儎厗噲墜寧悞敄槡潬ⅴǐ�蹈豢缕释言刿哜彖腩痱赧��匋k��黪篑铎殒汔葳子刑善驴脊挡��ぁ煗殬枔憦崒妶唴儌€��躞耧铎腙殍珂邃溷忖徉咿蒈圳刈赵倚瓮松桥昧谰交汗范兜创嚦2创档斗腹患纠履迫宋言刿咩珈瘐��倓噴審挃枡洕煛ⅳウЁ劏ЁΕイ"�灋潨洑殕�&殮洔潪牎%Θ��车泛季撩徘伤拖岩哉肿刭嗂T儇刂赵倚翁嗜琶澜桓挡��ア煗殬晸憦崐垎剛侢�麴黻玟徂圪钟盐淌桥昧拷还返床悲���èЁ姦姧Ζゥぃⅰ牊潨洐槜晹搼悘帉媻妷垏5崓帋彁悜憭摂晼棙櫄湞煛%ǐ�捶豢们诵载葆骊铗鳄��亗儎剣�剟儍儌倛�4倐儎厗噲墜寧悞敄槡潬ⅴǐ�蹈豢缕释言刿哜彖腩痱赧��匋k��黪篑铎殒汔葳子刑善驴脊挡��ぁ煗殬枔憦崒妶唴儌€��躞耧铎腙殍珂邃溷忖徉咿蒈圳刈赵倚瓮松桥昧谰交汗范兜创嚦2创档斗腹患纠履迫宋言刿咩珈瘐��倓噴審挃枡洕煛ⅳウЁ劏ЁΕイ"�灋潨洑殕�&殮洔潪牎%Θ��车泛季撩徘伤拖岩哉肿刭嗂T儇刂赵倚翁嗜琶澜桓挡��ア煗殬晸憦崐垎剛侢�麴黻玟徂圪钟盐淌桥昧拷还返床悲���èЁ姦姧Ζゥぃⅰ牊潨洐槜晹搼悘帉媻妷垏��€噣��€厐��5帍彁悜憭摀敃枛棙櫅湠煛%И�捕菇滥忍姓佥徨轫痿鼯�€亖垈儊剙��5€€€亗們剢噲妺崗憮晽櫆煛ぇ�贝坊韭粕脱载圻忮桦铕篚鼬�嘃j��躞耧扉驺噍谥有躺怕炕傅帛�Δ�湚棔搼弽媺垎剝亐��趄痤祀殍珂邃汊忉噙咿蒈圳僮终友形趟汕拍吕拷己垢范档创嚦2创刀斗负患纠撩迫送杏宗掴骊铙�€儏垔崗挃枠殰灍、¥��い"�煙灊湜殭檱�'櫃殯湞煚ⅳェ┇�泊饭痪缆钠伤臀幸诱肿刭賱赨儋刈终右形淌桥吕交傅舶�Д�潧槚搼弽媺噮儊��躐铍桢膺葳渍倚嗡汕琶量交垢兜巢隘���┅摠ЁΖイ"�煘湜殬棖敁拹弾崒媻墘�5帍彁悜憭摀敃枛棙櫅湠煛%И�捕菇滥忍姓佥徨轫痿鼯�€亖垈儊剙��5€€€亗們剢噲妺崗憮晽櫆煛ぇ�贝坊韭粕脱载圻忮桦铕篚鼬�嘃j��躞耧扉驺噍谥有躺怕炕傅帛�Δ�湚棔搼弽媺垎剝亐��趄痤祀殍珂邃汊忉噙咿蒈圳僮终友形趟汕拍吕拷己垢范档创嚦2创刀斗负患纠撩迫送杏宗掴骊铙�€儏垔崗挃枠殰灍、¥��い"�煙灊湜殭檱�'櫃殯湞煚ⅳェ┇�泊饭痪缆钠伤臀幸诱肿刭賱赨儋刈终右形淌桥吕交傅舶�Д�潧槚搼弽媺噮儊��躐铍桢膺葳渍倚嗡汕琶量交垢兜巢隘���┅摠ЁΖイ"�煘湜殬棖敁拹弾崒媻墘�5帍彁悜憭摀敃枛棙櫅湠煛%И�捕菇滥忍姓佥徨轫痿鼯�€亖垈儊剙��5€€€亗們剢噲妺崗憮晽櫆煛ぇ�贝坊韭粕脱载圻忮桦铕篚鼬�嘃j��躞耧扉驺噍谥有躺怕炕傅帛�Δ�湚棔搼弽媺垎剝亐��趄痤祀殍珂邃汊忉噙咿蒈圳僮终友形趟汕拍吕拷己垢范档创嚦2创刀斗负患纠撩迫送杏宗掴骊铙�€儏垔崗挃枠殰灍、¥��い"�煙灊湜殭檱�'櫃殯湞煚ⅳェ┇�泊饭痪缆钠伤臀幸诱肿刭賱赨儋刈终右形淌桥吕交傅舶�Д�潧槚搼弽媺噮儊��躐铍桢膺葳渍倚嗡汕琶量交垢兜巢隘���┅摠ЁΖイ"�煘湜殬棖敁拹弾崒媻墘埐拃�韤��€厐�鬊悙憫拻摀敃晼棗槞殯湠煛%З�贝坊韭派脱召萼滂腩耵鲽����€€€�����圏€��€€亗儎唶墛寧悞敄槢灎&┈俺泛玖派绦宰坜忮桦铕篚鼬������躞耧扉驺噍谥酉倘怕净复碑�Γ牉洐棔拹帉媺噮剛���黪篑镯腙桤驿汊後�%咿蒈圹谫字赵已衔趟汕颇铝烤蓟汗阜兜荡磫�3创吹斗犯夯季苛门仁拖抑佘噤桁聃�亜唸媿彃敄槡洕灍牎�� 牋煘潨湜Line truncated
|
||||||
|
旅徘仁颂臀勏$挝退嗜颇驴胶傅舶�éあ牉湜櫂棖晹摀拻垜K拻挀摂敃晼枟棙櫃殯湝潪煚牎ⅲぅΗī���氨渤刀犯购唤究懒旅呐魄热墒怂烫屯挝螀蟿�屯烫怂适缮惹瞧婆拍拿妹侣聞羷纼縿�浇技蓟缓汉构父阜贩壎9贩父购唤纠撩徘伤涡以重谲蒉哙後徉噙蒈谪衷倚退善穆谰交汗阜穱禮贩犯腹购夯技浇究览谅媚呐魄壬仕掏闲岩釉兆刭谯蒉哙徙溴骅殛祉镳耋赧鼯���€亗們剟厗噰垐墘妸媼剬垗剬t媼媻妷増噰唵厔儍倎亐���黯趔耩铐腙桤邃汜噙蒈圳刈终杂已邢瓮趟噬惹婆拿铝揽窘蓟汗阜兜闯脖隘��┄Еゥぃⅰ牊煘潩湝洓殮殑檪�
|
||||||
|
旅徘仁颂臀勏$挝退嗜颇驴胶傅舶�éあ牉湜櫂棖晹摀拻垜K拻挀摂敃晼枟棙櫃殯湝潪煚牎ⅲぅΗī���氨渤刀犯购唤究懒旅呐魄热墒怂烫屯挝螀蟿�屯烫怂适缮惹瞧婆拍拿妹侣聞羷纼縿�浇技蓟缓汉构父阜贩壎9贩父购唤纠撩徘伤涡以重谲蒉哙後徉噙蒈谪衷倚退善穆谰交汗阜穱禮贩犯腹购夯技浇究览谅媚呐魄壬仕掏闲岩釉兆刭谯蒉哙徙溴骅殛祉镳耋赧鼯���€亗們剟厗噰垐墘妸媼剬垗剬t媼媻妷増噰唵厔儍倎亐���黯趔耩铐腙桤邃汜噙蒈圳刈终杂已邢瓮趟噬惹婆拿铝揽窘蓟汗阜兜闯脖隘��┄Еゥぃⅰ牊煘潩湝洓殮殑檪�
|
||||||
|
旅徘仁颂臀勏$挝退嗜颇驴胶傅舶�éあ牉湜櫂棖晹摀拻垜K拻挀摂敃晼枟棙櫃殯湝潪煚牎ⅲぅΗī���氨渤刀犯购唤究懒旅呐魄热墒怂烫屯挝螀蟿�屯烫怂适缮惹瞧婆拍拿妹侣聞羷纼縿�浇技蓟缓汉构父阜贩壎9贩父购唤纠撩徘伤涡以重谲蒉哙後徉噙蒈谪衷倚退善穆谰交汗阜穱禮贩犯腹购夯技浇究览谅媚呐魄壬仕掏闲岩釉兆刭谯蒉哙徙溴骅殛祉镳耋赧鼯���€亗們剟厗噰垐墘妸媼剬垗剬t媼媻妷増噰唵厔儍倎亐���黯趔耩铐腙桤邃汜噙蒈圳刈终杂已邢瓮趟噬惹婆拿铝揽窘蓟汗阜兜闯脖隘��┄Еゥぃⅰ牊煘潩湝洓殮殑檪����穩��
|
||||||
|
履徘墒掏蜗呅$衔吞嗜颇驴胶返帛�ē!煗湚櫂枙晹摀拻噾I拻挀摀敂晻枛棙槞殮洔湞灍煚、#ぅΗī���氨渤吹斗腹夯冀究懒侣媚牌魄侨壬蓩�缮扇惹瞧婆拍拿妹侣劻劺吙吘劷技蓟缓汉构父阜贩嫸犯腹夯季苛门巧送弦灾刳苻哙釁�徉咻圪渍倚嗡善穆谰交汗阜抖秳祫禫贩父构汉换冀骄靠懒旅媚牌侨墒颂拖醒矣哉重仝圮葸噌怃彐玳觌眍锺螋貅����€亖們儎厖唵噰垐垊増妱塻垐垏噯唴厔剝倐亐€����躞蝰镱祀觇珏溷徉咿苒谫刂赵右研衔吞耸扇瞧拍寐铝揽窘蓟汗阜兜闯脖隘���ěΕぃⅰ�煘灊湝洓殮殔檪�
|
||||||
|
履徘墒掏蜗呅$衔吞嗜颇驴胶返帛�ē!煗湚櫂枙晹摀拻噾I拻挀摀敂晻枛棙槞殮洔湞灍煚、#ぅΗī���氨渤吹斗腹夯冀究懒侣媚牌魄侨壬蓩�缮扇惹瞧婆拍拿妹侣劻劺吙吘劷技蓟缓汉构父阜贩嫸犯腹夯季苛门巧送弦灾刳苻哙釁�徉咻圪渍倚嗡善穆谰交汗阜抖秳祫禫贩父构汉换冀骄靠懒旅媚牌侨墒颂拖醒矣哉重仝圮葸噌怃彐玳觌眍锺螋貅����€亖們儎厖唵噰垐垊増妱塻垐垏噯唴厔剝倐亐€����躞蝰镱祀觇珏溷徉咿苒谫刂赵右研衔吞耸扇瞧拍寐铝揽窘蓟汗阜兜闯脖隘���ěΕぃⅰ�煘灊湝洓殮殔檪�
|
||||||
|
履徘墒掏蜗呅$衔吞嗜颇驴胶返帛�ē!煗湚櫂枙晹摀拻噾I拻挀摀敂晻枛棙槞殮洔湞灍煚、#ぅΗī���氨渤吹斗腹夯冀究懒侣媚牌魄侨壬蓩�缮扇惹瞧婆拍拿妹侣劻劺吙吘劷技蓟缓汉构父阜贩嫸犯腹夯季苛门巧送弦灾刳苻哙釁�徉咻圪渍倚嗡善穆谰交汗阜抖秳祫禫贩父构汉换冀骄靠懒旅媚牌侨墒颂拖醒矣哉重仝圮葸噌怃彐玳觌眍锺螋貅����€亖們儎厖唵噰垐垊増妱塻垐垏噯唴厔剝倐亐€����躞蝰镱祀觇珏溷徉咿苒谫刂赵右研衔吞耸扇瞧拍寐铝揽窘蓟汗阜兜闯脖隘���ěΕぃⅰ�煘灊湝洓殮殔檪����眬��履迫伤臀闲褎�#研衔淌绕牧考悍幢��ィ�潨殭槚晻敁搫拏憛扜摀摂敃晼枟棙櫃殮洔湞灍煚、ⅲぅΖЖ┆���氨渤吹斗腹汉患骄靠懒谅妹哪排艐�
排拍哪妹侣铝羷绖繃締絽�换缓汉构垢父贩穻�贩腹夯冀坷履迫释涎又刳苻哚忏勪汊徉捃谪沼形松悄吕窘缓垢范秷礦抖斗贩父构夯患冀揪坷亮旅呐魄壬仕掏涡岩釉罩踪谯茌捱徕沅骁栝腱盹瘃篝貅����€€亖們儎剟厖剢墖剢s厖厔剝儌倎亐€����鲺趄耩铐礻殍珏溷徉咿苒谫刈赵右研衔吞耸扇瞧婆拿铝揽窘蓟汗阜兜创巢卑���┄Еイ"ⅰ牊煘潩湝洓殮殑檭�履迫伤臀闲褎�#研衔淌绕牧考悍幢��ィ�潨殭槚晻敁搫拏憛扜摀摂敃晼枟棙櫃殮洔湞灍煚、ⅲぅΖЖ┆���氨渤吹斗腹汉患骄靠懒谅妹哪排艐�
排拍哪妹侣铝羷绖繃締絽�换缓汉构垢父贩穻�贩腹夯冀坷履迫释涎又刳苻哚忏勪汊徉捃谪沼形松悄吕窘缓垢范秷礦抖斗贩父构夯患冀揪坷亮旅呐魄壬仕掏涡岩釉罩踪谯茌捱徕沅骁栝腱盹瘃篝貅����€€亖們儎剟厖剢墖剢s厖厔剝儌倎亐€����鲺趄耩铐礻殍珏溷徉咿苒谫刈赵右研衔吞耸扇瞧婆拿铝揽窘蓟汗阜兜创巢卑���┄Еイ"ⅰ牊煘潩湝洓殮殑檭�履迫伤臀闲褎�#研衔淌绕牧考悍幢��ィ�潨殭槚晻敁搫拏憛扜摀摂敃晼枟棙櫃殮洔湞灍煚、ⅲぅΖЖ┆���氨渤吹斗腹汉患骄靠懒谅妹哪排艐�
排拍哪妹侣铝羷绖繃締絽�换缓汉构垢父贩穻�贩腹夯冀坷履迫释涎又刳苻哚忏勪汊徉捃谪沼形松悄吕窘缓垢范秷礦抖斗贩父构夯患冀揪坷亮旅呐魄壬仕掏涡岩釉罩踪谯茌捱徕沅骁栝腱盹瘃篝貅����€€亖們儎剟厖剢墖剢s厖厔剝儌倎亐€����鲺趄耩铐礻殍珏溷徉咿苒谫刈赵右研衔吞耸扇瞧婆拿铝揽窘蓟汗阜兜创巢卑���┄Еイ"ⅰ牊煘潩湝洓殮殑檭����獉��履迫侍拖醒覅�$已形退善牧考苟幢�┃ィ�潨殭槜枙敂摀墥F摀摂敃晼枟棙槞櫄洓湞潪煙牎、¥ぅΗè┆���氨膊炒刀斗腹汉患冀揪靠览亮劼嚸劼 亮晾览靠縿緡綃紖粍�构垢父劮嫸贩腹夯冀纠旅湃侍窝诱刳苻噌沅呭溷忉咻圬钟盐躺悄吕炯还阜抖档嚧V档刀抖贩父构汉换冀骄坷懒旅呐魄壬仕掏蜗幸釉罩棕仝圯捱噌怃彐玷觌祉镳耱趱鲼����€€亖倐倓儔剟價倐倎亖€€�����豸篁耧铐祀殍珂邈忉噙蒈圳儇终杂已邢瓮趟噬惹破拍寐晾烤郊蓟汗阜兜闯脖鞍���┄Еイぃⅰ牋煘潩湝洓殮殔檭�履迫侍拖醒覅�$已形退善牧考苟幢�┃ィ�潨殭槜枙敂摀墥F摀摂敃晼枟棙槞櫄洓湞潪煙牎、¥ぅΗè┆���氨膊炒刀斗腹汉患冀揪靠览亮劼嚸劼 亮晾览靠縿緡綃紖粍�构垢父劮嫸贩腹夯冀纠旅湃侍窝诱刳苻噌沅呭溷忉咻圬钟盐躺悄吕炯还阜抖档嚧V档刀抖贩父构汉换冀骄坷懒旅呐魄壬仕掏蜗幸釉罩棕仝圯捱噌怃彐玷觌祉镳耱趱鲼����€€亖倐倓儔剟價倐倎亖€€�����豸篁耧铐祀殍珂邈忉噙蒈圳儇终杂已邢瓮趟噬惹破拍寐晾烤郊蓟汗阜兜闯脖鞍���┄Еイぃⅰ牋煘潩湝洓殮殔檭�履迫侍拖醒覅�$已形退善牧考苟幢�┃ィ�潨殭槜枙敂摀墥F摀摂敃晼枟棙槞櫄洓湞潪煙牎、¥ぅΗè┆���氨膊炒刀斗腹汉患冀揪靠览亮劼嚸劼 亮晾览靠縿緡綃紖粍�构垢父劮嫸贩腹夯冀纠旅湃侍窝诱刳苻噌沅呭溷忉咻圬钟盐躺悄吕炯还阜抖档嚧V档刀抖贩父构汉换冀骄坷懒旅呐魄壬仕掏蜗幸釉罩棕仝圯捱噌怃彐玷觌祉镳耱趱鲼����€€亖倐倓儔剟價倐倎亖€€�����豸篁耧铐祀殍珂邈忉噙蒈圳儇终杂已邢瓮趟噬惹破拍寐晾烤郊蓟汗阜兜闯脖鞍���┄Еイぃⅰ牋煘潩湝洓殮殔檭����爛��门巧颂涡岩釉務$杂已贤松颇辆脊冻碑�Д!煗湚櫂棖晻敂嫇F敂敃晼枟棙槞櫄殯湝潩灍煚 ⅲ¥ゥΗè┆����北渤创刀斗父购夯患冀骄揪嵖劸劷吋摶喓劰兏劮嫸@贩腹购唤纠撩徘伤涡艺踪苻噌沅彐珑珂邃汜噢圪衷严躺悄吕炯还阜兜荡创劤劥R档刀抖贩父构汉患冀究坷谅媚牌侨墒颂臀闲岩釉罩刭谯茌捱噌沅彐玷觌祉铕耱篝貊鼬�����剙妬剙r�������鲺趔蝰痤盱腙殍珂邈忉噙掭苒儇字赵右研衔吞耸扇瞧拍拿铝揽窘郊缓垢范兜闯脖隘���┄Еゥぃⅰ牋煘灊湝洓洑殮厵儤门巧颂涡岩釉務$杂已贤松颇辆脊冻碑�Д!煗湚櫂棖晻敂嫇F敂敃晼枟棙槞櫄殯湝潩灍煚 ⅲ¥ゥΗè┆����北渤创刀斗父购夯患冀骄揪嵖劸劷吋摶喓劰兏劮嫸@贩腹购唤纠撩徘伤涡艺踪苻噌沅彐珑珂邃汜噢圪衷严躺悄吕炯还阜兜荡创劤劥R档刀抖贩父构汉患冀究坷谅媚牌侨墒颂臀闲岩釉罩刭谯茌捱噌沅彐玷觌祉铕耱篝貊鼬�����剙妬剙r�������鲺趔蝰痤盱腙殍珂邈忉噙掭苒儇字赵右研衔吞耸扇瞧拍拿铝揽窘郊缓垢范兜闯脖隘���┄Еゥぃⅰ牋煘灊湝洓洑殮厵儤门巧颂涡岩釉務$杂已贤松颇辆脊冻碑�Д!煗湚櫂棖晻敂嫇F敂敃晼枟棙槞櫄殯湝潩灍煚 ⅲ¥ゥΗè┆����北渤创刀斗父购夯患冀骄揪嵖劸劷吋摶喓劰兏劮嫸@贩腹购唤纠撩徘伤涡艺踪苻噌沅彐珑珂邃汜噢圪衷严躺悄吕炯还阜兜荡创劤劥R档刀抖贩父构汉患冀究坷谅媚牌侨墒颂臀闲岩釉罩刭谯茌捱噌沅彐玷觌祉铕耱篝貊鼬�����剙妬剙r�������鲺趔蝰痤盱腙殍珂邈忉噙掭苒儇字赵右研衔吞耸扇瞧拍拿铝揽窘郊缓垢范兜闯脖隘���┄Еゥぃⅰ牋煘灊湝洓洑殮厵儤���拃��门巧送闲矣哉呏#赵友贤松颇辆脊冻碑�Д!煘湜殭槜枙晞攧搮擠晻枛枟棙槞櫄殯洔潩灋煙牎、ⅲいウΗè┆����鞍辈渤炒档斗犯腹购夯换徏吇浐喒劯劮嫸贩父购患究撩钠伤拖以踪坜噔沐骁勮珑邃忄捃僮匝咸汕穆谰己垢范荡磰砋创吹档抖斗犯腹购换冀揪坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徙溴骁栝觌祉铕耱蝮趱鲼���麐黸����黯貂趔蝰痫镱盱腙殍珂邃汊徉咿蒈圳儇终杂已邢瓮趟耸扇瞧拍寐铝揽窘郊缓垢阜兜闯膊卑����ěΖイ" 牊煘潩湝洓殮殕檭�门巧送闲矣哉呏#赵友贤松颇辆脊冻碑�Д!煘湜殭槜枙晞攧搮擠晻枛枟棙槞櫄殯洔潩灋煙牎、ⅲいウΗè┆����鞍辈渤炒档斗犯腹购夯换徏吇浐喒劯劮嫸贩父购患究撩钠伤拖以踪坜噔沐Line truncated
|
||||||
|
After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 12 MiB |
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"presets": ["babel-preset-expo"],
|
||||||
|
"env": {
|
||||||
|
"development": {
|
||||||
|
"plugins": ["transform-react-jsx-source"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"expoServerPort": 19000,
|
||||||
|
"packagerPort": 19001,
|
||||||
|
"packagerPid": 7732
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"hostType": "tunnel",
|
||||||
|
"lanType": "ip",
|
||||||
|
"dev": true,
|
||||||
|
"minify": false,
|
||||||
|
"urlRandomness": null
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
[ignore]
|
||||||
|
; We fork some components by platform
|
||||||
|
.*/*[.]android.js
|
||||||
|
|
||||||
|
; Ignore templates for 'react-native init'
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/local-cli/templates/.*
|
||||||
|
|
||||||
|
; Ignore RN jest
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/jest/.*
|
||||||
|
|
||||||
|
; Ignore RNTester
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/RNTester/.*
|
||||||
|
|
||||||
|
; Ignore the website subdir
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/website/.*
|
||||||
|
|
||||||
|
; Ignore the Dangerfile
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/danger/dangerfile.js
|
||||||
|
|
||||||
|
; Ignore Fbemitter
|
||||||
|
<PROJECT_ROOT>/node_modules/fbemitter/.*
|
||||||
|
|
||||||
|
; Ignore "BUCK" generated dirs
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/\.buckd/
|
||||||
|
|
||||||
|
; Ignore unexpected extra "@providesModule"
|
||||||
|
.*/node_modules/.*/node_modules/fbjs/.*
|
||||||
|
|
||||||
|
; Ignore polyfills
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native/Libraries/polyfills/.*
|
||||||
|
|
||||||
|
; Ignore various node_modules
|
||||||
|
<PROJECT_ROOT>/node_modules/react-native-gesture-handler/.*
|
||||||
|
<PROJECT_ROOT>/node_modules/expo/.*
|
||||||
|
<PROJECT_ROOT>/node_modules/react-navigation/.*
|
||||||
|
<PROJECT_ROOT>/node_modules/xdl/.*
|
||||||
|
<PROJECT_ROOT>/node_modules/reqwest/.*
|
||||||
|
<PROJECT_ROOT>/node_modules/metro-bundler/.*
|
||||||
|
|
||||||
|
[include]
|
||||||
|
|
||||||
|
[libs]
|
||||||
|
node_modules/react-native/Libraries/react-native/react-native-interface.js
|
||||||
|
node_modules/react-native/flow/
|
||||||
|
node_modules/expo/flow/
|
||||||
|
|
||||||
|
[options]
|
||||||
|
emoji=true
|
||||||
|
|
||||||
|
module.system=haste
|
||||||
|
|
||||||
|
module.file_ext=.js
|
||||||
|
module.file_ext=.jsx
|
||||||
|
module.file_ext=.json
|
||||||
|
module.file_ext=.ios.js
|
||||||
|
|
||||||
|
munge_underscores=true
|
||||||
|
|
||||||
|
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
|
||||||
|
|
||||||
|
suppress_type=$FlowIssue
|
||||||
|
suppress_type=$FlowFixMe
|
||||||
|
suppress_type=$FlowFixMeProps
|
||||||
|
suppress_type=$FlowFixMeState
|
||||||
|
suppress_type=$FixMe
|
||||||
|
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native_oss[a-z,_]*\\)?)\\)
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native_oss[a-z,_]*\\)?)\\)?:? #[0-9]+
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
|
||||||
|
|
||||||
|
unsafe.enable_getters_and_setters=true
|
||||||
|
|
||||||
|
[version]
|
||||||
|
^0.56.0
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { StyleSheet, Text, View } from 'react-native';
|
||||||
|
|
||||||
|
export default class App extends React.Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text>Did this change?</Text>
|
||||||
|
<Text>Changes you make will automatically reload.</Text>
|
||||||
|
<Text>Shake your phone to open the developer menu.</Text>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import App from './App';
|
||||||
|
|
||||||
|
import renderer from 'react-test-renderer';
|
||||||
|
|
||||||
|
it('renders without crashing', () => {
|
||||||
|
const rendered = renderer.create(<App />).toJSON();
|
||||||
|
expect(rendered).toBeTruthy();
|
||||||
|
});
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"expo": {
|
||||||
|
"sdkVersion": "25.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import { AppRegistry, StyleSheet, Text, View } from 'react-native';
|
||||||
|
|
||||||
|
let styles = {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LoginPage extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
userName: 'john@lyon-smith.org',
|
||||||
|
password: 'test123!'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<KeyboardAvoidingView className="view" behavior="padding">
|
||||||
|
<ScrollView>
|
||||||
|
<View className="logoBox">
|
||||||
|
<Image className="image" source={acmLogo}/>
|
||||||
|
</View>
|
||||||
|
<Text className="username">User Name:</Text>
|
||||||
|
<View className="fieldBlock">
|
||||||
|
<IconInput width={250} rounded={true} icon={iconEmail} onChange={value => this.setState({email: value})}
|
||||||
|
value={this.state.email} iconStyle={{width: 20, height: 24, top: 12}}/>
|
||||||
|
</View>
|
||||||
|
<View className="fieldBlock">
|
||||||
|
<IconInput
|
||||||
|
password={true}
|
||||||
|
rounded={true}
|
||||||
|
width={250}
|
||||||
|
icon={iconPassword}
|
||||||
|
iconStyle={{left: 12, top: 8}}
|
||||||
|
onChange={value => this.setState({password: value})}
|
||||||
|
value={this.state.password}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View className="nextBlock">
|
||||||
|
<NextButton busy={auth.authInProgress} width={250} title="Log In" onPress={() => this.login()}/>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{errorMessage}
|
||||||
|
|
||||||
|
<TouchableOpacity onPress={() => this.toggleLoginData()}>
|
||||||
|
<View className="linksBlock">
|
||||||
|
<Text className="linksText">Sign Up</Text>
|
||||||
|
<Text className="linksTextRight">Forgot password?</Text>
|
||||||
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</ScrollView>
|
||||||
|
</KeyboardAvoidingView>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "DeightonAR",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"devDependencies": {
|
||||||
|
"react-native-scripts": "1.11.1",
|
||||||
|
"jest-expo": "25.0.0",
|
||||||
|
"react-test-renderer": "16.2.0"
|
||||||
|
},
|
||||||
|
"main": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "react-native-scripts start",
|
||||||
|
"eject": "react-native-scripts eject",
|
||||||
|
"android": "react-native-scripts android",
|
||||||
|
"ios": "react-native-scripts ios",
|
||||||
|
"test": "node node_modules/jest/bin/jest.js"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"preset": "jest-expo"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"expo": "^25.0.0",
|
||||||
|
"react": "16.2.0",
|
||||||
|
"react-native": "0.52.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "deighton-ar",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Deighton AR Training System",
|
||||||
|
"main": "index.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/KingstonSoftware/deighton-ar.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"deighton",
|
||||||
|
"training",
|
||||||
|
"ar",
|
||||||
|
"vr",
|
||||||
|
"maps"
|
||||||
|
],
|
||||||
|
"author": "Kingston Software Solutions",
|
||||||
|
"license": "ISC",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/KingstonSoftware/deighton-ar/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/KingstonSoftware/deighton-ar#readme"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
[ "env", {
|
||||||
|
"targets": {
|
||||||
|
"node": 8
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"transform-class-properties",
|
||||||
|
"transform-object-rest-spread"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
node_modules/
|
||||||
|
coverage/
|
||||||
|
dist/
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
logDir: '',
|
||||||
|
uri: {
|
||||||
|
mongo: 'mongodb://localhost/dar-v1',
|
||||||
|
amqp: 'amqp://localhost',
|
||||||
|
redis: 'redis://localhost',
|
||||||
|
},
|
||||||
|
api: {
|
||||||
|
port: '3001',
|
||||||
|
loginKey: '6508b427b3cc486498671cfd7967218bd6b95fbb42f5e17a112f4c9e9900057c',
|
||||||
|
uploadTimout: 3600,
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
senderEmail: 'support@kingstonsoftware.solutions',
|
||||||
|
maxEmailTokenAgeInHours: 36,
|
||||||
|
maxPasswordTokenAgeInHours: 3,
|
||||||
|
sendEmailDelayInSeconds: 3,
|
||||||
|
supportEmail: 'support@kingstonsoftware.solutions',
|
||||||
|
sendEmail: true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
awsConfig: {
|
||||||
|
accessKeyId: 'AKIAJUP6XRVYDAXNTUNA',
|
||||||
|
secretAccessKey: 'hbZpkr9QLMivVK5oIGlnSa18ivqAYBPTdoUFYDqt',
|
||||||
|
region: 'us-west-2'
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
logDir: '/var/log/deighton-ar',
|
||||||
|
api: {
|
||||||
|
port: '3001',
|
||||||
|
loginKey: '*',
|
||||||
|
uploadTimout: 120,
|
||||||
|
maxEmailTokenAgeInHours: 36,
|
||||||
|
sendEmailDelayInSeconds: 3
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Email Templates
|
||||||
|
|
||||||
|
This directory contains the email templates used for various communications with the user. The list of templates is as follows:
|
||||||
|
|
||||||
|
| File Name | Description
|
||||||
|
|:------------ |:-----------
|
||||||
|
`welcome.txt/.html` | Sent to users when they are first added to the system. Should include welcome message, link to email confirmation page and notification of link expiration and support email.
|
||||||
|
`forgotPassword.txt/.html` | Sent to users when they click on the forgot password link. Should include the link to the reset and support email. Rate limited in production.
|
||||||
|
`changeEmailNew.txt/.html` | Sent to the old email of existing users when they are changing their email. Should include support email and the new email.
|
||||||
|
`changeEmailOld.txt/.html` | Sent to existing users when they are changing their email. Should include the link to email confirmation page and support email.
|
||||||
|
`accountDeleted.txt/.html` | Notification that the users account has been deleted from the system. Must include a support email.
|
||||||
|
|
||||||
|
Each template must have a text (`.txt`) version and can also have an HTML (`.html`) version. Both will be sent and it is up to the users email reader to decide which to use.
|
||||||
|
|
||||||
|
## List of Supported Data Fields
|
||||||
|
|
||||||
|
This is the the definitive list of supported data fields in emails.
|
||||||
|
|
||||||
|
Name | Value
|
||||||
|
---- | -----
|
||||||
|
`recipientFullName` | Full name of the user receiving the email
|
||||||
|
`confirmEmailLink` | URL that will take the user to confirming their email, and if necessary setting their password (for first time account setup.)
|
||||||
|
`confirmEmailLinkExpirationHours` | The number of hours before the given link expires
|
||||||
|
`senderFullName` | The full name of the user that initiated the action
|
||||||
|
`supportEmail` | The support email for the system
|
||||||
|
`recipientNewEmail` | The new email that is being set for the user
|
||||||
|
`resetPasswordLink` | A link that allows the user to reset their password
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Hello {{recipientFullName}}.
|
||||||
|
|
||||||
|
This email is for your records to indicated that your account for the Deighton AR system has been deleted.
|
||||||
|
|
||||||
|
Please contact {{supportEmail}} if you have any questions.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
{{senderFullName}}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Hello {{recipientFullName}},
|
||||||
|
|
||||||
|
This message allows you to complete the process of changing your email. If you did not make this request please do not worry. Just ignore this email and your account will remain unchanged.
|
||||||
|
|
||||||
|
If you did make this request, please click on the following link to confirm your new email:
|
||||||
|
|
||||||
|
{{confirmEmailLink}}
|
||||||
|
|
||||||
|
If you have any questions, please contact us at {{supportEmail}}.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
Deighton
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Hello {{recipientFullName}},
|
||||||
|
|
||||||
|
This message is to inform you that a request was made to change your email to {{recipientNewEmail}}. If you did not make this request please do not worry. Just ignore this email and your account will remain unchanged.
|
||||||
|
|
||||||
|
If you did make this request, please see the message sent to your new email account for further instructions.
|
||||||
|
|
||||||
|
If you have any questions, please contact us at {{supportEmail}}.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
Deighton
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Hello {{recipientFullName}},
|
||||||
|
|
||||||
|
The following link will allow you to reset your password. Please paste it into your browser and you will be redirected to the Deighton AR site to set your new password:
|
||||||
|
|
||||||
|
{{resetPasswordLink}}
|
||||||
|
|
||||||
|
Please contact {{supportEmail}} if you have any questions or problems.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
Deighton
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
accountDeleted: {
|
||||||
|
heading: 'Deighton AR Account Deleted Notification',
|
||||||
|
text: 'accountDeleted.txt'
|
||||||
|
},
|
||||||
|
changeEmailNew: {
|
||||||
|
heading: 'Deighton AR Change of Email Confirmation',
|
||||||
|
text: 'changeEmailNew.txt'
|
||||||
|
},
|
||||||
|
changeEmailOld: {
|
||||||
|
heading: 'Deighton AR Change of Email Request',
|
||||||
|
text: 'changeEmailOld.txt'
|
||||||
|
},
|
||||||
|
forgotPassword: {
|
||||||
|
heading: 'Deighton AR Password Reset Request',
|
||||||
|
text: 'forgotPassword.txt'
|
||||||
|
},
|
||||||
|
welcome: {
|
||||||
|
heading: 'Welcome to the Deighton AR System!',
|
||||||
|
text: 'welcome.txt'
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
Hello {{recipientFullName}},
|
||||||
|
|
||||||
|
Thank you for joining the Deighton AR system!
|
||||||
|
|
||||||
|
Please paste this link into your browser to go to the Deighton AR system and set your login password:
|
||||||
|
|
||||||
|
{{confirmEmailLink}}
|
||||||
|
|
||||||
|
This invitation expires in {{confirmEmailLinkExpirationHours}} hours. If it has expired or you have any problems creating a password or logging into our system, please contact {{supportEmail}}.
|
||||||
|
|
||||||
|
Thank you and we look forward to working with you!
|
||||||
|
|
||||||
|
Sincerely,
|
||||||
|
|
||||||
|
{{senderFullName}}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Deighton Service
|
||||||
|
After=rabbitmq-server.service mongod.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=ubuntu
|
||||||
|
Group=ubuntu
|
||||||
|
WorkingDirectory=/home/ubuntu/deighton-ar/server
|
||||||
|
Environment='NODE_ENV=production'
|
||||||
|
ExecStart=/usr/bin/node server/index.js
|
||||||
|
Restart=on-abort
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"name": "dar-server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Deighton AR Server",
|
||||||
|
"main": "src/server.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "babel-node src/index.js",
|
||||||
|
"start:prod": "NODE_ENV=production npm start",
|
||||||
|
"build": "babel src -d dist -s",
|
||||||
|
"serve": "NODE_ENV=production node dist/server.js",
|
||||||
|
"test": "jest",
|
||||||
|
"actor:api": "monzilla 'src/api/**/*.js:src/database/**/*.js' -- babel-node src/api/index.js",
|
||||||
|
"actor:api:debug": "babel-node --inspect-brk src/api/index.js",
|
||||||
|
"actor:image": "monzilla 'src/image/**/*.js:src/(message-service|database)/**/*.js' -- babel-node src/image/index.js",
|
||||||
|
"actor:image:debug": "babel-node --inspect-brk src/image/index.js",
|
||||||
|
"actor:email": "monzilla 'src/email/**/*.js:src/(message-service|database)/**/*.js' -- babel-node src/email/index.js",
|
||||||
|
"actor:email:debug": "babel-node --inspect-brk src/email/index.js"
|
||||||
|
},
|
||||||
|
"author": "John Lyon-Smith",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"amqplib": "^0.5.1",
|
||||||
|
"app-root-path": "^2.0.1",
|
||||||
|
"auto-bind2": "^1.0.3",
|
||||||
|
"aws-sdk": "^2.98.0",
|
||||||
|
"body-parser": "^1.17.1",
|
||||||
|
"canvas": "^1.6.7",
|
||||||
|
"config": "^1.25.1",
|
||||||
|
"cors": "^2.8.3",
|
||||||
|
"credential": "^2.0.0",
|
||||||
|
"eventemitter3": "^2.0.3",
|
||||||
|
"express": "^4.15.2",
|
||||||
|
"gridfs-stream": "^1.1.1",
|
||||||
|
"handlebars": "^4.0.10",
|
||||||
|
"http-errors": "^1.6.1",
|
||||||
|
"json5": "^0.5.1",
|
||||||
|
"jsonwebtoken": "^7.4.0",
|
||||||
|
"mongodb": "^2.2.31",
|
||||||
|
"mongoose": "^4.11.7",
|
||||||
|
"mongoose-merge-plugin": "0.0.5",
|
||||||
|
"nodemailer": "^4.0.1",
|
||||||
|
"passport": "^0.3.2",
|
||||||
|
"passport-http-bearer": "^1.0.1",
|
||||||
|
"pino": "^4.10.1",
|
||||||
|
"pino-pretty-express": "^1.0.4",
|
||||||
|
"redis": "^2.7.1",
|
||||||
|
"redis-rstream": "^0.1.3",
|
||||||
|
"regexp-pattern": "^1.0.4",
|
||||||
|
"replace-ext": "^1.0.0",
|
||||||
|
"socket.io": "^2.0.3",
|
||||||
|
"urlsafe-base64": "^1.0.0",
|
||||||
|
"uuid": "^3.1.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"babel-cli": "^6.24.1",
|
||||||
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||||
|
"babel-plugin-transform-object-rest-spread": "^6.23.0",
|
||||||
|
"babel-preset-env": "^1.5.2",
|
||||||
|
"istanbul": "^0.4.5",
|
||||||
|
"jest": "^21.1.0",
|
||||||
|
"monzilla": "^1.1.0"
|
||||||
|
},
|
||||||
|
"private": true,
|
||||||
|
"keywords": {
|
||||||
|
"0": "rest",
|
||||||
|
"1": "api",
|
||||||
|
"2": "deighton"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+ssh://git@github.com/KingstonSoftware/deighton-ar.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/KingstonSoftware/deighton-ar/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/KingstonSoftware/deighton-ar#readme"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
[ "env", {
|
||||||
|
"targets": {
|
||||||
|
"node": 8
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"transform-class-properties",
|
||||||
|
"transform-object-rest-spread"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
.DS_STORE
|
||||||
|
*.log
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
coverage
|
||||||
|
**/local*.json*
|
||||||
|
.idea/
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
import amqp from 'amqplib'
|
||||||
|
import uuidv4 from 'uuid/v4'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
|
||||||
|
export class MQ {
|
||||||
|
constructor(container) {
|
||||||
|
autoBind(this)
|
||||||
|
this.container = container
|
||||||
|
this.log = container.log
|
||||||
|
this.replyQueueName = `reply-${uuidv4()}`
|
||||||
|
this.appId = 'dar-api'
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(amqpUri) {
|
||||||
|
return amqp.connect(amqpUri).then((conn) => {
|
||||||
|
this.connection = conn
|
||||||
|
|
||||||
|
this.connection.on('error', () => {
|
||||||
|
this.log.error(`RabbitMQ has gone, shutting down service`)
|
||||||
|
process.exit(-1)
|
||||||
|
})
|
||||||
|
|
||||||
|
return conn.createChannel()
|
||||||
|
}).then((ch) => {
|
||||||
|
this.replyChannel = ch
|
||||||
|
|
||||||
|
return ch.assertQueue(this.replyQueueName, {exclusive: true})
|
||||||
|
}).then((q) => {
|
||||||
|
if (!q) {
|
||||||
|
return Promise.reject(new Error(`Could not create reply queue ${replyQueueName}`))
|
||||||
|
}
|
||||||
|
this.replyChannel.consume(q.queue, this.handleReply, {noAck: true})
|
||||||
|
|
||||||
|
return Promise.resolve(this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
handleReply(rawMsg) {
|
||||||
|
const { type, correlationId } = rawMsg.properties
|
||||||
|
const content = JSON.parse(rawMsg.content.toString())
|
||||||
|
const { error, data } = content
|
||||||
|
let { passback } = content
|
||||||
|
|
||||||
|
if (passback && passback.routerName && passback.funcName) {
|
||||||
|
const router = this.container[passback.routerName]
|
||||||
|
|
||||||
|
if (router) {
|
||||||
|
const func = router[passback.funcName]
|
||||||
|
|
||||||
|
if (func) {
|
||||||
|
// TODO: Try setting these to unknown instead as deleting fields break optimizations
|
||||||
|
delete passback.routerName
|
||||||
|
delete passback.funcName
|
||||||
|
passback.correlationId = correlationId
|
||||||
|
passback.type = type
|
||||||
|
|
||||||
|
func(passback, error, data)
|
||||||
|
} else {
|
||||||
|
this.log.error(`Router method '${passback.funcName}' not found`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.log.error(`Router '${passback.routerName}' not found`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
return this.replyChannel.close().then(() => {
|
||||||
|
this.connection.close()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
request(exchangeName, msgType, msgs) {
|
||||||
|
if (!Array.isArray(msgs)) {
|
||||||
|
msgs = [msgs]
|
||||||
|
}
|
||||||
|
|
||||||
|
let channel = null
|
||||||
|
const correlationId = uuidv4()
|
||||||
|
|
||||||
|
return this.connection.createChannel().then((ch) => {
|
||||||
|
channel = ch
|
||||||
|
return channel.checkExchange(exchangeName)
|
||||||
|
}).then((arr) => {
|
||||||
|
return Promise.all(msgs.map((msg) => (
|
||||||
|
channel.publish(exchangeName, '', new Buffer(JSON.stringify(msg)), {
|
||||||
|
type: msgType,
|
||||||
|
contentType: 'application/json',
|
||||||
|
timestamp: Date.now(),
|
||||||
|
correlationId,
|
||||||
|
appId: this.appId,
|
||||||
|
replyTo: this.replyQueueName
|
||||||
|
})
|
||||||
|
)))
|
||||||
|
}).then(() => {
|
||||||
|
return channel.close()
|
||||||
|
}).then(() => {
|
||||||
|
return Promise.resolve(correlationId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import redis from 'redis'
|
||||||
|
import util from 'util'
|
||||||
|
|
||||||
|
export class RS {
|
||||||
|
connect(redisUri) {
|
||||||
|
let client = redis.createClient(redisUri, { detect_buffers: true })
|
||||||
|
|
||||||
|
this.setAsync = util.promisify(client.set.bind(client))
|
||||||
|
this.getAsync = util.promisify(client.get.bind(client))
|
||||||
|
this.setrangeAsync = util.promisify(client.setrange.bind(client))
|
||||||
|
this.incrAsync = util.promisify(client.incr.bind(client))
|
||||||
|
this.expireAsync = util.promisify(client.expire.bind(client))
|
||||||
|
this.del = client.del.bind(client)
|
||||||
|
this.client = client
|
||||||
|
|
||||||
|
// The createClient call doesn't return a promise so we fake it
|
||||||
|
return Promise.resolve(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import IOServer from 'socket.io'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
|
||||||
|
export class WS {
|
||||||
|
constructor(container) {
|
||||||
|
this.log = container.log
|
||||||
|
this.io = new IOServer(container.server, { path: '/socketio' })
|
||||||
|
this.socketMap = {}
|
||||||
|
this.db = container.db
|
||||||
|
autoBind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
listen() {
|
||||||
|
// Starting listing handling connections
|
||||||
|
this.io.on('connection', this.handleConnection)
|
||||||
|
|
||||||
|
return Promise.resolve(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
handleConnection(socket) {
|
||||||
|
this.db.lookupToken(socket.handshake.query.auth_token, (err, user) => {
|
||||||
|
if (err || !user) {
|
||||||
|
this.log.warn(`socket.io client failed authentication and was disconnected`)
|
||||||
|
socket.disconnect()
|
||||||
|
} else {
|
||||||
|
this.socketMap[user._id] = socket.id
|
||||||
|
this.log.info(`socket.io client '${socket.id}' is connected`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
notify(roomNames, eventName, eventData) {
|
||||||
|
if (roomNames.length <= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let namespace = this.io.sockets
|
||||||
|
|
||||||
|
roomNames.forEach((roomName) => {
|
||||||
|
if (/[a-f0-9]{24}/.test(roomName)) {
|
||||||
|
const socketId = this.socketMap[roomName]
|
||||||
|
|
||||||
|
if (!socketId) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
roomName = socketId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace = namespace.in(roomName)
|
||||||
|
})
|
||||||
|
|
||||||
|
namespace.emit('notify', { eventName, eventData })
|
||||||
|
}
|
||||||
|
|
||||||
|
enterRoom(userId, newRoom) {
|
||||||
|
const socketId = this.socketMap[userId]
|
||||||
|
|
||||||
|
if (socketId) {
|
||||||
|
const socket = this.io.sockets.connected[socketId]
|
||||||
|
|
||||||
|
if (socket) {
|
||||||
|
const rooms = Object.keys(socket.rooms)
|
||||||
|
|
||||||
|
// We want to leave any rooms we are still in except the socket id room
|
||||||
|
rooms.filter((room) => (room !== socket.id)).forEach((room) => (socket.leave(room)))
|
||||||
|
|
||||||
|
if (newRoom) {
|
||||||
|
socket.join(newRoom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
import config from 'config'
|
||||||
|
import express from 'express'
|
||||||
|
import pino from 'pino'
|
||||||
|
import * as pinoExpress from 'pino-pretty-express'
|
||||||
|
import http from 'http'
|
||||||
|
import { DB } from '../database'
|
||||||
|
import { MQ } from './MQ'
|
||||||
|
import { RS } from './RS'
|
||||||
|
import { WS } from './WS'
|
||||||
|
import bodyParser from 'body-parser'
|
||||||
|
import cors from 'cors'
|
||||||
|
import passport from 'passport'
|
||||||
|
import { Strategy as BearerStrategy } from 'passport-http-bearer'
|
||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import * as Routes from './routes'
|
||||||
|
|
||||||
|
let app = express()
|
||||||
|
let server = http.createServer(app)
|
||||||
|
let container = { app, server }
|
||||||
|
const serviceName = 'dar-api'
|
||||||
|
const isProduction = (process.env.NODE_ENV == 'production')
|
||||||
|
let log = null
|
||||||
|
|
||||||
|
if (isProduction) {
|
||||||
|
log = pino( { name: serviceName },
|
||||||
|
fs.createWriteStream(path.join(config.get('logDir'), serviceName + '.log'))
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
const pretty = pinoExpress.pretty({})
|
||||||
|
pretty.pipe(process.stdout)
|
||||||
|
log = pino({ name: serviceName }, pretty)
|
||||||
|
}
|
||||||
|
|
||||||
|
container.log = log
|
||||||
|
app.use(pinoExpress.config({ log }))
|
||||||
|
app.set('etag', false) // Not wanted for _all_ routes. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag.
|
||||||
|
app.options('*', cors()) // Enable all pre-flight CORS requests
|
||||||
|
app.use(cors())
|
||||||
|
app.use(bodyParser.urlencoded({ extended: true }))
|
||||||
|
app.use(bodyParser.json())
|
||||||
|
app.use(bodyParser.raw({ type: 'application/octet-stream'})) // TODO: Support gzip, etc.. here
|
||||||
|
app.use(passport.initialize())
|
||||||
|
|
||||||
|
const rs = new RS(container)
|
||||||
|
container.rs = rs
|
||||||
|
const db = new DB(container)
|
||||||
|
container.db = db
|
||||||
|
const ws = new WS(container)
|
||||||
|
container.ws = ws
|
||||||
|
const mq = new MQ(container)
|
||||||
|
container.mq = mq
|
||||||
|
|
||||||
|
passport.use(new BearerStrategy(db.lookupToken))
|
||||||
|
|
||||||
|
let mongoUri = config.get('uri.mongo')
|
||||||
|
let amqpUri = config.get('uri.amqp')
|
||||||
|
let redisUri = config.get('uri.redis')
|
||||||
|
|
||||||
|
Promise.all([
|
||||||
|
db.connect(mongoUri, isProduction),
|
||||||
|
mq.connect(amqpUri),
|
||||||
|
rs.connect(redisUri),
|
||||||
|
ws.listen()
|
||||||
|
]).then(() => {
|
||||||
|
log.info(`Connected to MongoDB at ${mongoUri}`)
|
||||||
|
log.info(`Connected to RabbitMQ at ${amqpUri}`)
|
||||||
|
log.info(`Connected to Redis at ${redisUri}`)
|
||||||
|
|
||||||
|
try {
|
||||||
|
container.authRoutes = new Routes.AuthRoutes(container)
|
||||||
|
container.userRoutes = new Routes.UserRoutes(container)
|
||||||
|
container.assetRoutes = new Routes.AssetRoutes(container)
|
||||||
|
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
res.status(404).json({
|
||||||
|
message: 'Not found'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
app.use(function(err, req, res, next) {
|
||||||
|
if (!isProduction) {
|
||||||
|
log.error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!err.status) {
|
||||||
|
err = createError.InternalServerError(err.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(err.status).json({
|
||||||
|
message: err.message
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} catch(error) {
|
||||||
|
console.error(error)
|
||||||
|
process.exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
let port = config.get('api.port')
|
||||||
|
server.listen(port)
|
||||||
|
log.info(`Deight AR API started on port ${port}`)
|
||||||
|
}).catch((err) => {
|
||||||
|
log.error(err.message)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
import passport from 'passport'
|
||||||
|
import redis from 'redis'
|
||||||
|
import redisReadStream from 'redis-rstream'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import path from 'path'
|
||||||
|
import util from 'util'
|
||||||
|
import config from 'config'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
|
||||||
|
function pipeToGridFS(readable, gfsWriteable) {
|
||||||
|
const promise = new Promise((resolve, reject) => {
|
||||||
|
readable.on('error', (error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
gfsWriteable.on('error', (error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
gfsWriteable.on('close', (file) => {
|
||||||
|
resolve(file)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readable.pipe(gfsWriteable)
|
||||||
|
return promise
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AssetRoutes {
|
||||||
|
static rangeRegex = /^byte (\d+)/
|
||||||
|
|
||||||
|
constructor(container) {
|
||||||
|
const app = container.app
|
||||||
|
|
||||||
|
this.db = container.db
|
||||||
|
this.rs = container.rs
|
||||||
|
this.uploadTimeout = config.get('api.uploadTimout')
|
||||||
|
autoBind(this)
|
||||||
|
app.route('/assets/:_id')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.getAsset)
|
||||||
|
.delete(passport.authenticate('bearer', { session: false }), this.deleteAsset)
|
||||||
|
|
||||||
|
app.route('/assets/upload')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.beginAssetUpload)
|
||||||
|
|
||||||
|
app.route('/assets/upload/:_id')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.continueAssetUpload)
|
||||||
|
}
|
||||||
|
|
||||||
|
getAsset(req, res, next) {
|
||||||
|
const assetId = req.params._id
|
||||||
|
|
||||||
|
this.db.gridfs.findOneAsync({ _id: assetId }).then((file) => {
|
||||||
|
if (!file) {
|
||||||
|
return next(createError.NotFound(`Asset ${assetId} was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
const ifNoneMatch = req.get('If-None-Match')
|
||||||
|
|
||||||
|
if (ifNoneMatch && ifNoneMatch === file.md5) {
|
||||||
|
res.status(304).set({
|
||||||
|
'ETag': file.md5,
|
||||||
|
'Cache-Control': 'private,max-age=86400'
|
||||||
|
}).end()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(200).set({
|
||||||
|
'Content-Type': file.contentType,
|
||||||
|
'Content-Length': file.length,
|
||||||
|
'ETag': file.md5})
|
||||||
|
|
||||||
|
this.db.gridfs.createReadStream({ _id: file._id }).pipe(res)
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.BadRequest(`Error returning asset '${assetId}'. ${err.message}`))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteAsset(req, res, next) {
|
||||||
|
const assetId = req.params._id
|
||||||
|
|
||||||
|
this.db.gridfs.removeAsync({ _id: assetId }).then(() => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.BadRequest(`Unable to delete asset '${assetId}'. ${err.message}`))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
beginAssetUpload(req, res, next) {
|
||||||
|
const uploadId = this.db.newObjectId()
|
||||||
|
let { fileName, fileSize, numberOfChunks, contentType } = req.body
|
||||||
|
|
||||||
|
if (!fileName || !fileSize || !numberOfChunks || !contentType) {
|
||||||
|
return next(createError.BadRequest('Must specify fileName, fileSize, numberOfChunks and Content-Type header'))
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName = uploadId + '-' + path.basename(fileName)
|
||||||
|
|
||||||
|
this.rs.setAsync(
|
||||||
|
uploadId, JSON.stringify({
|
||||||
|
fileName, fileSize, numberOfChunks, contentType
|
||||||
|
}), 'EX', this.uploadTimeout).then(() => {
|
||||||
|
res.json({ uploadId })
|
||||||
|
}).catch((error) => {
|
||||||
|
next(createError.InternalServerError(error.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
continueAssetUpload(req, res, next) {
|
||||||
|
if (!(req.body instanceof Buffer)) {
|
||||||
|
return next(createError.BadRequest('Body must be of type application/octet-stream'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const range = req.get('Range')
|
||||||
|
const contentLength = req.get('Content-Length')
|
||||||
|
let match = range.match(AssetRoutes.rangeRegex)
|
||||||
|
let offset = null
|
||||||
|
|
||||||
|
if (!match || match.length < 2 || (offset = parseInt(match[1])) === NaN) {
|
||||||
|
return next(createError.BadRequest('Range header must be supplied and of form \'byte <offset>\''))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt(contentLength, 10) !== req.body.length) {
|
||||||
|
return next(createError.BadRequest('Must supply Content-Length header matching length of request body'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const uploadId = req.params._id
|
||||||
|
const uploadCountId = uploadId + '$#'
|
||||||
|
const uploadDataId = uploadId + '$@'
|
||||||
|
|
||||||
|
this.rs.getAsync(uploadId).then((content) => {
|
||||||
|
let uploadData = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
uploadData = JSON.parse(content)
|
||||||
|
} catch (error){
|
||||||
|
return Promise.reject(new Error('Could not parse upload data'))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset < 0 || offset + req.body.length > uploadData.fileSize) {
|
||||||
|
return Promise.reject(new Error(`Illegal range offset ${offset} given`))
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.all([
|
||||||
|
this.rs.setrangeAsync(uploadDataId, offset, req.body),
|
||||||
|
this.rs.incrAsync(uploadCountId)
|
||||||
|
]).then((arr) => {
|
||||||
|
const uploadedChunks = arr[1]
|
||||||
|
let chunkInfo = {
|
||||||
|
numberOfChunks: uploadData.numberOfChunks,
|
||||||
|
uploadedChunks
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uploadedChunks >= uploadData.numberOfChunks) {
|
||||||
|
let readable = redisReadStream(this.rs.client, Buffer(uploadDataId))
|
||||||
|
let writeable = this.db.gridfs.createWriteStream({
|
||||||
|
_id: uploadId,
|
||||||
|
filename: uploadData.fileName,
|
||||||
|
content_type: uploadData.contentType
|
||||||
|
})
|
||||||
|
|
||||||
|
let promise = pipeToGridFS(readable, writeable).then((file) => {
|
||||||
|
return Promise.all([
|
||||||
|
Promise.resolve(file),
|
||||||
|
this.rs.del(uploadId),
|
||||||
|
this.rs.del(uploadCountId),
|
||||||
|
this.rs.del(uploadDataId)
|
||||||
|
])
|
||||||
|
}).then((arr) => {
|
||||||
|
const [file] = arr
|
||||||
|
res.json({
|
||||||
|
assetId: file._id,
|
||||||
|
fileName: file.filename,
|
||||||
|
contentType: file.contentType,
|
||||||
|
uploadDate: file.uploadDate,
|
||||||
|
md5: file.md5,
|
||||||
|
...chunkInfo
|
||||||
|
})
|
||||||
|
}) // TODO: Test that this will be caught...
|
||||||
|
return promise
|
||||||
|
} else {
|
||||||
|
return Promise.all([
|
||||||
|
this.rs.expireAsync(uploadId, this.uploadTimeout),
|
||||||
|
this.rs.expireAsync(uploadCountId, this.uploadTimeout),
|
||||||
|
this.rs.expireAsync(uploadDataId, this.uploadTimeout)
|
||||||
|
]).then(() => {
|
||||||
|
res.json(chunkInfo)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
this.rs.del(uploadId)
|
||||||
|
this.rs.del(uploadCountId)
|
||||||
|
this.rs.del(uploadDataId)
|
||||||
|
console.error(error) // TODO: This should go into log file
|
||||||
|
next(createError.BadRequest('Unable to upload data chunk'))
|
||||||
|
})
|
||||||
|
}).catch((error) => {
|
||||||
|
console.error(error) // TODO: This should go into log file
|
||||||
|
next(createError.BadRequest(error.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,396 @@
|
|||||||
|
import passport from 'passport'
|
||||||
|
import credential from 'credential'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import config from 'config'
|
||||||
|
import crypto from 'crypto'
|
||||||
|
import urlSafeBase64 from 'urlsafe-base64'
|
||||||
|
import util from 'util'
|
||||||
|
import * as loginToken from './loginToken'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
import url from 'url'
|
||||||
|
|
||||||
|
export class AuthRoutes {
|
||||||
|
constructor(container) {
|
||||||
|
const app = container.app
|
||||||
|
|
||||||
|
this.mq = container.mq
|
||||||
|
this.db = container.db
|
||||||
|
this.maxEmailTokenAgeInHours = config.get('email.maxEmailTokenAgeInHours')
|
||||||
|
this.maxPasswordTokenAgeInHours = config.get('email.maxPasswordTokenAgeInHours')
|
||||||
|
this.sendEmailDelayInSeconds = config.get('email.sendEmailDelayInSeconds')
|
||||||
|
this.supportEmail = config.get('email.supportEmail')
|
||||||
|
this.sendEmail = config.get('email.sendEmail')
|
||||||
|
autoBind(this)
|
||||||
|
app.route('/auth/login')
|
||||||
|
// Used to login. Email must be confirmed.
|
||||||
|
.post(this.login)
|
||||||
|
// Used to logout
|
||||||
|
.delete(passport.authenticate('bearer', { session: false }), this.logout)
|
||||||
|
|
||||||
|
// Send change email confirmation email
|
||||||
|
app.route('/auth/email/send')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.sendChangeEmailEmail)
|
||||||
|
|
||||||
|
// Confirm email address
|
||||||
|
app.route('/auth/email/confirm')
|
||||||
|
.post(this.confirmEmail)
|
||||||
|
|
||||||
|
// Change the logged in users password, leaving user still logged in
|
||||||
|
app.route('/auth/password/change')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.changePassword)
|
||||||
|
|
||||||
|
// Send a password reset email
|
||||||
|
app.route('/auth/password/send')
|
||||||
|
.post(this.sendPasswordResetEmail)
|
||||||
|
|
||||||
|
// Finish a password reset
|
||||||
|
app.route('/auth/password/reset')
|
||||||
|
.post(this.resetPassword)
|
||||||
|
|
||||||
|
// Indicate who the currently logged in user is
|
||||||
|
app.route('/auth/who')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.whoAmI)
|
||||||
|
}
|
||||||
|
|
||||||
|
login(req, res, next) {
|
||||||
|
const email = req.body.email
|
||||||
|
const password = req.body.password
|
||||||
|
|
||||||
|
if (!email || !password) {
|
||||||
|
return next(new createError.BadRequest('Must supply user name and password'))
|
||||||
|
}
|
||||||
|
|
||||||
|
let User = this.db.User
|
||||||
|
|
||||||
|
// Lookup the user
|
||||||
|
User.findOne({ email }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
// NOTE: Don't return NotFound as that gives too much information away to hackers
|
||||||
|
return Promise.reject(createError.BadRequest("Email or password incorrect"))
|
||||||
|
} else if (user.emailToken || !user.passwordHash) {
|
||||||
|
return Promise.reject(createError.Forbidden("Must confirm email and set password"))
|
||||||
|
} else {
|
||||||
|
let cr = credential()
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
|
Promise.resolve(user),
|
||||||
|
cr.verify(JSON.stringify(user.passwordHash), req.body.password)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}).then((arr) => {
|
||||||
|
const [user, isValid] = arr
|
||||||
|
if (isValid) {
|
||||||
|
user.loginToken = loginToken.pack(user._id.toString(), user.email)
|
||||||
|
} else {
|
||||||
|
user.loginToken = null // A bad login removes existing token for this user...
|
||||||
|
}
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
if (savedUser.loginToken) {
|
||||||
|
res.set('Authorization', `Bearer ${savedUser.loginToken}`)
|
||||||
|
res.json(savedUser.toClient())
|
||||||
|
} else {
|
||||||
|
return Promise.reject(createError.BadRequest('Email or password incorrect'))
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(`Unable to login. ${err ? err.message : ''}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
logout(req, res, next) {
|
||||||
|
let User = this.db.User
|
||||||
|
|
||||||
|
User.findById({ _id: req.user._id }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
return next(createError.BadRequest())
|
||||||
|
}
|
||||||
|
|
||||||
|
user.loginToken = null
|
||||||
|
user.save().then((savedUser) => {
|
||||||
|
res.json({})
|
||||||
|
})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(`Unable to login. ${err ? err.message : ''}`))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
whoAmI(req, res, next) {
|
||||||
|
res.json(req.user.toClient())
|
||||||
|
}
|
||||||
|
|
||||||
|
sendChangeEmailEmail(req, res, next) {
|
||||||
|
let existingEmail = req.body.existingEmail
|
||||||
|
const newEmail = req.body.newEmail
|
||||||
|
let User = this.db.User
|
||||||
|
const role = req.user.role
|
||||||
|
const isAdminOrExec = (role === 'executive' || role === 'administrator')
|
||||||
|
|
||||||
|
if (existingEmail) {
|
||||||
|
if (!isAdminOrExec) {
|
||||||
|
return next(createError.Forbidden('Only admins can resend change email to any user'))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
existingEmail = req.user.email
|
||||||
|
}
|
||||||
|
|
||||||
|
let promiseArray = [User.findOne({ email: existingEmail })]
|
||||||
|
|
||||||
|
if (newEmail) {
|
||||||
|
promiseArray.push(User.findOne({ email: newEmail }))
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.all(promiseArray).then((arr) => {
|
||||||
|
const [user, conflictingUser] = arr
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
return Promise.reject(createError.NotFound(`User with email '${existingEmail}' was not found`))
|
||||||
|
} else if (conflictingUser) {
|
||||||
|
return Promise.reject(createError.BadRequest(`A user with '${newEmail}' already exists`))
|
||||||
|
} else if (!isAdminOrExec && user.emailToken && (new Date() - user.emailToken.created) < this.sendEmailDelayInSeconds) {
|
||||||
|
return Promise.reject(createError.BadRequest('Cannot request email confirmation again so soon'))
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all([Promise.resolve(user), util.promisify(crypto.randomBytes)(32)])
|
||||||
|
}).then((arr) => {
|
||||||
|
let [ user, buf ] = arr
|
||||||
|
|
||||||
|
user.emailToken = {
|
||||||
|
value: urlSafeBase64.encode(buf),
|
||||||
|
created: new Date()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newEmail) {
|
||||||
|
user.newEmail = newEmail
|
||||||
|
}
|
||||||
|
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
const userFullName = `${savedUser.firstName} ${savedUser.lastName}`
|
||||||
|
const siteUrl = url.parse(req.headers.referer)
|
||||||
|
let msgs = []
|
||||||
|
|
||||||
|
if (savedUser.newEmail) {
|
||||||
|
msgs.push({
|
||||||
|
toEmail: savedUser.email,
|
||||||
|
templateName: 'changeEmailOld',
|
||||||
|
templateData: {
|
||||||
|
recipientFullName: userFullName,
|
||||||
|
recipientNewEmail: savedUser.newEmail,
|
||||||
|
supportEmail: this.supportEmail
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
msgs.push({
|
||||||
|
toEmail: savedUser.newEmail || savedUser.email,
|
||||||
|
templateName: 'changeEmailNew',
|
||||||
|
templateData: {
|
||||||
|
recipientFullName: userFullName,
|
||||||
|
confirmEmailLink: `${siteUrl.protocol}//${siteUrl.host}/confirm-email?email-token%3D${savedUser.emailToken.value}`,
|
||||||
|
supportEmail: this.supportEmail
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return this.sendEmail ? this.mq.request('dar-email', 'sendEmail', msgs) : Promise.resolve()
|
||||||
|
}).then(() => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(`Unable to send change email email. ${err.message}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
confirmEmail(req, res, next) {
|
||||||
|
const token = req.body.emailToken
|
||||||
|
let User = this.db.User
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return next(createError.BadRequest('Invalid request parameters'))
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findOne({ 'emailToken.value': token }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
return Promise.reject(createError.BadRequest(`The token was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token must not be too old
|
||||||
|
const ageInHours = (new Date() - user.emailToken.created) / 3600000
|
||||||
|
|
||||||
|
if (ageInHours > this.maxEmailTokenAgeInHours) {
|
||||||
|
return Promise.reject(createError.BadRequest(`Token has expired`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the email token & any login token as it will become invalid
|
||||||
|
user.emailToken = undefined
|
||||||
|
user.loginToken = undefined
|
||||||
|
|
||||||
|
// Switch in any new email now
|
||||||
|
if (user.newEmail) {
|
||||||
|
user.email = user.newEmail
|
||||||
|
user.newEmail = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
let promiseArray = [ Promise.resolve(user) ]
|
||||||
|
|
||||||
|
if (!user.passwordHash) {
|
||||||
|
// User has no password, create reset token for them
|
||||||
|
promiseArray.push(util.promisify(crypto.randomBytes)(32))
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all(promiseArray)
|
||||||
|
}).then((arr) => {
|
||||||
|
let [ user, buf ] = arr
|
||||||
|
|
||||||
|
if (buf) {
|
||||||
|
user.passwordToken = {
|
||||||
|
value: urlSafeBase64.encode(buf),
|
||||||
|
created: new Date()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
let obj = {}
|
||||||
|
|
||||||
|
// Only because the user has sent us a valid email reset token can we respond with an password reset token
|
||||||
|
if (savedUser.passwordToken) {
|
||||||
|
obj.passwordToken = savedUser.passwordToken.value
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(obj)
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(`Unable to confirm set email token. ${err.message}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
resetPassword(req, res, next) {
|
||||||
|
const token = req.body.passwordToken
|
||||||
|
const newPassword = req.body.newPassword
|
||||||
|
let User = this.db.User
|
||||||
|
let cr = credential()
|
||||||
|
|
||||||
|
if (!token || !newPassword) {
|
||||||
|
return next(createError.BadRequest('Invalid request parameters'))
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findOne({ 'passwordToken.value': token }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
return Promise.reject(createError.BadRequest(`The token was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token must not be too old
|
||||||
|
const ageInHours = (new Date() - user.passwordToken.created) / (3600 * 1000)
|
||||||
|
|
||||||
|
if (ageInHours > this.maxPasswordTokenAgeInHours) {
|
||||||
|
return Promise.reject(createError.BadRequest(`Token has expired`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the password token & any login token
|
||||||
|
user.passwordToken = undefined
|
||||||
|
user.loginToken = undefined
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
|
Promise.resolve(user),
|
||||||
|
cr.hash(newPassword)
|
||||||
|
])
|
||||||
|
}).then((arr) => {
|
||||||
|
const [user, json] = arr
|
||||||
|
user.passwordHash = JSON.parse(json)
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(`Unable to confirm password reset token. ${err.message}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
changePassword(req, res, next) {
|
||||||
|
let User = this.db.User
|
||||||
|
let cr = credential()
|
||||||
|
User.findById({ _id: req.user._id }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
return next(createError.NotFound(`User ${req.user._id} not found`))
|
||||||
|
}
|
||||||
|
return Promise.all([
|
||||||
|
Promise.resolve(user),
|
||||||
|
cr.verify(JSON.stringify(user.passwordHash), req.body.oldPassword)
|
||||||
|
])
|
||||||
|
}).then((arr) => {
|
||||||
|
const [user, ok] = arr
|
||||||
|
return Promise.all([Promise.resolve(user), cr.hash(req.body.newPassword)])
|
||||||
|
}).then((arr) => {
|
||||||
|
const [user, obj] = arr
|
||||||
|
user.passwordHash = JSON.parse(obj)
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
return next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPasswordResetEmail(req, res, next){
|
||||||
|
const email = req.body.email
|
||||||
|
let User = this.db.User
|
||||||
|
|
||||||
|
if (!email) {
|
||||||
|
return next(createError.BadRequest('Invalid request parameters'))
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findOne({ email }).then((user) => {
|
||||||
|
// User must exist their email must be confirmed
|
||||||
|
if (!user || user.emailToken) {
|
||||||
|
// Don't give away any information about why we rejected the request
|
||||||
|
return Promise.reject(createError.BadRequest('Not a valid request'))
|
||||||
|
} else if (user.passwordToken && (new Date() - user.emailToken.created) < this.sendEmailDelayInSeconds) {
|
||||||
|
return Promise.reject(createError.BadRequest('Cannot request password reset so soon'))
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all([Promise.resolve(user), util.promisify(crypto.randomBytes)(32)])
|
||||||
|
}).then((arr) => {
|
||||||
|
let [ user, buf ] = arr
|
||||||
|
|
||||||
|
user.passwordToken = {
|
||||||
|
value: urlSafeBase64.encode(buf),
|
||||||
|
created: new Date()
|
||||||
|
}
|
||||||
|
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
const userFullName = `${savedUser.firstName} ${savedUser.lastName}`
|
||||||
|
const siteUrl = url.parse(req.headers.referer)
|
||||||
|
const msg = {
|
||||||
|
toEmail: savedUser.email,
|
||||||
|
templateName: 'forgotPassword',
|
||||||
|
templateData: {
|
||||||
|
recipientFullName: userFullName,
|
||||||
|
resetPasswordLink: `${siteUrl.protocol}//${siteUrl.host}/reset-password?password-token%3D${savedUser.passwordToken.value}`,
|
||||||
|
supportEmail: this.supportEmail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.sendEmail ? this.mq.request('dar-email', 'sendEmail', msg) : Promise.resolve()
|
||||||
|
}).then(() => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(`Unable to send password reset email. ${err.message}`))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,493 @@
|
|||||||
|
import passport from 'passport'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import { makeFingerprint } from '../makeFingerprint'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
|
||||||
|
export class ProjectRoutes {
|
||||||
|
constructor(container) {
|
||||||
|
const app = container.app
|
||||||
|
|
||||||
|
this.log = container.log
|
||||||
|
this.db = container.db
|
||||||
|
this.mq = container.mq
|
||||||
|
this.ws = container.ws
|
||||||
|
autoBind(this)
|
||||||
|
|
||||||
|
app.route('/projects')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.listProjects)
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.createProject)
|
||||||
|
.put(passport.authenticate('bearer', { session: false }), this.updateProject)
|
||||||
|
|
||||||
|
app.route('/projects/:_id([a-f0-9]{24})/broker/:brokerId([a-f0-9]{24})')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.getProjectBrokerClientData)
|
||||||
|
|
||||||
|
app.route('/projects/:_id([a-f0-9]{24})/broker/:brokerId([a-f0-9]{24})/sign-off')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.signOffProjectBrokerClientData)
|
||||||
|
|
||||||
|
app.route('/projects/:projectId([a-f0-9]{24})/create-packages')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.createProjectPackages)
|
||||||
|
|
||||||
|
app.route('/projects/:projectId([a-f0-9]{24})/reset-packages')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.resetProjectPackages)
|
||||||
|
|
||||||
|
app.route('/projects/:projectId([a-f0-9]{24})/build-pdfs')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.buildProjectPDFs)
|
||||||
|
|
||||||
|
app.route('/projects/:_id([a-f0-9]{24})')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.getProject)
|
||||||
|
.delete(passport.authenticate('bearer', { session: false }), this.deleteProject)
|
||||||
|
|
||||||
|
app.route('/projects/import-client-data')
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.importProjectClientData)
|
||||||
|
|
||||||
|
app.route('/projects/:_id([a-f0-9]{24})/populated')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.getPopulatedProject)
|
||||||
|
|
||||||
|
app.route('/projects/dashboard')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.listDashboardProjects)
|
||||||
|
|
||||||
|
app.route('/projects/broker/:_id([a-f0-9]{24})')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.listBrokerProjects)
|
||||||
|
}
|
||||||
|
|
||||||
|
listProjects(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
let limit = req.params.limit || 20
|
||||||
|
let skip = req.params.skip || 0
|
||||||
|
let partial = !!req.params.partial
|
||||||
|
let branch = req.params.branch
|
||||||
|
let query = {}
|
||||||
|
|
||||||
|
if (branch) {
|
||||||
|
query.branch = branch
|
||||||
|
}
|
||||||
|
|
||||||
|
Project.count({}).then((total) => {
|
||||||
|
let projects = []
|
||||||
|
let cursor = Project.find(query).limit(limit).skip(skip).cursor().map((doc) => {
|
||||||
|
return doc.toClient(partial)
|
||||||
|
})
|
||||||
|
|
||||||
|
cursor.on('data', (doc) => {
|
||||||
|
projects.push(doc)
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({
|
||||||
|
total: total,
|
||||||
|
offset: skip,
|
||||||
|
count: projects.length,
|
||||||
|
items: projects
|
||||||
|
})
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
listDashboardProjects(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
|
||||||
|
let projects = []
|
||||||
|
let cursor = Project.find({}).select('_id name fingerprint branch').populate({
|
||||||
|
path: 'branch', select: '_id name fingerprint corporation', populate: {
|
||||||
|
path: 'corporation', select: '_id name imageId fingerprint'
|
||||||
|
}
|
||||||
|
}).cursor()
|
||||||
|
|
||||||
|
cursor.on('data', (project) => {
|
||||||
|
projects.push(project)
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({
|
||||||
|
total: projects.length,
|
||||||
|
offset: 0,
|
||||||
|
count: projects.length,
|
||||||
|
items: projects
|
||||||
|
})
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
listBrokerProjects(req, res, next) {
|
||||||
|
const brokerId = req.params._id
|
||||||
|
const Project = this.db.Project
|
||||||
|
let projects = []
|
||||||
|
let cursor = Project.find({ brokers: brokerId }).select('_id name clientData').cursor()
|
||||||
|
|
||||||
|
cursor.on('data', (project) => {
|
||||||
|
projects.push(project)
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({
|
||||||
|
total: projects.length,
|
||||||
|
offset: 0,
|
||||||
|
count: projects.length,
|
||||||
|
items: projects
|
||||||
|
})
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
createProject(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
// If user's role is not Executive or Administrator, return an error
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new Project template then assign it to a value in the req.body
|
||||||
|
const Project = this.db.Project
|
||||||
|
let project = new Project(req.body)
|
||||||
|
|
||||||
|
project.fingerprint = makeFingerprint(project.name)
|
||||||
|
|
||||||
|
// Save the project (with promise) - If it doesnt, catch and throw error
|
||||||
|
project.save().then((newProject) => {
|
||||||
|
res.json(newProject.toClient())
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
updateProject(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
// If user's role is not Executive or Administrator, return an error
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return new createError.Forbidden()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do this here because Mongoose will add it automatically otherwise
|
||||||
|
if (!req.body._id) {
|
||||||
|
return next(createError.BadRequest('No _id given in body'))
|
||||||
|
}
|
||||||
|
|
||||||
|
let Project = this.db.Project
|
||||||
|
let projectUpdates = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
projectUpdates = new Project(req.body)
|
||||||
|
} catch (err) {
|
||||||
|
return next(createError.BadRequest('Invalid data'))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (projectUpdates.name) {
|
||||||
|
projectUpdates.fingerprint = makeFingerprint(projectUpdates.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
Project.findById(projectUpdates._id).then((foundProject) => {
|
||||||
|
if (!foundProject) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} was not found`))
|
||||||
|
}
|
||||||
|
foundProject.merge(projectUpdates)
|
||||||
|
return foundProject.save()
|
||||||
|
}).then((savedProject) => {
|
||||||
|
res.json(savedProject.toClient())
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
importProjectClientData(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'broker' && role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const { _id, brokerId, assetId } = req.body
|
||||||
|
|
||||||
|
if (!_id || !brokerId || !assetId) {
|
||||||
|
return next(createError.BadRequest('Must specify _id, brokerId and assetId'))
|
||||||
|
}
|
||||||
|
|
||||||
|
this.mq.request('dar-import', 'importClientData', {
|
||||||
|
projectId: _id,
|
||||||
|
brokerId: brokerId,
|
||||||
|
assetId: assetId,
|
||||||
|
passback: {
|
||||||
|
rooms: [ req.user._id ],
|
||||||
|
projectId: _id,
|
||||||
|
brokerId: brokerId,
|
||||||
|
routerName: 'projectRoutes',
|
||||||
|
funcName: 'completeImportClientData'
|
||||||
|
}
|
||||||
|
}).then((correlationId) => {
|
||||||
|
res.json({ correlationId })
|
||||||
|
}).catch((err) => {
|
||||||
|
// TODO: Should delete the asset
|
||||||
|
next(createError.InternalServerError('Unable to import uploaded file to project'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
completeImportClientData(passback, error, data) {
|
||||||
|
if (!passback.rooms) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let obj = {
|
||||||
|
brokerId: passback.brokerId,
|
||||||
|
projectId: passback.projectId,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
obj.problems = error.problems
|
||||||
|
obj.error = error.message
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ws.notify(passback.rooms, 'clientDataImportComplete', obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
getProject(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
const _id = req.params._id
|
||||||
|
|
||||||
|
Project.findById(_id).then((project) => {
|
||||||
|
if (!project) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(project.toClient())
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getPopulatedProject(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
const _id = req.params._id
|
||||||
|
|
||||||
|
Project.findById(_id).then((project) => {
|
||||||
|
if (!project) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
return project.populate({ path: 'brokers', select: '_id firstName lastName email thumbnailImageId t12 aum numHouseholds homePhone cellPhone' }).execPopulate()
|
||||||
|
}).then((project) => {
|
||||||
|
res.json(project.toClient())
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getProjectBrokerClientData(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
const _id = req.params._id
|
||||||
|
const brokerId = req.params.brokerId
|
||||||
|
|
||||||
|
Project.findById(_id).select('clientData').then((project) => {
|
||||||
|
if (!project) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!project.clientData) {
|
||||||
|
return res.json({})
|
||||||
|
}
|
||||||
|
|
||||||
|
const clientData = project.clientData.find(data => data.brokerId.toString() === brokerId)
|
||||||
|
|
||||||
|
if (clientData) {
|
||||||
|
res.json(clientData)
|
||||||
|
} else {
|
||||||
|
res.json({})
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
signOffProjectBrokerClientData(req, res, next) {
|
||||||
|
const Project = this.db.Project
|
||||||
|
const _id = req.params._id
|
||||||
|
const brokerId = req.params.brokerId
|
||||||
|
|
||||||
|
Project.findById(_id).then((project) => {
|
||||||
|
if (!project) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let clientData of project.clientData) {
|
||||||
|
if (clientData.brokerId && clientData.brokerId.toString() === brokerId) {
|
||||||
|
if (clientData.submitted || clientData.numProblems !== 0 || clientData.problems.length !== 0 || clientData.error) {
|
||||||
|
return next(createError.BadRequest(`Project ${_id}, broker ${brokerId} cannot be signed off at this time`))
|
||||||
|
}
|
||||||
|
|
||||||
|
clientData.submitted = new Date()
|
||||||
|
return project.save(project)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return next(createError.NotFound(`Client data for broker ${brokerId} was not found`))
|
||||||
|
}).then((savedProject) => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((error) => {
|
||||||
|
next(createError.InternalServerError(error.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
createProjectPackages(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const { projectId } = req.params
|
||||||
|
|
||||||
|
this.mq.request('dar-import', 'createPackages', {
|
||||||
|
projectId,
|
||||||
|
passback: {
|
||||||
|
rooms: [ req.user._id ], // TODO: Add a room for the specific project
|
||||||
|
projectId,
|
||||||
|
routerName: 'projectRoutes',
|
||||||
|
funcName: 'completeCreatePackageData'
|
||||||
|
}
|
||||||
|
}).then((correlationId) => {
|
||||||
|
res.json({ correlationId })
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError('Unable to create package data'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
resetProjectPackages(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const { projectId } = req.params
|
||||||
|
const Package = this.db.Package
|
||||||
|
const cursor = Package.find({ project: projectId }).cursor()
|
||||||
|
let totalPDFs = 0
|
||||||
|
let totalPackages = 0
|
||||||
|
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
cursor.on('data', (pkg) => {
|
||||||
|
pkg.remove().then((pkg) => {
|
||||||
|
if (pkg.assetId) {
|
||||||
|
totalPDFs += 1
|
||||||
|
return this.db.gridfs.remove({ _id: pkg.assetId })
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
|
||||||
|
totalPackages += 1
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
cursor.on('error', (error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
}).then(() => {
|
||||||
|
res.json({ totalPackages, totalPDFs })
|
||||||
|
}).catch((error) => {
|
||||||
|
next(createError.InternalServerError('Unable to delete all project packages'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
completeCreatePackageData(passback, error, data) {
|
||||||
|
if (!passback.rooms) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let obj = {
|
||||||
|
projectId: passback.projectId,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
obj.problems = error.problems
|
||||||
|
obj.error = error.message
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ws.notify(passback.rooms, 'packageGenerationComplete', obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
buildProjectPDFs(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const projectId = req.params.projectId
|
||||||
|
const Package = this.db.Package
|
||||||
|
let total = 0
|
||||||
|
let cursor = Package.find({ project: projectId }).cursor()
|
||||||
|
|
||||||
|
cursor.on('data', (pkg) => {
|
||||||
|
const packageId = pkg._id
|
||||||
|
this.mq.request('dar-pdf', 'createPackagePDF', {
|
||||||
|
packageId,
|
||||||
|
passback: {
|
||||||
|
rooms: [ req.user._id ], // TODO: Add a room for the specific project
|
||||||
|
packageId,
|
||||||
|
routerName: 'projectRoutes',
|
||||||
|
funcName: 'completeCreatePackagePDF'
|
||||||
|
}
|
||||||
|
}).then((correlationId) => {
|
||||||
|
res.json({ correlationId })
|
||||||
|
}).catch((err) => {
|
||||||
|
// TODO: Collect errors and return to user
|
||||||
|
})
|
||||||
|
total += 1
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({ total })
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
completeCreatePackagePDF(passback, error, data) {
|
||||||
|
if (!passback.rooms) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let obj = {
|
||||||
|
packageId: passback.packageId,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
obj.problems = error.problems
|
||||||
|
obj.error = error.message
|
||||||
|
} else {
|
||||||
|
obj.assetId = data.assetId
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ws.notify(passback.rooms, 'createPackagePDFComplete', obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteProject(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
// If user's role is not Executive or Administrator, return an error
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return new createError.Forbidden()
|
||||||
|
}
|
||||||
|
|
||||||
|
const Project = this.db.Project
|
||||||
|
const _id = req.params._id
|
||||||
|
|
||||||
|
Project.remove({ _id }).then((project) => {
|
||||||
|
if (!project) {
|
||||||
|
return next(createError.NotFound(`Project with _id ${_id} not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,339 @@
|
|||||||
|
import passport from 'passport'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import crypto from 'crypto'
|
||||||
|
import urlSafeBase64 from 'urlsafe-base64'
|
||||||
|
import url from 'url'
|
||||||
|
import util from 'util'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
import config from 'config'
|
||||||
|
|
||||||
|
export class UserRoutes {
|
||||||
|
constructor(container) {
|
||||||
|
const app = container.app
|
||||||
|
|
||||||
|
this.log = container.log
|
||||||
|
this.db = container.db
|
||||||
|
this.mq = container.mq
|
||||||
|
this.ws = container.ws
|
||||||
|
this.maxEmailTokenAgeInHours = config.get('email.maxEmailTokenAgeInHours')
|
||||||
|
this.sendEmail = config.get('email.sendEmail')
|
||||||
|
autoBind(this)
|
||||||
|
app.route('/users')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.listUsers)
|
||||||
|
// Add a new user, send email confirmation email
|
||||||
|
.post(passport.authenticate('bearer', { session: false }), this.createUser)
|
||||||
|
.put(passport.authenticate('bearer', { session: false }), this.updateUser)
|
||||||
|
|
||||||
|
app.route('/users/brokers')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.listBrokerUsers)
|
||||||
|
|
||||||
|
app.route('/users/:_id([a-f0-9]{24})')
|
||||||
|
.get(passport.authenticate('bearer', { session: false }), this.getUser)
|
||||||
|
.delete(passport.authenticate('bearer', { session: false }), this.deleteUser)
|
||||||
|
|
||||||
|
app.route('/users/set-image')
|
||||||
|
.put(passport.authenticate('bearer', { session: false }), this.setImage)
|
||||||
|
|
||||||
|
app.route('/users/enter-room/:roomName')
|
||||||
|
.put(passport.authenticate('bearer', { session: false }), this.enterRoom)
|
||||||
|
|
||||||
|
app.route('/users/leave-room')
|
||||||
|
.put(passport.authenticate('bearer', { session: false }), this.leaveRoom)
|
||||||
|
}
|
||||||
|
|
||||||
|
listUsers(req, res, next) {
|
||||||
|
const User = this.db.User
|
||||||
|
const limit = req.params.limit || 20
|
||||||
|
const skip = req.params.skip || 0
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
User.count({}).then((total) => {
|
||||||
|
let users = []
|
||||||
|
let cursor = User.find({}).limit(limit).skip(skip).cursor().map((doc) => {
|
||||||
|
return doc.toClient(req.user)
|
||||||
|
})
|
||||||
|
|
||||||
|
cursor.on('data', (doc) => {
|
||||||
|
users.push(doc)
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({
|
||||||
|
total: total,
|
||||||
|
offset: skip,
|
||||||
|
count: users.length,
|
||||||
|
items: users
|
||||||
|
})
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
listBrokerUsers(req, res, next) {
|
||||||
|
let User = this.db.User
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
let users = []
|
||||||
|
let cursor = User.find({ role: 'broker' })
|
||||||
|
.select('_id firstName lastName thumbnailImageId t12 aum numHouseholds cellPhone').cursor()
|
||||||
|
|
||||||
|
cursor.on('data', (doc) => {
|
||||||
|
users.push(doc)
|
||||||
|
})
|
||||||
|
cursor.on('end', () => {
|
||||||
|
res.json({
|
||||||
|
total: users.length,
|
||||||
|
offset: 0,
|
||||||
|
count: users.length,
|
||||||
|
items: users
|
||||||
|
})
|
||||||
|
})
|
||||||
|
cursor.on('error', (err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getUser(req, res, next) {
|
||||||
|
let User = this.db.User
|
||||||
|
const _id = req.params._id
|
||||||
|
const isSelf = (_id === req.user._id)
|
||||||
|
|
||||||
|
// User can see themselves, otherwise must be super user
|
||||||
|
if (!isSelf && role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findById(_id).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
return Promise.reject(createError.NotFound(`User with _id ${_id} was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(user.toClient(req.user))
|
||||||
|
}).catch((err) => {
|
||||||
|
if (err instanceof createError.HttpError) {
|
||||||
|
next(err)
|
||||||
|
} else {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
createUser(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
let User = this.db.User
|
||||||
|
let user = new User(req.body)
|
||||||
|
// Add email confirmation required token
|
||||||
|
util.promisify(crypto.randomBytes)(32).then((buf) => {
|
||||||
|
user.emailToken = {
|
||||||
|
value: urlSafeBase64.encode(buf),
|
||||||
|
created: new Date()
|
||||||
|
}
|
||||||
|
return user.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
const userFullName = `${savedUser.firstName} ${savedUser.lastName}`
|
||||||
|
const senderFullName = `${req.user.firstName} ${req.user.lastName}`
|
||||||
|
const siteUrl = url.parse(req.headers.referer)
|
||||||
|
const msg = {
|
||||||
|
toEmail: savedUser.email,
|
||||||
|
templateName: 'welcome',
|
||||||
|
templateData: {
|
||||||
|
recipientFullName: userFullName,
|
||||||
|
senderFullName: senderFullName,
|
||||||
|
confirmEmailLink: `${siteUrl.protocol}//${siteUrl.host}/confirm-email?email-token%3D${savedUser.emailToken.value}`,
|
||||||
|
confirmEmailLinkExpirationHours: this.maxEmailTokenAgeInHours,
|
||||||
|
supportEmail: this.supportEmail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.json(savedUser.toClient())
|
||||||
|
return this.sendEmail ? this.mq.request('dar-email', 'sendEmail', msg) : Promise.resolve()
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
updateUser(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
// Do this here because Mongoose will add it automatically otherwise
|
||||||
|
if (!req.body._id) {
|
||||||
|
return next(createError.BadRequest('No user _id given in body'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSelf = (req.body._id === req.user._id.toString())
|
||||||
|
|
||||||
|
// User can change themselves, otherwise must be super user
|
||||||
|
if (!isSelf && role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const User = this.db.User
|
||||||
|
let userUpdates = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
userUpdates = new User(req.body)
|
||||||
|
} catch (err) {
|
||||||
|
return next(createError.BadRequest('Invalid data'))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSelf && userUpdates.role && userUpdates.role !== req.user.role) {
|
||||||
|
return next(createError.BadRequest('Cannot modify own role'))
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findById(userUpdates._id).then((foundUser) => {
|
||||||
|
if (!foundUser) {
|
||||||
|
return Promise.reject(createError.NotFound(`User with _id ${user._id} was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't allow direct updates to the email field so remove it if present
|
||||||
|
delete userUpdates.email
|
||||||
|
|
||||||
|
foundUser.merge(userUpdates)
|
||||||
|
return foundUser.save()
|
||||||
|
}).then((savedUser) => {
|
||||||
|
res.json(savedUser.toClient(req.user))
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setImage(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
const { _id, imageId } = req.body
|
||||||
|
|
||||||
|
if (!_id || !imageId) {
|
||||||
|
return next(createError.BadRequest('Must specify _id and imageId'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const isSelf = (_id === req.user._id.toString())
|
||||||
|
|
||||||
|
// User can change themselves, otherwise must be super user
|
||||||
|
if (!isSelf && role !== 'executive' && role !== 'administrator') {
|
||||||
|
return next(new createError.Forbidden())
|
||||||
|
}
|
||||||
|
|
||||||
|
const { bigSize = {}, smallSize = {} } = req.body
|
||||||
|
|
||||||
|
Promise.all([
|
||||||
|
this.mq.request('dar-image', 'scaleImage', {
|
||||||
|
newWidth: bigSize.width || 200,
|
||||||
|
newHeight: bigSize.height || 200,
|
||||||
|
scaleMode: 'aspectFill',
|
||||||
|
inputAssetId: imageId,
|
||||||
|
passback: {
|
||||||
|
userId: _id,
|
||||||
|
rooms: [ req.user._id ],
|
||||||
|
routerName: 'userRoutes',
|
||||||
|
funcName: 'completeSetBigImage'
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
this.mq.request('dar-image', 'scaleImage', {
|
||||||
|
newWidth: smallSize.width || 25,
|
||||||
|
newHeight: smallSize.height || 25,
|
||||||
|
scaleMode: 'aspectFill',
|
||||||
|
inputAssetId: imageId,
|
||||||
|
passback: {
|
||||||
|
userId: _id,
|
||||||
|
rooms: [ req.user._id, 'users' ],
|
||||||
|
routerName: 'userRoutes',
|
||||||
|
funcName: 'completeSetSmallImage'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
]).then((correlationIds) => {
|
||||||
|
res.json({ correlationIds })
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError('Unable to scale user images'))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
completeSetBigImage(passback, error, data) {
|
||||||
|
if (error || !passback.userId || !passback.rooms) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const User = this.db.User
|
||||||
|
|
||||||
|
User.findByIdAndUpdate(passback.userId, { imageId: data.outputAssetId }).then((foundUser) => {
|
||||||
|
if (foundUser) {
|
||||||
|
this.ws.notify(passback.rooms, 'newProfileImage', { imageId: data.outputAssetId })
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
this.log.error(`Unable to notify [${passback.rooms.join(', ')}] of new image'`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
completeSetSmallImage(passback, error, data) {
|
||||||
|
if (error || !passback.userId || !passback.rooms) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const User = this.db.User
|
||||||
|
|
||||||
|
User.findByIdAndUpdate(passback.userId, { thumbnailImageId: data.outputAssetId }).then((foundUser) => {
|
||||||
|
if (foundUser) {
|
||||||
|
this.ws.notify(passback.rooms, 'newThumbnailImage', { imageId: data.outputAssetId })
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
this.log.error(`Unable to notify [${passback.rooms.join(', ')}] of new thumbnail image'`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
enterRoom(req, res, next) {
|
||||||
|
this.ws.enterRoom(req.user._id, req.params.roomName)
|
||||||
|
res.json({})
|
||||||
|
}
|
||||||
|
|
||||||
|
leaveRoom(req, res, next) {
|
||||||
|
this.ws.enterRoom(req.user._id)
|
||||||
|
res.json({})
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteUser(req, res, next) {
|
||||||
|
const role = req.user.role
|
||||||
|
|
||||||
|
if (role !== 'executive' && role !== 'administrator') {
|
||||||
|
return new createError.Forbidden()
|
||||||
|
}
|
||||||
|
|
||||||
|
let User = this.db.User
|
||||||
|
const _id = req.params._id
|
||||||
|
|
||||||
|
User.remove({ _id }).then((deletedUser) => {
|
||||||
|
if (!deletedUser) {
|
||||||
|
return next(createError.NotFound(`User with _id ${_id} was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
const userFullName = `${deletedUser.firstName} ${deletedUser.lastName}`
|
||||||
|
const senderFullName = `${req.user.firstName} ${req.user.lastName}`
|
||||||
|
const msg = {
|
||||||
|
toEmail: deletedUser.newEmail,
|
||||||
|
templateName: 'accountDeleted',
|
||||||
|
templateData: {
|
||||||
|
recipientFullName: userFullName,
|
||||||
|
senderFullName: senderFullName,
|
||||||
|
supportEmail: this.supportEmail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.sendEmail ? this.mq.request('dar-email', 'sendEmail', msg) : Promise.resolve()
|
||||||
|
}).then(() => {
|
||||||
|
res.json({})
|
||||||
|
}).catch((err) => {
|
||||||
|
next(createError.InternalServerError(err.message))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export { AuthRoutes } from './AuthRoutes'
|
||||||
|
export { AssetRoutes } from './AssetRoutes'
|
||||||
|
export { UserRoutes } from './UserRoutes'
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import jwt from 'jsonwebtoken'
|
||||||
|
import config from 'config'
|
||||||
|
import crypto from 'crypto'
|
||||||
|
|
||||||
|
let key = config.get('api.loginKey')
|
||||||
|
|
||||||
|
if (key == null || key == '*') {
|
||||||
|
key = crypto.randomBytes(32).toString('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
export function pack(id, email) {
|
||||||
|
let payload = {
|
||||||
|
prn: email,
|
||||||
|
jti: id.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV == 'production') {
|
||||||
|
payload.exp = Math.floor(Date.now() / 1000) + (60 * 60)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: For performance this should return a promise and sign async
|
||||||
|
return jwt.sign(payload, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function unpack(token) {
|
||||||
|
// TODO: For performance return promise and verify async
|
||||||
|
try {
|
||||||
|
let decoded = jwt.verify(token, key)
|
||||||
|
} catch (err) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: decoded.prn,
|
||||||
|
email: decoded.jti
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import mongoose from 'mongoose'
|
||||||
|
import mongodb from 'mongodb'
|
||||||
|
import Grid from 'gridfs-stream'
|
||||||
|
import merge from 'mongoose-merge-plugin'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
import * as Schemas from './schemas'
|
||||||
|
import util from 'util'
|
||||||
|
|
||||||
|
Grid.mongo = mongoose.mongo
|
||||||
|
|
||||||
|
export class DB {
|
||||||
|
constructor() {
|
||||||
|
mongoose.Promise = Promise
|
||||||
|
mongoose.plugin(merge)
|
||||||
|
|
||||||
|
autoBind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(mongoUri, isProduction) {
|
||||||
|
return mongoose.connect(mongoUri, { useMongoClient: true, config: { autoIndex: !isProduction } }).then((connection) => {
|
||||||
|
this.connection = connection
|
||||||
|
|
||||||
|
this.gridfs = Grid(connection.db)
|
||||||
|
this.gridfs.findOneAsync = util.promisify(this.gridfs.findOne)
|
||||||
|
this.gridfs.removeAsync = util.promisify(this.gridfs.remove)
|
||||||
|
|
||||||
|
this.User = connection.model('User', Schemas.userSchema)
|
||||||
|
this.WorkItem = connection.model('WorkItem', Schemas.workItemSchema)
|
||||||
|
|
||||||
|
return Promise.resolve(this)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
newObjectId(s) {
|
||||||
|
// If s is undefined, then a new ObjectID is created, else s is assumed to be a parsable ObjectID
|
||||||
|
return new mongodb.ObjectID(s).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
lookupToken(token, done) {
|
||||||
|
this.User.findOne({ 'loginToken': token }).then((user) => {
|
||||||
|
if (!user) {
|
||||||
|
done(null, false)
|
||||||
|
} else {
|
||||||
|
done(null, user)
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
done(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { DB } from './DB'
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export { workItemSchema } from './workItem'
|
||||||
|
export { userSchema } from './user'
|
||||||
|
export { teamSchema } from './team'
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import { Schema } from 'mongoose'
|
||||||
|
|
||||||
|
export let team = new Schema({
|
||||||
|
name: { type: String },
|
||||||
|
members: { type: Schema.Types.ObjectId, required: true },
|
||||||
|
}, { timestamps: true, id: false })
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { Schema } from 'mongoose'
|
||||||
|
import { regExpPattern } from 'regexp-pattern'
|
||||||
|
|
||||||
|
export let userSchema = new Schema({
|
||||||
|
_id: { type: Schema.Types.ObjectId, required: true, auto: true },
|
||||||
|
loginToken: { type: String, index: true, unique: true, sparse: true },
|
||||||
|
passwordHash: {
|
||||||
|
type: {
|
||||||
|
hash: String,
|
||||||
|
salt: String,
|
||||||
|
keyLength: Number,
|
||||||
|
hashMethod: String,
|
||||||
|
iterations: Number
|
||||||
|
}
|
||||||
|
},
|
||||||
|
email: { type: String, match: regExpPattern.email, required: true, index: true, unique: true },
|
||||||
|
newEmail: { type: String, match: regExpPattern.email },
|
||||||
|
imageId: { type: Schema.Types.ObjectId },
|
||||||
|
thumbnailImageId: { type: Schema.Types.ObjectId },
|
||||||
|
emailToken: {
|
||||||
|
type: {
|
||||||
|
value: { type: String, index: true, unique: true, sparse: true },
|
||||||
|
created: Date
|
||||||
|
}
|
||||||
|
},
|
||||||
|
passwordToken: {
|
||||||
|
type: {
|
||||||
|
value: { type: String, index: true, unique: true, sparse: true },
|
||||||
|
created: Date
|
||||||
|
}
|
||||||
|
},
|
||||||
|
firstName: { type: String, required: true },
|
||||||
|
lastName: { type: String, required: true },
|
||||||
|
role: { type: String, required: true, enum: {
|
||||||
|
values: [ 'administrator', 'normal'],
|
||||||
|
message: 'enum validator failed for path `{PATH}` with value `{VALUE}`'
|
||||||
|
}},
|
||||||
|
}, { timestamps: true, id: false })
|
||||||
|
|
||||||
|
userSchema.methods.toClient = function(authUser) {
|
||||||
|
if (authUser === undefined) {
|
||||||
|
authUser = this
|
||||||
|
}
|
||||||
|
|
||||||
|
let user = {
|
||||||
|
_id: this._id,
|
||||||
|
email: this.email,
|
||||||
|
emailValidated: (!!this.emailToken !== true),
|
||||||
|
imageId: this.imageId,
|
||||||
|
thumbnailImageId: this.thumbnailImageId,
|
||||||
|
firstName: this.firstName,
|
||||||
|
lastName: this.lastName,
|
||||||
|
role: this.role
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((authUser.role === 'administrator' || authUser.role === 'executive') || authUser._id.equals(this._id)) {
|
||||||
|
user.zip = this.zip
|
||||||
|
user.state = this.state
|
||||||
|
user.city = this.city
|
||||||
|
user.address1 = this.address1
|
||||||
|
user.address2 = this.address2
|
||||||
|
user.homePhone = this.homePhone
|
||||||
|
user.cellPhone = this.cellPhone
|
||||||
|
user.ssn = this.ssn
|
||||||
|
user.dateOfBirth = this.dateOfBirth
|
||||||
|
user.dateOfHire = this.dateOfHire
|
||||||
|
user.numHouseholds = this.numHouseholds
|
||||||
|
user.t12 = this.t12
|
||||||
|
user.aum = this.aum
|
||||||
|
}
|
||||||
|
|
||||||
|
return user
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import { Schema } from 'mongoose'
|
||||||
|
import { regExpPattern } from 'regexp-pattern'
|
||||||
|
|
||||||
|
export let workItemSchema = new Schema({
|
||||||
|
_id: { type: Schema.Types.ObjectId, required: true, auto: true },
|
||||||
|
workItemType: { type: String, required: true, enum: {
|
||||||
|
values: [ 'order', 'inspection', 'complaint'],
|
||||||
|
message: 'enum validator failed for path `{PATH}` with value `{VALUE}`'
|
||||||
|
}},
|
||||||
|
}, { timestamps: true, id: false })
|
||||||
|
|
||||||
|
workItemSchema.methods.toClient = function() {
|
||||||
|
return {
|
||||||
|
_id: this._id,
|
||||||
|
workItemType: this.workItemType
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
import fs from 'fs'
|
||||||
|
import util from 'util'
|
||||||
|
import path from 'path'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import nodemailer from 'nodemailer'
|
||||||
|
import handlebars from 'handlebars'
|
||||||
|
import appRoot from 'app-root-path'
|
||||||
|
import JSON5 from 'json5'
|
||||||
|
import aws from 'aws-sdk'
|
||||||
|
import config from 'config'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
|
||||||
|
export class EmailHandlers {
|
||||||
|
constructor(container) {
|
||||||
|
this.log = container.log
|
||||||
|
|
||||||
|
const templatesDir = path.join(appRoot.toString(), '/config/templates')
|
||||||
|
const templatesFile = path.join(templatesDir, 'templates.json5')
|
||||||
|
const defs = JSON5.parse(fs.readFileSync(templatesFile))
|
||||||
|
|
||||||
|
this.templates = {}
|
||||||
|
|
||||||
|
for (let name in defs) {
|
||||||
|
const def = defs[name]
|
||||||
|
const textFilename = path.join(templatesDir, def.text)
|
||||||
|
|
||||||
|
if (!fs.existsSync(textFilename)) {
|
||||||
|
this.log.error(`File '${textFilename}' specified in '${templatesFile}' does not exist`)
|
||||||
|
process.exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.templates[name] = {
|
||||||
|
heading: def.heading,
|
||||||
|
text: handlebars.compile(fs.readFileSync(textFilename).toString()),
|
||||||
|
html: def.html ? handlebars.compile(fs.readFileSync(def.html).toString()) : null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
autoBind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
sendEmail(options) {
|
||||||
|
const {
|
||||||
|
toEmail,
|
||||||
|
templateName,
|
||||||
|
templateData
|
||||||
|
} = options
|
||||||
|
|
||||||
|
if (!toEmail || !templateName || !templateData) {
|
||||||
|
return Promise.reject(createError.BadRequest(`Must specify toEmail, templateName and templateData`))
|
||||||
|
}
|
||||||
|
|
||||||
|
// configure AWS SDK
|
||||||
|
aws.config = new aws.Config(config.get('awsConfig'));
|
||||||
|
|
||||||
|
// create Nodemailer SES transporter
|
||||||
|
let transporter = nodemailer.createTransport({
|
||||||
|
SES: new aws.SES({
|
||||||
|
apiVersion: '2010-12-01'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const senderEmail = config.get('senderEmail')
|
||||||
|
const template = this.templates[templateName]
|
||||||
|
|
||||||
|
if (!template) {
|
||||||
|
return Promise.reject(createError.BadRequest(`Template '${templateName}' was not found`))
|
||||||
|
}
|
||||||
|
|
||||||
|
let mailObj = {
|
||||||
|
from: senderEmail,
|
||||||
|
to: toEmail,
|
||||||
|
subject: template.heading,
|
||||||
|
text: template.text(templateData)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (template.html) {
|
||||||
|
mailObj.html = template.html(templateData)
|
||||||
|
}
|
||||||
|
|
||||||
|
return transporter.sendMail(mailObj).then((info) => {
|
||||||
|
return Promise.resolve({
|
||||||
|
envelope: info.envelope,
|
||||||
|
messageId: info.messageId
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import config from 'config'
|
||||||
|
import pino from 'pino'
|
||||||
|
import * as pinoExpress from 'pino-pretty-express'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import { MS } from '../message-service'
|
||||||
|
import { EmailHandlers } from './EmailHandlers'
|
||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
|
||||||
|
const serviceName = 'dar-email'
|
||||||
|
const isProduction = (process.env.NODE_ENV == 'production')
|
||||||
|
let log = null
|
||||||
|
|
||||||
|
if (isProduction) {
|
||||||
|
log = pino( { name: serviceName },
|
||||||
|
fs.createWriteStream(path.join(config.get('logDir'), serviceName + '.log'))
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
const pretty = pinoExpress.pretty({})
|
||||||
|
pretty.pipe(process.stdout)
|
||||||
|
log = pino({ name: serviceName }, pretty)
|
||||||
|
}
|
||||||
|
|
||||||
|
const ms = new MS(serviceName, { durable: true }, log)
|
||||||
|
let container = { ms, log }
|
||||||
|
|
||||||
|
const amqpUri = config.get('uri.amqp')
|
||||||
|
|
||||||
|
ms.connect(amqpUri).then(() => {
|
||||||
|
log.info(`Connected to RabbitMQ at ${amqpUri}`)
|
||||||
|
|
||||||
|
container = {
|
||||||
|
...container,
|
||||||
|
handlers: new EmailHandlers(container)
|
||||||
|
}
|
||||||
|
|
||||||
|
ms.listen(container.handlers)
|
||||||
|
}).catch((err) => {
|
||||||
|
log.error(isProduction ? err.message : err)
|
||||||
|
})
|
||||||
@@ -0,0 +1,298 @@
|
|||||||
|
import Canvas from 'canvas'
|
||||||
|
import fs from 'fs'
|
||||||
|
import util from 'util'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
import stream from 'stream'
|
||||||
|
|
||||||
|
function streamToBuffer(readable) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
var chunks = []
|
||||||
|
var writeable = new stream.Writable()
|
||||||
|
|
||||||
|
writeable._write = function (chunk, enc, done) {
|
||||||
|
chunks.push(chunk)
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
|
||||||
|
readable.on('end', function () {
|
||||||
|
resolve(Buffer.concat(chunks))
|
||||||
|
})
|
||||||
|
|
||||||
|
readable.on('error', (err) => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
|
||||||
|
readable.pipe(writeable);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function pipeToGridFS(readable, gfsWriteable) {
|
||||||
|
const promise = new Promise((resolve, reject) => {
|
||||||
|
readable.on('error', (error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
gfsWriteable.on('error', (error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
gfsWriteable.on('close', (file) => {
|
||||||
|
resolve(file)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readable.pipe(gfsWriteable)
|
||||||
|
return promise
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadImage(buf) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const image = new Canvas.Image()
|
||||||
|
|
||||||
|
function cleanup () {
|
||||||
|
image.onload = null
|
||||||
|
image.onerror = null
|
||||||
|
}
|
||||||
|
|
||||||
|
image.onload = () => {
|
||||||
|
cleanup();
|
||||||
|
resolve(image)
|
||||||
|
}
|
||||||
|
image.onerror = () => {
|
||||||
|
cleanup();
|
||||||
|
reject(new Error(`Failed to load the image "${buf}"`))
|
||||||
|
}
|
||||||
|
|
||||||
|
image.src = buf
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Derived from https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images
|
||||||
|
function getExifOrientation(buf) {
|
||||||
|
if (buf.length < 2 || buf.readUInt16BE(0) != 0xFFD8) {
|
||||||
|
return -2
|
||||||
|
}
|
||||||
|
|
||||||
|
let length = buf.byteLength
|
||||||
|
let offset = 2
|
||||||
|
|
||||||
|
while (offset < length) {
|
||||||
|
let marker = buf.readUInt16BE(offset)
|
||||||
|
offset += 2
|
||||||
|
|
||||||
|
if (marker == 0xFFE1) {
|
||||||
|
if (buf.readUInt32BE(offset += 2) != 0x45786966) {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
let little = (buf.readUInt16BE(offset += 6) == 0x4949)
|
||||||
|
offset += (little ? buf.readUInt32LE(offset + 4) : buf.readUInt32BE(offset + 4))
|
||||||
|
|
||||||
|
const numTags = (little ? buf.readUInt16LE(offset) : buf.readUInt16BE(offset))
|
||||||
|
|
||||||
|
offset += 2
|
||||||
|
for (let i = 0; i < numTags; i++) {
|
||||||
|
let val = (little ? buf.readUInt16LE(offset + (i * 12)) : buf.readUInt16BE(offset + (i * 12)))
|
||||||
|
|
||||||
|
if (val === 0x0112) {
|
||||||
|
return (little ? buf.readUInt16LE(offset + (i * 12) + 8) : buf.readUInt16BE(offset + (i * 12) + 8))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ((marker & 0xFF00) != 0xFF00) {
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
offset += buf.readUInt16BE(offset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeOrientation(image, orientation) {
|
||||||
|
let width = image.width
|
||||||
|
let height = image.height
|
||||||
|
let canvas = new Canvas(width, height)
|
||||||
|
let ctx = canvas.getContext("2d")
|
||||||
|
|
||||||
|
if (4 < orientation && orientation < 9) {
|
||||||
|
canvas.width = height
|
||||||
|
canvas.height = width
|
||||||
|
} else {
|
||||||
|
canvas.width = width
|
||||||
|
canvas.height = height
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (orientation) {
|
||||||
|
case 2: ctx.transform(-1, 0, 0, 1, width, 0); break
|
||||||
|
case 3: ctx.transform(-1, 0, 0, -1, width, height ); break
|
||||||
|
case 4: ctx.transform(1, 0, 0, -1, 0, height ); break
|
||||||
|
case 5: ctx.transform(0, 1, 1, 0, 0, 0); break
|
||||||
|
case 6: ctx.transform(0, 1, -1, 0, height , 0); break
|
||||||
|
case 7: ctx.transform(0, -1, -1, 0, height , width); break
|
||||||
|
case 8: ctx.transform(0, -1, 1, 0, 0, width); break
|
||||||
|
default: return Promise.resolve(image)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.drawImage(image, 0, 0)
|
||||||
|
return loadImage(canvas.toBuffer())
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ImageHandlers {
|
||||||
|
constructor(container) {
|
||||||
|
this.db = container.db
|
||||||
|
this.log = container.log
|
||||||
|
autoBind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
scaleImage(options) {
|
||||||
|
const {
|
||||||
|
newWidth = 400,
|
||||||
|
newHeight = 100,
|
||||||
|
scaleMode = 'scaleToFill',
|
||||||
|
inputFile,
|
||||||
|
inputAssetId,
|
||||||
|
outputFile
|
||||||
|
} = options
|
||||||
|
|
||||||
|
if (!inputFile && !inputAssetId) {
|
||||||
|
return Promise.reject(createError.BadRequest(`No inputAssetId or inputFile given`))
|
||||||
|
}
|
||||||
|
|
||||||
|
let canvas = new Canvas(newWidth, newHeight)
|
||||||
|
let ctx = canvas.getContext("2d")
|
||||||
|
|
||||||
|
ctx.imageSmoothingEnabled = true
|
||||||
|
|
||||||
|
let loadPromise = null
|
||||||
|
|
||||||
|
if (inputFile) {
|
||||||
|
loadPromise = util.promisify(fs.readFile)(inputFile)
|
||||||
|
} else {
|
||||||
|
loadPromise = streamToBuffer(this.db.gridfs.createReadStream({ _id: inputAssetId }))
|
||||||
|
}
|
||||||
|
|
||||||
|
let orientation
|
||||||
|
|
||||||
|
return loadPromise.then((buf) => {
|
||||||
|
orientation = getExifOrientation(buf)
|
||||||
|
return loadImage(buf)
|
||||||
|
}).then((img) => {
|
||||||
|
return normalizeOrientation(img, orientation)
|
||||||
|
}).then((img) => {
|
||||||
|
let x = 0
|
||||||
|
let y = 0
|
||||||
|
let scale = 1
|
||||||
|
|
||||||
|
switch (scaleMode) {
|
||||||
|
case 'aspectFill':
|
||||||
|
if (img.width - newWidth > img.height - newHeight) {
|
||||||
|
scale = newHeight / img.height
|
||||||
|
x = -(img.width * scale - newWidth) / 2
|
||||||
|
} else {
|
||||||
|
scale = newWidth / img.width
|
||||||
|
y = -(img.height * scale - newHeight) / 2
|
||||||
|
}
|
||||||
|
ctx.drawImage(img, x, y, img.width * scale, img.height * scale)
|
||||||
|
break
|
||||||
|
case 'aspectFit':
|
||||||
|
if (img.width - newWidth > img.height - newHeight) {
|
||||||
|
scale = newWidth / img.width
|
||||||
|
y = (newHeight - img.height * scale) / 2
|
||||||
|
} else {
|
||||||
|
scale = newHeight / img.height
|
||||||
|
x = (newWidth - img.width * scale) / 2
|
||||||
|
}
|
||||||
|
ctx.drawImage(img, x, y, img.width * scale, img.height * scale)
|
||||||
|
break
|
||||||
|
case 'scaleToFill':
|
||||||
|
default:
|
||||||
|
ctx.drawImage(img, 0, 0, newWidth, newHeight)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
let savePromise = null
|
||||||
|
let readable = canvas.createPNGStream()
|
||||||
|
let writeable = null
|
||||||
|
|
||||||
|
if (outputFile) {
|
||||||
|
writeable = fs.createWriteStream(outputFile)
|
||||||
|
} else {
|
||||||
|
const _id = this.db.newObjectId()
|
||||||
|
writeable = this.db.gridfs.createWriteStream({
|
||||||
|
_id,
|
||||||
|
filename: _id + '.png',
|
||||||
|
content_type: 'image/png',
|
||||||
|
metadata: {
|
||||||
|
scaledFrom: this.db.newObjectId(inputAssetId),
|
||||||
|
width: newWidth,
|
||||||
|
height: newHeight
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipeToGridFS(readable, writeable).then((file) => {
|
||||||
|
let res = {}
|
||||||
|
if (outputFile) {
|
||||||
|
res.outputFile = outputFile
|
||||||
|
} else if (file) {
|
||||||
|
res.outputAssetId = file._id
|
||||||
|
}
|
||||||
|
return Promise.resolve(res)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
createPlaceholder(options) {
|
||||||
|
const {
|
||||||
|
width = 400,
|
||||||
|
height = 100,
|
||||||
|
fontSize = 36,
|
||||||
|
fontName = 'helvetica neue, arial black, sans serif',
|
||||||
|
fontWeight = 'bold',
|
||||||
|
background = '#1B1B1B',
|
||||||
|
foreground = '#333333',
|
||||||
|
outputFile
|
||||||
|
} = options
|
||||||
|
|
||||||
|
let canvas = new Canvas(width, height)
|
||||||
|
let ctx = canvas.getContext("2d")
|
||||||
|
const text = `${width}x${height}`
|
||||||
|
|
||||||
|
ctx.fillStyle = background
|
||||||
|
ctx.fillRect(0, 0, width, height)
|
||||||
|
|
||||||
|
ctx.font = `${fontWeight} ${fontSize}px ${fontName}`
|
||||||
|
ctx.fillStyle = foreground
|
||||||
|
const tm = ctx.measureText(text)
|
||||||
|
|
||||||
|
if (tm.width <= width / 2 && fontSize <= height / 2) {
|
||||||
|
ctx.textAlign = 'center'
|
||||||
|
ctx.textBaseline = 'middle'
|
||||||
|
ctx.fillText(text, width / 2, height / 2, width)
|
||||||
|
}
|
||||||
|
|
||||||
|
let promise = null
|
||||||
|
let readable = canvas.createPNGStream()
|
||||||
|
let writeable = null
|
||||||
|
|
||||||
|
if (outputFile) {
|
||||||
|
writeable = fs.createWriteStream(outputFile)
|
||||||
|
} else {
|
||||||
|
const _id = this.db.newObjectId()
|
||||||
|
writeable = this.db.gridfs.createWriteStream({
|
||||||
|
_id,
|
||||||
|
filename: `${width}x${height}.png`,
|
||||||
|
content_type: 'image/png',
|
||||||
|
metadata: {
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipeToGridFS(readable, writeable).then((file) => {
|
||||||
|
let res = {}
|
||||||
|
if (outputFile) {
|
||||||
|
res.outputFile = outputFile
|
||||||
|
} else if (file) {
|
||||||
|
res.outputAssetId = file._id
|
||||||
|
}
|
||||||
|
return Promise.resolve(res)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import config from 'config'
|
||||||
|
import pino from 'pino'
|
||||||
|
import * as pinoExpress from 'pino-pretty-express'
|
||||||
|
import { DB } from '../database'
|
||||||
|
import { MS } from '../message-service'
|
||||||
|
import { ImageHandlers } from './ImageHandlers'
|
||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
|
||||||
|
const serviceName = 'dar-image'
|
||||||
|
const isProduction = (process.env.NODE_ENV == 'production')
|
||||||
|
let log = null
|
||||||
|
|
||||||
|
if (isProduction) {
|
||||||
|
log = pino( { name: serviceName },
|
||||||
|
fs.createWriteStream(path.join(config.get('logDir'), serviceName + '.log'))
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
const pretty = pinoExpress.pretty({})
|
||||||
|
pretty.pipe(process.stdout)
|
||||||
|
log = pino({ name: serviceName }, pretty)
|
||||||
|
}
|
||||||
|
|
||||||
|
const ms = new MS(serviceName, { durable: false }, log)
|
||||||
|
const db = new DB()
|
||||||
|
let container = { db, ms, log }
|
||||||
|
const mongoUri = config.get('uri.mongo')
|
||||||
|
const amqpUri = config.get('uri.amqp')
|
||||||
|
|
||||||
|
Promise.all([
|
||||||
|
db.connect(mongoUri),
|
||||||
|
ms.connect(amqpUri)
|
||||||
|
]).then(() => {
|
||||||
|
log.info(`Connected to MongoDB at ${mongoUri}`)
|
||||||
|
log.info(`Connected to RabbitMQ at ${amqpUri}`)
|
||||||
|
|
||||||
|
container = {
|
||||||
|
...container,
|
||||||
|
handlers: new ImageHandlers(container)
|
||||||
|
}
|
||||||
|
|
||||||
|
ms.listen(container.handlers)
|
||||||
|
}).catch((err) => {
|
||||||
|
log.error(isProduction ? err.message : err)
|
||||||
|
})
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
import amqp from 'amqplib'
|
||||||
|
import autoBind from 'auto-bind2'
|
||||||
|
import createError from 'http-errors'
|
||||||
|
|
||||||
|
export class MS {
|
||||||
|
constructor(exchangeName, options, log) {
|
||||||
|
this.exchangeName = exchangeName
|
||||||
|
this.options = options || {}
|
||||||
|
this.isProduction = (process.env.NODE_ENV === 'production')
|
||||||
|
this.log = log
|
||||||
|
autoBind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
async connect(amqpUri) {
|
||||||
|
this.connection = await amqp.connect(amqpUri)
|
||||||
|
this.connection.on('error', () => {
|
||||||
|
this.log.error(`RabbitMQ has gone, shutting down service`)
|
||||||
|
process.exit(-1)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.channel = await this.connection.createChannel()
|
||||||
|
this.channel.prefetch(1) // Only process one message at a time
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
async listen(obj) {
|
||||||
|
let handlers = {}
|
||||||
|
let typeNames = ''
|
||||||
|
|
||||||
|
for (const key of Object.getOwnPropertyNames(obj.constructor.prototype)) {
|
||||||
|
const val = obj[key]
|
||||||
|
|
||||||
|
if (key !== 'constructor' && typeof val === 'function') {
|
||||||
|
handlers[key] = val
|
||||||
|
|
||||||
|
if (!typeNames) {
|
||||||
|
typeNames = `'${key}'`
|
||||||
|
} else {
|
||||||
|
typeNames += ', ' + `'${key}'`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.handlers = handlers
|
||||||
|
|
||||||
|
let ok = await this.channel.assertExchange(this.exchangeName, 'fanout', { durable: !!this.options.durable })
|
||||||
|
const q = await this.channel.assertQueue('', {exclusive: true})
|
||||||
|
|
||||||
|
this.log.info(`Waiting for '${this.exchangeName}' exchange ${typeNames} messages in queue '${q.queue}'`)
|
||||||
|
await this.channel.bindQueue(q.queue, this.exchangeName, '')
|
||||||
|
this.channel.consume(q.queue, this.consumeMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
consumeMessage(msg) {
|
||||||
|
const { type, appId, replyTo, correlationId } = msg.properties
|
||||||
|
const s = msg.content.toString()
|
||||||
|
const content = JSON.parse(s)
|
||||||
|
|
||||||
|
this.log.info(`Received '${type}' from '${appId}', ${s}`)
|
||||||
|
const sendReply = (replyContent) => {
|
||||||
|
if (content.passback) {
|
||||||
|
replyContent = { ...replyContent, passback: content.passback }
|
||||||
|
}
|
||||||
|
this.channel.sendToQueue(replyTo, new Buffer(JSON.stringify(replyContent)), {
|
||||||
|
correlationId,
|
||||||
|
appId,
|
||||||
|
contentType: 'application/json',
|
||||||
|
timestamp: Date.now(),
|
||||||
|
type: `replyTo.${type}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dispatchMessage(type, content).then((res) => {
|
||||||
|
sendReply({ data: res })
|
||||||
|
this.channel.ack(msg)
|
||||||
|
this.log.info(`Processed '${type}' (correlation id '${correlationId}')`)
|
||||||
|
}).catch((err) => {
|
||||||
|
this.log.error(`Failed to process '${type}' (correlation id '${correlationId}')`)
|
||||||
|
if (!this.isProduction) {
|
||||||
|
// So we can see what happened
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
sendReply({ error: { name: err.name, message: err.message, problems: err.problems } })
|
||||||
|
this.channel.ack(msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatchMessage(type, content) {
|
||||||
|
const handler = this.handlers[type]
|
||||||
|
|
||||||
|
if (handler) {
|
||||||
|
return handler(content)
|
||||||
|
} else {
|
||||||
|
return Promise.reject(createError.BadRequest(`Unknown message type '${type}'`))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used for intra-service requests, such as when generating packages
|
||||||
|
async request(exchangeName, msgType, msg, correlationId) {
|
||||||
|
const channel = await this.connection.createChannel()
|
||||||
|
await channel.checkExchange(exchangeName)
|
||||||
|
await channel.publish(exchangeName, '', new Buffer(JSON.stringify(msg)), {
|
||||||
|
type: msgType,
|
||||||
|
contentType: 'application/json',
|
||||||
|
timestamp: Date.now(),
|
||||||
|
correlationId,
|
||||||
|
appId: this.appId,
|
||||||
|
replyTo: this.replyQueueName
|
||||||
|
})
|
||||||
|
await channel.close()
|
||||||
|
|
||||||
|
return correlationId
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { MS } from './MS'
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import childProcess from 'child_process'
|
||||||
|
|
||||||
|
const actors = [ 'api', 'email', 'image' ]
|
||||||
|
|
||||||
|
// TODO: spawn index.js in each of these sub-directories
|
||||||
|
|
||||||
|
// TODO: If any child exits, wait for a back-off period and then restart
|
||||||
|
|
||||||
|
// TODO: Gradually increase back-off period if process fails again too quickly
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
|
||||||
|
# A special property that should be specified at the top of the file outside of
|
||||||
|
# any sections. Set to true to stop .editor config file search on current file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
# Indentation style
|
||||||
|
# Possible values - tab, space
|
||||||
|
indent_style = space
|
||||||
|
|
||||||
|
# Indentation size in single-spaced characters
|
||||||
|
# Possible values - an integer, tab
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
# Line ending file format
|
||||||
|
# Possible values - lf, crlf, cr
|
||||||
|
end_of_line = lf
|
||||||
|
|
||||||
|
# File character encoding
|
||||||
|
# Possible values - latin1, utf-8, utf-16be, utf-16le
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Denotes whether to trim whitespace at the end of lines
|
||||||
|
# Possible values - true, false
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
# Denotes whether file should end with a newline
|
||||||
|
# Possible values - true, false
|
||||||
|
insert_final_newline = true
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
blueprints/**/files/**
|
||||||
|
coverage/**
|
||||||
|
node_modules/**
|
||||||
|
dist/**
|
||||||
|
src/index.html
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"parser": "babel-eslint",
|
||||||
|
"extends": [
|
||||||
|
"standard",
|
||||||
|
"standard-react"
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"babel",
|
||||||
|
"react",
|
||||||
|
"promise"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"browser" : true
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"__DEV__" : false,
|
||||||
|
"__TEST__" : false,
|
||||||
|
"__PROD__" : false,
|
||||||
|
"__COVERAGE__" : false
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"key-spacing" : 0,
|
||||||
|
"jsx-quotes" : [2, "prefer-single"],
|
||||||
|
"object-curly-spacing" : [2, "always"],
|
||||||
|
"space-before-function-paren": ["error", "never"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
node_modules/
|
||||||
|
coverage/
|
||||||
|
dist/
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"main.css": "static/css/main.b7f40099.css",
|
||||||
|
"main.css.map": "static/css/main.b7f40099.css.map",
|
||||||
|
"main.js": "static/js/main.0feff0e8.js",
|
||||||
|
"main.js.map": "static/js/main.0feff0e8.js.map",
|
||||||
|
"static/media/extensive-tracking.jpg": "static/media/extensive-tracking.30e779c7.jpg",
|
||||||
|
"static/media/flags.png": "static/media/flags.9c74e172.png",
|
||||||
|
"static/media/icons.eot": "static/media/icons.674f50d2.eot",
|
||||||
|
"static/media/icons.svg": "static/media/icons.912ec66d.svg",
|
||||||
|
"static/media/icons.ttf": "static/media/icons.b06871f2.ttf",
|
||||||
|
"static/media/icons.woff": "static/media/icons.fee66e71.woff",
|
||||||
|
"static/media/icons.woff2": "static/media/icons.af7ae505.woff2",
|
||||||
|
"static/media/masthead-main.png": "static/media/masthead-main.d693e54f.png",
|
||||||
|
"static/media/on-site-support.jpg": "static/media/on-site-support.33bd1985.jpg",
|
||||||
|
"static/media/package-building.jpg": "static/media/package-building.a6760708.jpg",
|
||||||
|
"static/media/pre-transitioning.jpg": "static/media/pre-transitioning.3c463a20.jpg"
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 910 B |
@@ -0,0 +1 @@
|
|||||||
|
<!DOCTYPE html><html lang="en"><head><title>Transition Management Resources</title><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="shortcut icon" href="/favicon.png"><link href="/static/css/main.b7f40099.css" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="/static/js/main.0feff0e8.js"></script></body></html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["index.html","126facc11926a6f959086e2959a7770d"],["static/css/main.b7f40099.css","4fd28be2ca811a2f8586205d31a8d4ce"],["static/js/main.0feff0e8.js","85f38f3b5f4c9732f4b87d6226f21b2a"],["static/media/extensive-tracking.30e779c7.jpg","30e779c7aeb3f0930f0be1bba2793e46"],["static/media/flags.9c74e172.png","9c74e172f87984c48ddf5c8108cabe67"],["static/media/icons.674f50d2.eot","674f50d287a8c48dc19ba404d20fe713"],["static/media/icons.912ec66d.svg","912ec66d7572ff821749319396470bde"],["static/media/icons.af7ae505.woff2","af7ae505a9eed503f8b8e6982036873e"],["static/media/icons.b06871f2.ttf","b06871f281fee6b241d60582ae9369b9"],["static/media/icons.fee66e71.woff","fee66e712a8a08eef5805a46892932ad"],["static/media/masthead-main.d693e54f.png","d693e54ff591fe3586a5892ff490b8f9"],["static/media/on-site-support.33bd1985.jpg","33bd198571ce8fc479bceb92ea9ac445"],["static/media/package-building.a6760708.jpg","a676070868179299328607a1f91bed11"],["static/media/pre-transitioning.3c463a20.jpg","3c463a203156bbfbfb1331d8f2f8164b"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,a){var r=new URL(e);return a&&r.pathname.match(a)||(r.search+=(r.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),r.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],a=new URL(t,self.location),r=createCacheKey(a,hashParamName,n,/\.\w{8}\./);return[a.toString(),r]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var a=new Request(n,{credentials:"same-origin"});return fetch(a).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);t=urlsToCacheKeys.has(n);t||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],e.request.url)&&(n=new URL("/index.html",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}});
|
||||||
@@ -0,0 +1,355 @@
|
|||||||
|
@import url(https://fonts.googleapis.com/css?family=Montserrat);@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin);.App{text-align:center}@media screen and (max-width:768px){body,html{padding-top:4em}}#NavMenu{background-color:#1b1b1b;-webkit-box-shadow:0 0 20px 2px grey;box-shadow:0 0 20px 2px grey}#NavMenu a.item{color:#fff;-ms-flex-item-align:end;align-self:flex-end}#NavMenu a.item.nav-menu-active{background-color:#2d2b2b;height:100%}#NavMenu a.item.nav-menu-active:nth-child(n){border-bottom:.25em solid #cf414a}#NavMenu a.item.nav-menu-active:nth-child(2n){border-bottom:.25em solid #2185d0}#NavMenu a.item.nav-menu-active:nth-child(3n){border-bottom:.25em solid #db822e}#NavMenu a.item:hover{background-color:#444344}#NavMenu img.menu-logo{height:1em}#login-button{background-color:#3f62ab}#login-button,#logout-button{height:60%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;font-size:1em;margin:auto 1em}#logout-button{background-color:silver}.logged-in-user{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.logged-in-user a{color:silver;margin-right:1em}.logged-in-user a:hover{color:#fff}.logged-in-user .user-name{margin-left:.25em}#nav-item1{border-bottom:5px solid #2e4d9a}#nav-item2{border-bottom:5px solid #db822e}#nav-item3{border-bottom:5px solid #cf414a}#MobileNavMenu{border-radius:0!important;border-bottom:5px solid #db822e!important}@media screen and (max-width:992px){.user-name{display:none}}@media screen and (max-width:767px){#NavMenu{font-size:1em}#NavMenu a.item{text-align:center!important}.logged-in-user{width:100%;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:end;align-items:flex-end}.user-name{display:inline}.logged-in-user a{width:30%}#logout-button{width:30%;margin:1.5em .5em .5em 0}}#masthead{background-image:url(/static/media/masthead-main.d693e54f.png);background-position:50%;background-size:cover;height:35vh;margin:3em 0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}#masthead .banner{background-color:rgba(18,18,26,.75);padding:2em .5em;margin:2em 0}#masthead h1,#masthead h3{color:#fff;font-family:Montserrat,sans-serif}#masthead h1{font-size:3em;letter-spacing:5px;text-transform:uppercase}#masthead h3{font-size:1.5em;letter-spacing:1px;color:grey}@media screen and (max-width:767px){#masthead{height:25vh}#masthead h1{font-size:1.75em}#masthead h3{font-size:1em}#masthead .banner{margin:1rem 0!important;width:100%!important}}@media screen and (max-width:480px){#masthead{height:20vh}#masthead h1{font-size:1.125em;letter-spacing:2px}#masthead h3{font-size:.9em}}.home-icon{display:-ms-flexbox;display:flex;text-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column;padding:1em 0;color:rgba(0,0,0,.87)}.home-icon:hover{color:#db822e}@media screen and (max-width:768px){.home-icon i{font-size:2.5em!important}.home-icon h3{font-size:.9em!important}}@media screen and (max-width:480px){.home-icon i{font-size:2em!important}.home-icon h3{font-size:.85em!important}}.pamphlet-card{text-align:left;margin-top:2em}.pamphlet-card h2.align-left{border-left:5px solid #2e4d9a!important;padding-left:.5em!important}.pamphlet-card h2.align-right{border-right:5px solid #db822e!important;text-align:right;padding-right:.5em!important}.card-body{background-color:#f1f1f1;padding:1.25em;margin:1em 0}.card-body p{font-size:1.25em;line-height:1.4em;margin-bottom:1.5em}.card-body .list .item{margin:0;font-size:1.1em;line-height:1.35em}.card-body i{padding:1.25em 1em}img.pamphlet-image{margin-top:4.75em}.grid.card-list{margin-bottom:3em!important}#login .login-options{margin:1.5em 0 3em}#login .login-password{text-align:left}#login .login-checkbox{text-align:right}.react-flex-view{-webkit-box-sizing:"border-box";box-sizing:"border-box";min-width:0;min-height:0;display:flexbox;display:-ms-flexbox;display:flex;-webkit-box-flex-direction:row;-moz-box-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex-wrap:nowrap;-moz-box-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:stretch;flex-align:stretch;-webkit-align-items:stretch;-moz-box-align-items:stretch;-ms-align-items:stretch;align-items:stretch}.react-flex-view.flex-column{-webkit-box-flex-direction:column;-moz-box-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.react-flex-view.flex-wrap{-webkit-box-flex-wrap:wrap;-moz-box-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.react-flex-view.align-content-start{-ms-flex-align:start;flex-align:start;-webkit-align-items:flex-start;-moz-box-align-items:flex-start;-ms-align-items:flex-start;align-items:flex-start}.react-flex-view.align-content-center{-ms-flex-aliLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Reset
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Site
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/body,html{height:100%}html{font-size:14px}body{margin:0;overflow-x:hidden;min-width:320px;background:#fff;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87);font-smoothing:antialiased}body,h1,h2,h3,h4,h5{padding:0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif}h1,h2,h3,h4,h5{line-height:1.28571429em;margin:calc(2rem - .14285714em) 0 1rem;font-weight:700}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4}a,a:hover{text-decoration:none}a:hover{color:#1e70bf}::-webkit-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:hsla(0,0%,39%,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:hsla(0,0%,39%,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:hsla(0,0%,39%,.4);color:rgba(0,0,0,.87)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:hsla(202,5%,52%,.8)}body .ui.inverted::-webkit-scrollbar-track{background:hsla(0,0%,100%,.1)}body .ui.inverted::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.25)}body .ui.inverted::-webkit-scrollbar-thumb:window-inactive{background:hsla(0,0%,100%,.15)}body .ui.inverted::-webkit-scrollbar-thumb:hover{background:hsla(0,0%,100%,.35)}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Button
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-o-transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;will-change:"";-webkit-tap-highlight-color:transparent}.ui.button,.ui.button:hover{-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:inset 0 0 0 1px transparent,inset 0 0 0 0 rgba(34,36,38,.15)}.ui.button:hover{background-color:#cacbcd;background-image:none;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#cacbcd;color:rgba(0,0,0,.8);background-image:""!important;-webkit-box-shadow:""!important;box-shadow:""!important}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#babbbc;background-image:"";color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:inset 0 0 0 1px transparent,none}.ui.active.button{-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:inset 0 0 0 1px transparent}.ui.active.button,.ui.active.button:hover{color:rgba(0,0,0,.95)}.ui.active.button,.ui.active.button:active,.ui.active.button:hover{background-color:#c0c1c2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent!important;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;-o-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after,.ui.loading.button:before{position:absolute;content:"";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em}.ui.loading.button:after{-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}@-webkit-keyframes button-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes button-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-top-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button,.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;-o-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-tLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Container
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.container{display:block;max-width:100%!important}@media only screen and (max-width:767px){.ui.container{margin-left:1em!important;margin-right:1em!important}.ui.container,.ui.grid.container,.ui.relaxed.grid.container,.ui.very.relaxed.grid.container{width:auto!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.container{width:723px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(723px + 2rem)!important}.ui.relaxed.grid.container{width:calc(723px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(723px + 5rem)!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.container{width:933px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(933px + 2rem)!important}.ui.relaxed.grid.container{width:calc(933px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(933px + 5rem)!important}}@media only screen and (min-width:1200px){.ui.container{width:1127px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(1127px + 2rem)!important}.ui.relaxed.grid.container{width:calc(1127px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)!important}}.ui.text.container{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;max-width:700px!important;line-height:1.5;font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*="left aligned"].container{text-align:left}.ui[class*="center aligned"].container{text-align:center}.ui[class*="right aligned"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Divider
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid hsla(0,0%,100%,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:"";line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:"";display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:"";z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid hsla(0,0%,100%,.1);width:0;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:"";overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;-ms-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{position:static;left:0;border-left:none;border-right:none;content:"";display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#fff}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:hsla(0,0%,100%,.15)!important;border-right-color:hsla(0,0%,100%,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}.ui.divider{font-size:1rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Flag
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/i.flag:not(.icon){line-height:11px;vertical-align:baseline;margin:0 .5em 0 0;text-decoration:inherit;speak:none;font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.flag:not(.icon),i.flag:not(.icon):before{display:inline-block;width:16px;height:11px}i.flag:not(.icon):before{content:"";background:url(/static/media/flags.9c74e172.png) no-repeat -108px -1976px}i.flag.ad:before,i.flag.andorra:before{background-position:0 0}i.flag.ae:before,i.flag.uae:before,i.flag.united.arab.emirates:before{background-position:0 -26px}i.flag.af:before,i.flag.afghanistan:before{background-position:0 -52px}i.flag.ag:before,i.flag.antigua:before{background-position:0 -78px}i.flag.ai:before,i.flag.anguilla:before{background-position:0 -104px}i.flag.al:before,i.flag.albania:before{background-position:0 -130px}i.flag.am:before,i.flag.armenia:before{background-position:0 -156px}i.flag.an:before,i.flag.netherlands.antilles:before{background-position:0 -182px}i.flag.angola:before,i.flag.ao:before{background-position:0 -208px}i.flag.ar:before,i.flag.argentina:before{background-position:0 -234px}i.flag.american.samoa:before,i.flag.as:before{background-position:0 -260px}i.flag.at:before,i.flag.austria:before{background-position:0 -286px}i.flag.au:before,i.flag.australia:before{background-position:0 -312px}i.flag.aruba:before,i.flag.aw:before{background-position:0 -338px}i.flag.aland.islands:before,i.flag.ax:before{background-position:0 -364px}i.flag.az:before,i.flag.azerbaijan:before{background-position:0 -390px}i.flag.ba:before,i.flag.bosnia:before{background-position:0 -416px}i.flag.barbados:before,i.flag.bb:before{background-position:0 -442px}i.flag.bangladesh:before,i.flag.bd:before{background-position:0 -468px}i.flag.be:before,i.flag.belgium:before{background-position:0 -494px}i.flag.bf:before,i.flag.burkina.faso:before{background-position:0 -520px}i.flag.bg:before,i.flag.bulgaria:before{background-position:0 -546px}i.flag.bahrain:before,i.flag.bh:before{background-position:0 -572px}i.flag.bi:before,i.flag.burundi:before{background-position:0 -598px}i.flag.benin:before,i.flag.bj:before{background-position:0 -624px}i.flag.bermuda:before,i.flag.bm:before{background-position:0 -650px}i.flag.bn:before,i.flag.brunei:before{background-position:0 -676px}i.flag.bo:before,i.flag.bolivia:before{background-position:0 -702px}i.flag.br:before,i.flag.brazil:before{background-position:0 -728px}i.flag.bahamas:before,i.flag.bs:before{background-position:0 -754px}i.flag.bhutan:before,i.flag.bt:before{background-position:0 -780px}i.flag.bouvet.island:before,i.flag.bv:before{background-position:0 -806px}i.flag.botswana:before,i.flag.bw:before{background-position:0 -832px}i.flag.belarus:before,i.flag.by:before{background-position:0 -858px}i.flag.belize:before,i.flag.bz:before{background-position:0 -884px}i.flag.ca:before,i.flag.canada:before{background-position:0 -910px}i.flag.cc:before,i.flag.cocos.islands:before{background-position:0 -962px}i.flag.cd:before,i.flag.congo:before{background-position:0 -988px}i.flag.central.african.republic:before,i.flag.cf:before{background-position:0 -1014px}i.flag.cg:before,i.flag.congo.brazzaville:before{background-position:0 -1040px}i.flag.ch:before,i.flag.switzerland:before{background-position:0 -1066px}i.flag.ci:before,i.flag.cote.divoire:before{background-position:0 -1092px}i.flag.ck:before,i.flag.cook.islands:before{background-position:0 -1118px}i.flag.chile:before,i.flag.cl:before{background-position:0 -1144px}i.flag.cameroon:before,i.flag.cm:before{background-position:0 -1170px}i.flag.china:before,i.flag.cn:before{background-position:0 -1196px}i.flag.co:before,i.flag.colombia:before{background-position:0 -1222px}i.flag.costa.rica:before,i.flag.cr:before{background-position:0 -1248px}i.flag.cs:before,i.flag.serbia:before{background-position:0 -1274px}i.flag.cu:before,i.flag.cuba:before{background-position:0 -1300px}i.flag.cape.verde:before,i.flag.cv:before{background-position:0 -1326px}i.flag.christmas.island:before,i.flag.cx:before{background-position:0 -1352px}i.flag.cy:before,i.flag.cyprus:before{background-position:0 -1378px}i.flag.cz:before,i.flag.czech.republic:before{background-position:0 -1404px}i.flag.de:before,i.flag.germany:before{background-position:0 -1430px}i.flag.dj:before,i.flag.djibouti:before{background-position:0 -1456px}i.flag.denmark:before,i.flag.dk:before{background-position:0 -1482px}i.flag.dm:before,i.flag.dominica:before{background-position:0 -1508px}i.flag.do:before,i.flag.dominican.republic:before{background-position:0 -1534px}i.flag.algeria:before,i.flag.dz:before{background-position:0 -1560px}i.flag.ec:before,i.flag.ecuador:before{background-position:0 -1586px}i.flag.ee:before,i.flag.estonia:before{background-position:0 -1612px}i.flag.eg:before,i.flag.egypt:before{background-position:0 -1638px}i.flag.eh:before,i.flag.western.sahara:before{background-position:0 -1664px}i.flag.er:before,i.flag.eritrea:before{background-position:0 -1716px}i.flagLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Header
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.header{border:none;margin:calc(2rem - .14285714em) 0 1rem;padding:0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:700;line-height:1.28571429em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285714em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:0;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image:not(.icon),.ui.header>img{display:inline-block;margin-top:.14285714em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:not(.icon):only-child,.ui.header>img:only-child{margin-right:.75rem}.ui.header .content{display:inline-block;vertical-align:top}.ui.header>.icon+.content,.ui.header>.image+.content,.ui.header>img+.content{padding-left:.75rem;vertical-align:middle}.ui.header>.icon+.content{display:table-cell}.ui.header .ui.label{font-size:"";margin-left:.5rem;vertical-align:middle}.ui.header+p{margin-top:0}h1.ui.header{font-size:2rem}h2.ui.header{font-size:1.71428571rem}h3.ui.header{font-size:1.28571429rem}h4.ui.header{font-size:1.07142857rem}h5.ui.header{font-size:1rem}h1.ui.header .sub.header,h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header .sub.header,h4.ui.header .sub.header{font-size:1rem}h5.ui.header .sub.header{font-size:.92857143rem}.ui.huge.header{min-height:1em;font-size:2em}.ui.large.header{font-size:1.71428571em}.ui.medium.header{font-size:1.28571429em}.ui.small.header{font-size:1.07142857em}.ui.tiny.header{font-size:1em}.ui.huge.header .sub.header,.ui.large.header .sub.header{font-size:1.14285714rem}.ui.header .sub.header,.ui.small.header .sub.header{font-size:1rem}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;text-transform:uppercase;color:""}.ui.small.sub.header{font-size:.78571429em}.ui.sub.header{font-size:.85714286em}.ui.large.sub.header{font-size:.92857143em}.ui.huge.sub.header{font-size:1em}.ui.icon.header{display:inline-block;text-align:center;margin:2rem 0 1rem}.ui.icon.header:after{content:"";display:block;height:0;clear:both;visibility:hidden}.ui.icon.header:first-child{margin-top:0}.ui.icon.header .icon{float:none;width:auto;height:auto;line-height:1;font-size:3em;margin:0 auto .5rem;opacity:1}.ui.icon.header .content,.ui.icon.header .icon{display:block;padding:0}.ui.icon.header .circular.icon,.ui.icon.header .square.icon{font-size:2em}.ui.block.icon.header .icon{margin-bottom:0}.ui.icon.header.aligned{margin-left:auto;margin-right:auto;display:block}.ui.disabled.header{opacity:.45}.ui.inverted.header{color:#fff}.ui.inverted.header .sub.header{color:hsla(0,0%,100%,.8)}.ui.inverted.attached.header{border-color:transparent}.ui.inverted.attached.header,.ui.inverted.block.header{background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -o-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none}.ui.inverted.block.header{border-bottom:none}.ui.red.header{color:#db2828!important}a.ui.red.header:hover{color:#d01919!important}.ui.red.dividing.header{border-bottom:2px solid #db2828}.ui.inverted.red.header{color:#ff695e!important}a.ui.inverted.red.header:hover{color:#ff5144!important}.ui.orange.header{color:#f2711c!important}a.ui.orange.header:hover{color:#f26202!important}.ui.orange.dividing.header{border-bottom:2px solid #f2711c}.ui.inverted.orange.header{color:#ff851b!important}a.ui.inverted.orange.header:hover{color:#ff7701!important}.ui.olive.header{color:#b5cc18!important}a.ui.olive.header:hover{color:#a7bd0d!important}.ui.olive.dividing.header{border-bottom:2px solid #b5cc18}.ui.inverted.olive.header{color:#d9e778!important}a.ui.inverted.olive.header:hover{color:#d8ea5c!important}.ui.yellow.header{color:#fbbd08!important}a.ui.yellow.header:hover{color:#eaae00!important}.ui.yellow.dividing.header{border-bottom:2px solid #fbbd08}.ui.inverted.yellow.header{color:#ffe21f!important}a.ui.inverted.yellow.header:hover{color:#ffdf05!important}.ui.green.header{color:#21ba45!important}a.ui.green.header:hover{color:#16ab39!important}.ui.green.dividing.header{border-bottom:2px solid #21ba45}.ui.inverted.green.header{color:#2ecc40!important}a.ui.inverted.green.header:hover{color:#22be34!important}.ui.teal.header{color:#00b5ad!important}a.ui.teal.header:hover{color:#009c95!important}.ui.teal.dividing.header{border-bottom:2px solid #00b5ad}.ui.inverted.teal.header{color:#6dffff!important}a.ui.inverted.teal.header:hover{color:#54ffff!important}.ui.blue.header{color:#2185d0!important}a.ui.blue.header:hover{color:#1678c2!important}.ui.blue.dividing.header{border-bottom:2px solid #2185dLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Icon
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/@font-face{font-family:Icons;src:url(/static/media/icons.674f50d2.eot);src:url(/static/media/icons.674f50d2.eot?#iefix) format("embedded-opentype"),url(/static/media/icons.af7ae505.woff2) format("woff2"),url(/static/media/icons.fee66e71.woff) format("woff"),url(/static/media/icons.b06871f2.ttf) format("truetype"),url(/static/media/icons.912ec66d.svg#icons) format("svg");font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon{display:inline-block;opacity:1;margin:0 .25rem 0 0;width:1.18em;height:1em;font-family:Icons;font-style:normal;font-weight:400;text-decoration:inherit;text-align:center;speak:none;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.icon:before{background:0 0!important}i.icon.loading{height:1em;line-height:1;-webkit-animation:icon-loading 2s linear infinite;animation:icon-loading 2s linear infinite}@-webkit-keyframes icon-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes icon-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}i.emphasized.icon,i.icon.active,i.icon.hover{opacity:1!important}i.disabled.icon{opacity:.45!important}i.fitted.icon{width:auto;margin:0}i.link.icon,i.link.icons{cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;-o-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover,i.link.icons:hover{opacity:1!important}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:inset 0 0 0 .1em rgba(0,0,0,.1);width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.flipped.icon,i.horizontally.flipped.icon{-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}i.vertically.flipped.icon{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}i.clockwise.rotated.icon,i.right.rotated.icon,i.rotated.icon{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}i.counterclockwise.rotated.icon,i.left.rotated.icon{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}i.bordered.icon{line-height:1;vertical-align:baseline;width:2em;height:2em;padding:.5em .41em!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:inset 0 0 0 .1em rgba(0,0,0,.1)}i.bordered.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.inverted.bordered.icon,i.inverted.circular.icon{background-color:#1b1c1d!important;color:#fff!important}i.inverted.icon{color:#fff}i.red.icon{color:#db2828!important}i.inverted.red.icon{color:#ff695e!important}i.inverted.bordered.red.icon,i.inverted.circular.red.icon{background-color:#db2828!important;color:#fff!important}i.orange.icon{color:#f2711c!important}i.inverted.orange.icon{color:#ff851b!important}i.inverted.bordered.orange.icon,i.inverted.circular.orange.icon{background-color:#f2711c!important;color:#fff!important}i.yellow.icon{color:#fbbd08!important}i.inverted.yellow.icon{color:#ffe21f!important}i.inverted.bordered.yellow.icon,i.inverted.circular.yellow.icon{background-color:#fbbd08!important;color:#fff!important}i.olive.icon{color:#b5cc18!important}i.inverted.olive.icon{color:#d9e778!important}i.inverted.bordered.olive.icon,i.inverted.circular.olive.icon{background-color:#b5cc18!important;color:#fff!important}i.green.icon{color:#21ba45!important}i.inverted.green.icon{color:#2ecc40!important}i.inverted.bordered.green.icon,i.inverted.circular.green.icon{background-color:#21ba45!important;color:#fff!important}i.teal.icon{color:#00b5ad!important}i.inverted.teal.icon{color:#6dffff!important}i.inverted.bordered.teal.icon,i.inverted.circular.teal.icon{background-color:#00b5ad!important;color:#fff!important}i.blue.icon{color:#2185d0!important}i.inverted.blue.icon{color:#54c8ff!important}i.inverted.bordered.blue.icon,i.inverted.circular.blue.icon{background-color:#2185d0!important;color:#fff!important}i.violet.icon{color:#6435c9!important}i.inverted.violet.icon{color:#a291fb!important}i.inverted.bordered.violet.icon,i.inverted.circular.violet.icon{background-color:#6435c9!important;color:#fff!important}i.purple.icon{color:#a333c8!important}i.inverted.purple.icon{color:#dc73ff!important}i.inverted.bordered.purple.icon,i.inverted.circular.purple.icon{background-color:#a333c8!important;color:#fff!important}i.pink.icon{color:#e03997!important}i.inverted.pink.icon{color:#ff8edf!important}i.inverted.bordered.pink.icon,i.inverted.circular.pink.icon{background-color:#e03997!important;color:#fff!important}i.brown.icon{color:#a5673f!important}i.inverted.brown.icon{color:#d67c1c!important}i.inverted.bordered.brown.icon,i.inverted.circular.brown.icon{background-color:#a5673fLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Image
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.image,.ui.hidden.images{display:none}.ui.hidden.transition.image,.ui.hidden.transition.images{display:block;visibility:hidden}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.images .image,.ui.top.aligned.image svg{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.images .image,.ui.middle.aligned.image svg{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.images .image,.ui.bottom.aligned.image svg{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,.ui.bordered.image svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg,.ui.fluid.image svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg,.ui.avatar.image svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*="left spaced"].image{margin-left:.5em;margin-right:0}.ui[class*="right spaced"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.78571429rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem}.ui.images .image,.ui.images img,.ui.images svg{display:inline-block;margin:0 .25rem .5rem}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Input
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.input{position:relative;font-weight:400;font-style:normal;display:-ms-inline-flexbox;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input input{margin:0;max-width:100%;-ms-flex:1 0 auto;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.21428571em;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:box-shadow .1s ease,border-color .1s ease;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;-o-transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;box-shadow:none}.ui.input input::-webkit-input-placeholder{color:hsla(0,0%,75%,.87)}.ui.input input::-moz-placeholder{color:hsla(0,0%,75%,.87)}.ui.input input:-ms-input-placeholder{color:hsla(0,0%,75%,.87)}.ui.disabled.input,.ui.input:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.loading.loading.input>i.icon:before{border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after,.ui.loading.loading.input>i.icon:before{position:absolute;content:"";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em}.ui.loading.loading.input>i.icon:after{-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus input,.ui.input input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus input::-webkit-input-placeholder,.ui.input input:focus::-webkit-input-placeholder{color:hsla(0,0%,45%,.87)}.ui.input.focus input::-moz-placeholder,.ui.input input:focus::-moz-placeholder{color:hsla(0,0%,45%,.87)}.ui.input.focus input:-ms-input-placeholder,.ui.input input:focus:-ms-input-placeholder{color:hsla(0,0%,45%,.87)}.ui.input.error input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.input.error input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error input::-moz-placeholder{color:#e7bdbc}.ui.input.error input:-ms-input-placeholder{color:#e7bdbc!important}.ui.input.error input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error input:focus::-moz-placeholder{color:#da9796}.ui.input.error input:focus:-ms-input-placeholder{color:#da9796!important}.ui.transparent.input input{border-color:transparent!important;background-color:transparent!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important}.ui.transparent.icon.input>i.icon{width:1.1em}.ui.transparent.icon.input>input{padding-left:0!important;padding-right:2em!important}.ui.transparent[class*="left icon"].input>input{padding-left:2em!important;padding-right:0!important}.ui.transparent.inverted.input{color:#fff}.ui.transparent.inverted.input input{color:inherit}.ui.transparent.inverted.input input::-webkit-input-placeholder{color:hsla(0,0%,100%,.5)}.ui.transparent.inverted.input input::-moz-placeholder{color:hsla(0,0%,100%,.5)}.ui.transparent.inverted.input input:-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.icon.input input{padding-right:2.67142857em!important}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*="left icon"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="left icon"].input>i.circular.icon{right:auto;left:.5em}.ui[class*="left icon"].input>input{padding-left:2.67142857em!important;padding-right:1em!important}.ui.icon.input>input:focus~i.icon{opacity:1}.ui.labeled.input>.label{-ms-flex:0 0 auto;flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*="cLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Label
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#e8e8e8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;-o-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}.ui.label>a,a.ui.label{cursor:pointer}.ui.label>a{color:inherit;opacity:.5;-webkit-transition:opacity .1s ease;-o-transition:.1s opacity ease;transition:opacity .1s ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em!important}.ui.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;margin-right:0;margin-left:.5em;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;-o-transition:background .1s ease;transition:background .1s ease}.ui.label>.delete.icon:hover{opacity:1}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+[class*="right floated"]+*,.ui.top.attached.label:first-child+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label:first-child~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#e8e8e8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;-webkit-box-shadow:none;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;-o-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);-ms-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:"";background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;-o-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:"";top:50%;left:-.25em;margin-top:-.25em;background-color:#fff!important;width:.5em;height:.5em;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.corner.label{margin:0;padding:0;text-align:center;border-color:#e8e8e8;width:4em;height:4em;z-index:1}.ui.corner.label,.ui.corner.label:after{position:absolute;top:0;right:0;-webkit-transition:border-color .1s ease;-o-transition:border-color .1s ease;transition:border-color .1s ease;background-color:transparent!important}.ui.corner.label:after{content:"";z-index:-1;width:0;height:0;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit}.ui.corner.label .icon{cursor:default;position:relative;top:.64285714em;left:.78571429em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:-.78571429em}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:"";top:100%;left:0;background-color:transparent!important;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);paddinLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - List
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0}.ui.list:first-child,ol.ui.list:first-child,ul.ui.list:first-child{margin-top:0;padding-top:0}.ui.list:last-child,ol.ui.list:last-child,ul.ui.list:last-child{margin-bottom:0;padding-bottom:0}.ui.list .list>.item,.ui.list>.item,ol.ui.list li,ul.ui.list li{display:list-item;table-layout:fixed;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.list>.item:after,.ui.list>.list>.item,ol.ui.list>li:first-child:after,ul.ui.list>li:first-child:after{content:"";display:block;height:0;clear:both;visibility:hidden}.ui.list .list>.item:first-child,.ui.list>.item:first-child,ol.ui.list li:first-child,ul.ui.list li:first-child{padding-top:0}.ui.list .list>.item:last-child,.ui.list>.item:last-child,ol.ui.list li:last-child,ul.ui.list li:last-child{padding-bottom:0}.ui.list .list,ol.ui.list ol,ul.ui.list ul{clear:both;margin:0;padding:.75em 0 .25em .5em}.ui.list .list>.item,ol.ui.list ol li,ul.ui.list ul li{padding:.14285714em 0;line-height:inherit}.ui.list .list>.item>i.icon,.ui.list>.item>i.icon{display:table-cell;margin:0;padding-top:0;padding-right:.28571429em;vertical-align:top;-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.list .list>.item>i.icon:only-child,.ui.list>.item>i.icon:only-child{display:inline-block;vertical-align:top}.ui.list .list>.item>.image,.ui.list>.item>.image{display:table-cell;background-color:transparent;margin:0;vertical-align:top}.ui.list .list>.item>.image:not(:only-child):not(img),.ui.list>.item>.image:not(:only-child):not(img){padding-right:.5em}.ui.list .list>.item>.image img,.ui.list>.item>.image img{vertical-align:top}.ui.list .list>.item>.image:only-child,.ui.list .list>.item>img.image,.ui.list>.item>.image:only-child,.ui.list>.item>img.image{display:inline-block}.ui.list .list>.item>.content,.ui.list>.item>.content{line-height:1.14285714em}.ui.list .list>.item>.icon+.content,.ui.list .list>.item>.image+.content,.ui.list>.item>.icon+.content,.ui.list>.item>.image+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block}.ui.list .list>.item>.content>.list,.ui.list>.item>.content>.list{margin-left:0;padding-left:0}.ui.list .list>.item .header,.ui.list>.item .header{display:block;margin:0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.87)}.ui.list .list>.item .description,.ui.list>.item .description{display:block;color:rgba(0,0,0,.7)}.ui.list .list>.item a,.ui.list>.item a{cursor:pointer}.ui.list .list>a.item,.ui.list>a.item{cursor:pointer;color:#4183c4}.ui.list .list>a.item:hover,.ui.list>a.item:hover{color:#1e70bf}.ui.list .list>a.item i.icon,.ui.list>a.item i.icon{color:rgba(0,0,0,.4)}.ui.list .list>.item a.header,.ui.list>.item a.header{cursor:pointer;color:#4183c4!important}.ui.list .list>.item a.header:hover,.ui.list>.item a.header:hover{color:#1e70bf!important}.ui[class*="left floated"].list{float:left}.ui[class*="right floated"].list{float:right}.ui.list .list>.item [class*="left floated"],.ui.list>.item [class*="left floated"]{float:left;margin:0 1em 0 0}.ui.list .list>.item [class*="right floated"],.ui.list>.item [class*="right floated"]{float:right;margin:0 0 0 1em}.ui.menu .ui.list .list>.item,.ui.menu .ui.list>.item{display:list-item;table-layout:fixed;background-color:transparent;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.menu .ui.list .list>.item:before,.ui.menu .ui.list>.item:before{border:none;background:0 0}.ui.menu .ui.list .list>.item:first-child,.ui.menu .ui.list>.item:first-child{padding-top:0}.ui.menu .ui.list .list>.item:last-child,.ui.menu .ui.list>.item:last-child{padding-bottom:0}.ui.horizontal.list{display:inline-block;font-size:0}.ui.horizontal.list>.item{display:inline-block;margin-left:1em;font-size:1rem}.ui.horizontal.list:not(.celled)>.item:first-child{margin-left:0!important;padding-left:0!important}.ui.horizontal.list .list{padding-left:0;padding-bottom:0}.ui.horizontal.list .list>.item>.content,.ui.horizontal.list .list>.item>.icon,.ui.horizontal.list .list>.item>.image,.ui.horizontal.list>.item>.content,.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.image{vertical-align:middle}.ui.horizontal.list>.item:first-child,.ui.horizontal.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.horizontal.list>.item>i.icon{margin:0;padding:0 .25em 0 0}.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.icon+.content{float:none;display:inline-block}.ui.list .list>.disabled.item,.ui.list>.disabled.item{pointer-events:none;color:rgba(40,40,40,.3)!important}.ui.inverted.list .list>.disabled.item,.ui.inverted.list>.disabled.item{color:hsla(0,0%,88%,.3)!important}.ui.list .list>a.item:hover .icon,.ui.list>a.item:hover .icon{color:rgba(0,0,0,.87)}.ui.inverted.Line truncated
|
||||||
|
* # Semantic UI 2.2.12 - Loader
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after,.ui.loader:before{position:absolute;content:"";top:0;left:50%;width:100%;height:100%}.ui.loader:after{-webkit-animation:loader .6s linear;animation:loader .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}@-webkit-keyframes loader{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loader{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.ui.mini.loader:after,.ui.mini.loader:before{width:1rem;height:1rem;margin:0 0 0 -.5rem}.ui.tiny.loader:after,.ui.tiny.loader:before{width:1.14285714rem;height:1.14285714rem;margin:0 0 0 -.57142857rem}.ui.small.loader:after,.ui.small.loader:before{width:1.71428571rem;height:1.71428571rem;margin:0 0 0 -.85714286rem}.ui.loader:after,.ui.loader:before{width:2.28571429rem;height:2.28571429rem;margin:0 0 0 -1.14285714rem}.ui.large.loader:after,.ui.large.loader:before{width:3.42857143rem;height:3.42857143rem;margin:0 0 0 -1.71428571rem}.ui.big.loader:after,.ui.big.loader:before{width:3.71428571rem;height:3.71428571rem;margin:0 0 0 -1.85714286rem}.ui.huge.loader:after,.ui.huge.loader:before{width:4.14285714rem;height:4.14285714rem;margin:0 0 0 -2.07142857rem}.ui.massive.loader:after,.ui.massive.loader:before{width:4.57142857rem;height:4.57142857rem;margin:0 0 0 -2.28571429rem}.ui.dimmer .loader{display:block}.ui.dimmer .ui.loader{color:hsla(0,0%,100%,.9)}.ui.dimmer .ui.loader:before{border-color:hsla(0,0%,100%,.15)}.ui.dimmer .ui.loader:after{border-color:#fff transparent transparent}.ui.inverted.dimmer .ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer .ui.loader:before{border-color:rgba(0,0,0,.1)}.ui.inverted.dimmer .ui.loader:after{border-color:#767676 transparent transparent}.ui.text.loader{width:auto!important;height:auto!important;text-align:center;font-style:normal}.ui.indeterminate.loader:after{-webkit-animation-direction:reverse;animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.inverted.dimmer .ui.mini.loader,.ui.mini.loader{width:1rem;height:1rem;font-size:.78571429em}.ui.inverted.dimmer .ui.tiny.loader,.ui.tiny.loader{width:1.14285714rem;height:1.14285714rem;font-size:.85714286em}.ui.inverted.dimmer .ui.small.loader,.ui.small.loader{width:1.71428571rem;height:1.71428571rem;font-size:.92857143em}.ui.inverted.dimmer .ui.loader,.ui.loader{width:2.28571429rem;height:2.28571429rem;font-size:1em}.ui.inverted.dimmer .ui.large.loader,.ui.large.loader{width:3.42857143rem;height:3.42857143rem;font-size:1.14285714em}.ui.big.loader,.ui.inverted.dimmer .ui.big.loader{width:3.71428571rem;height:3.71428571rem;font-size:1.28571429em}.ui.huge.loader,.ui.inverted.dimmer .ui.huge.loader{width:4.14285714rem;height:4.14285714rem;font-size:1.42857143em}.ui.inverted.dimmer .ui.massive.loader,.ui.massive.loader{width:4.57142857rem;height:4.57142857rem;font-size:1.71428571em}.ui.mini.text.loader{min-width:1rem;padding-top:1.78571429rem}.ui.tiny.text.loader{min-width:1.14285714rem;padding-top:1.92857143rem}.ui.small.text.loader{min-width:1.71428571rem;padding-top:2.5rem}.ui.text.loader{min-width:2.28571429rem;padding-top:3.07142857rem}.ui.large.text.loader{min-width:3.42857143rem;padding-top:4.21428571rem}.ui.big.text.loader{min-width:3.71428571rem;padding-top:4.5rem}.ui.huge.text.loader{min-width:4.14285714rem;padding-top:4.92857143rem}.ui.massive.text.loader{min-width:4.57142857rem;padding-top:5.35714286rem}.ui.inverted.loader{color:hsla(0,0%,100%,.9)}.ui.inverted.loader:before{border-color:hsla(0,0%,100%,.15)}.ui.inverted.loader:after{border-top-color:#fff}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;-ms-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Rail
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%}.ui.left.internal.rail,.ui.right.rail{right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.rail{font-size:1rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Reveal
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.reveal{display:inherit;position:relative!important;font-size:0!important}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;-o-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;-o-transition:transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content,.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;-ms-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;-ms-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;-ms-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;-ms-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;-o-transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkiLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Segment
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header{color:#fff}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:"";box-shadow:"";z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:"";display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:"";box-shadow:""}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);-ms-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);-ms-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:"";position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.segment,.ui.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{border-top:none;margin-top:0;bottom:0;margin-bottom:0;top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem}.ui.segmenLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Step
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.steps{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:"";-webkit-box-shadow:none;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:-ms-flexbox;display:flex;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15)}.ui.steps .step,.ui.steps .step:after{-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;-o-transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:"";top:50%;right:0;border:medium none;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);-ms-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0;border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>.icon,.ui.steps .step>.icon~.content{display:block;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-item-align:middle;-ms-grid-row-align:middle;align-self:middle}.ui.steps .step>.icon~.content{-ms-flex-positive:1 0 auto;flex-grow:1 0 auto}.ui.steps:not(.vertical) .step>.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{position:static;text-align:center;content:counters(ordered,".");margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step:before,.ui.ordered.steps .step>*{display:block;-ms-flex-item-align:middle;-ms-grid-row-align:middle;align-self:middle}.ui.vertical.steps{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-ms-flex-pack:start;justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0;display:none}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767px){.ui.steps:not(.unstackable){display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-ms-flex-direction:column;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.steps:not(.unstackable) .step:after{display:none!important}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>.icon{margin:0 0 1rem}}.ui.steps .link.step:hover,.ui.steps .link.step:hover:after,.ui.steps a.step:hover,.ui.steps a.step:hover:after{background:#f9fafb;colLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Breadcrumb
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.breadcrumb{line-height:1;display:inline-block;margin:0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183c4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.78571429em 1em}.ui.breadcrumb .active.section{font-weight:700}.ui.mini.breadcrumb{font-size:.78571429rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.breadcrumb{font-size:1rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Form
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;line-height:1.21428571em;padding:.67857143em 1em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{margin:0;outline:0;-webkit-appearance:none;tap-highlight-color:hsla(0,0%,100%,0);font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:inset 0 0 0 0 transparent;-webkit-transition:color .1s ease,border-color .1s ease;-o-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea{padding:.78571429em 1em;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#fff;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:inset 0 0 0 0 transparent;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;-o-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{-ms-flex:1 0 auto;flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .success.message,.ui.form .warning.message{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#fff!important;border:1px solid #e0b4b4!important;color:#9f3a38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill,.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:inset 0 0 0 100px ivory!important}.ui.form .field.field input:-webkit-autofill:focus{border-color:#d5c315!important}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;box-shadow:inset 0 0 0 100px #fffaf0!important;border-color:#e0b4b4!important}.ui.form ::-webkit-input-placeholder{color:hsla(0,0%,75%,.87)}.ui.form :-ms-input-placeholder{color:hsla(0,0%,75%,.87)}.ui.form ::-moz-pLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Grid
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.grid{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;padding:0;margin:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*="very relaxed"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:inherit;justify-content:inherit;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{-ms-flex-positive:1;flex-grow:1;margin:1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;box-shadow:none}@media only screen and (max-width:767px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child,.ui[class*="one column"].grid>.column:not(.row),.ui[class*="one column"].grid>.row>.column{width:100%}.ui[class*="two column"].grid>.column:not(.row),.ui[class*="two column"].grid>.row>.column{width:50%}.ui[class*="three column"].grid>.column:not(.row),.ui[class*="three column"].grid>.row>.column{width:33.33333333%}.ui[class*="four column"].grid>.column:not(.row),.ui[class*="four column"].grid>.row>.column{width:25%}.ui[class*="five column"].grid>.column:not(.row),.ui[class*="five column"].grid>.row>.column{width:20%}.ui[class*="six column"].grid>.column:not(.row),.ui[class*="six column"].grid>.row>.column{width:16.66666667%}.ui[class*="seven column"].grid>.column:not(.row),.ui[class*="seven column"].grid>.row>.column{width:14.28571429%}.ui[class*="eight column"].grid>.column:not(.row),.ui[class*="eight column"].grid>.row>.column{width:12.5%}.ui[class*="nine column"].grid>.column:not(.row),.ui[class*="nine column"].grid>.row>.column{width:11.11111111%}.ui[class*="ten column"].grid>.column:not(.row),.ui[class*="ten column"].grid>.row>.column{width:10%}.ui[class*="eleven column"].grid>.column:not(.row),.ui[class*="eleven column"].grid>.row>.column{width:9.09090909%}.ui[class*="twelve column"].grid>.column:not(.row),.ui[class*="twelve column"].grid>.row>.column{width:8.33333333%}.ui[class*="thirteen column"].grid>.column:not(.row),.ui[class*="thirteen column"].grid>.row>.column{width:7.69230769%}.ui[class*="fourteen column"].grid>.column:not(.row),.ui[class*="fourteen column"].grid>.row>.column{width:7.14285714%}.ui[class*="fifteen column"].grid>.column:not(.row),.ui[class*="fifteen column"].grid>.row>.column{width:6.66666667%}.ui[class*="sixteen column"].grid>.column:not(.row),.ui[class*="sixteen column"].grid>.row>.column{width:6.25%}.ui.grid>[class*="one column"].row>.column{width:100%!important}.ui.grid>[class*="two column"].row>.column{width:50%!important}.ui.grid>[class*="three column"].row>.column{width:33.33333333%!important}.ui.grid>[class*="four column"].row>.column{width:25%!important}.ui.grid>[class*="five column"].row>.column{width:20%!important}.ui.grid>[class*="six column"].row>.column{width:16.66666667%!important}.ui.grid>[class*="seven column"].row>.column{width:14.28571429%!important}.ui.grid>[class*="eight column"].row>.column{width:12.5%!important}.ui.grid>[class*="nine column"].row>.column{width:11.11111111%!important}.ui.grid>[class*="ten column"].row>.column{width:10%!important}.ui.grid>[class*="eleven column"].row>.column{width:9.09090909%!important}.ui.grid>[class*="twelve column"].row>.column{width:8.33333333%!important}.ui.grid>[class*="thirteen column"].row>.column{width:7.69230769%!important}.ui.grid>[class*="fourteenLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Message
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.message{position:relative;min-height:1em;margin:1em 0;background:#f8f8f9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;-o-transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent;box-shadow:inset 0 0 0 1px rgba(34,36,38,.22),0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285714em 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:"\2022";left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;-o-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.compact.icon.message{display:-ms-inline-flexbox;display:inline-flex}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:inset 0 0 0 1px rgba(34,36,38,.15);margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15);box-shadow:inset 0 0 0 1px rgba(34,36,38,.15),0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:-ms-flexbox;display:flex;width:100%;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;-ms-flex:1 1 auto;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:inset 0 0 0 1px rgba(34,36,38,.22),0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.black.message{background-color:#1b1c1d;color:hsla(0,0%,100%,.9)}.ui.positive.message{background-color:#fcfff5;color:#2c662d}.ui.attached.positive.message,.ui.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:inset 0 0 0 1px #a3c293,0 0 0 0 transparent}.ui.positive.message .header{color:#1a531b}.ui.negative.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.negative.message,.ui.negative.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:inset 0 0 0 1px #e0b4b4,0 0 0 0 transparent}.ui.negative.message .header{color:#912d2b}.ui.info.message{background-color:#f8ffff;color:#276f86}.ui.attached.info.message,.ui.info.message{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent;box-shadow:inset 0 0 0 1px #a9d5de,0 0 0 0 transparent}.ui.info.message .header{color:#0e566c}.ui.warning.message{background-color:#fffaf3;color:#573a08}.ui.attached.warning.message,.ui.warning.message{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent;box-shadow:inset 0 0 0 1px #c9ba9b,0 0 0 0 transparent}.ui.warning.message .header{color:#794b02}.ui.error.message{background-coloLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Table
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem;text-align:left;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;-o-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table thead{-webkit-box-shadow:none;box-shadow:none}.ui.table thead th{cursor:auto;background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table thead tr>th:first-child{border-left:none}.ui.table thead tr:first-child>th:first-child{border-radius:.28571429rem 0 0 0}.ui.table thead tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table thead tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table tfoot{-webkit-box-shadow:none;box-shadow:none}.ui.table tfoot th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em;vertical-align:middle;font-style:normal;font-weight:400;text-transform:none}.ui.table tfoot tr>th:first-child{border-left:none}.ui.table tfoot tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table tfoot tr:first-child>th:last-child{border-radius:0 0 .28571429rem 0}.ui.table tfoot tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table tr td{border-top:1px solid rgba(34,36,38,.1)}.ui.table tr:first-child td{border-top:none}.ui.table td{padding:.78571429em;text-align:inherit}.ui.table>.icon{vertical-align:baseline}.ui.table>.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767px){.ui.table:not(.unstackable){width:100%}.ui.table:not(.unstackable) tbody,.ui.table:not(.unstackable) tr,.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{width:auto!important;display:block!important}.ui.table:not(.unstackable){padding:0}.ui.table:not(.unstackable) tfoot,.ui.table:not(.unstackable) thead{display:block}.ui.table:not(.unstackable) tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.1)!important}.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{background:0 0;border:none!important;padding:.25em .75em!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.table:not(.unstackable) td:first-child,.ui.table:not(.unstackable) th:first-child{font-weight:700}.ui.definition.table:not(.unstackable) thead th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.table td .image,.ui.table td .image img,.ui.table th .image,.ui.table th .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table thead th{border-left:none;border-right:none}.ui.structured.sortable.table thead th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table th{border-left:none;border-right:none}.ui.structured.celled.table tr td,.ui.structured.celled.table tr th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table thead:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-1px -1px 0 1px #fff;box-shadow:-1px -1px 0 1px #fff}.ui.definition.table tfoot:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:rgba(0,0,0,.4);color:normal;-webkit-box-shadow:1px 1px 0 1px #fff;box-shadow:1px 1px 0 1px #fff}.ui.celled.definition.table thead:not(.full-width) th:first-child{-webkit-box-shadow:0 -1px 0 1px #fff;box-shadow:0 -1px 0 1px #fff}.ui.celled.definition.table tfoot:not(.full-width) th:first-child{-webkit-box-shadow:0 1px 0 1px #fff;box-shadow:0 1px 0 1px #fff}.ui.definition.table tr td.definition,.ui.definition.table tr td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:"";-webkit-box-shadow:"";box-shadow:"";text-align:"";font-size:1em;padding-left:"";padding-right:""}.ui.definition.table td:nth-child(2),.ui.definition.table tfoot:not(.full-width) th:nth-child(2),.ui.definition.table thead:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.table td.positive,.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:inset 0 0 0 #a3c293;background:#fcfff5!important;color:#2c662d!important}.ui.table td.negative,.ui.table tr.negative{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.error,.ui.table td.negative,.ui.table tr.error,.uLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Ad
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright 2013 Contributors
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child,.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*="medium rectangle"].ad{width:300px;height:250px}.ui[class*="large rectangle"].ad{width:336px;height:280px}.ui[class*="half page"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*="small square"].ad{width:200px;height:200px}.ui[class*="small rectangle"].ad{width:180px;height:150px}.ui[class*="vertical rectangle"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*="square button"].ad{width:125px;height:125px}.ui[class*="small button"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*="wide skyscraper"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*="vertical banner"].ad{width:120px;height:240px}.ui[class*="top banner"].ad{width:930px;height:180px}.ui[class*="half banner"].ad{width:234px;height:60px}.ui[class*="large leaderboard"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*="large mobile banner"].ad{width:320px;height:100px}.ui[class*="mobile leaderboard"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:"Ad";color:#fff;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Item
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:290px;min-height:0;background:#fff;padding:0;border:none;border-radius:.28571429rem;-webkit-box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;-webkit-transition:box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,-webkit-transform .1s ease;-webkit-transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;-o-transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-transform .1s ease;z-index:""}.ui.card{margin:1em 0}.ui.card a,.ui.cards>.card a{cursor:pointer}.ui.card:first-child{margin-top:0}.ui.card:last-child{margin-bottom:0}.ui.cards{margin:-.875em -.5em;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.cards,.ui.cards>.card{display:-ms-flexbox;display:flex}.ui.cards>.card{margin:.875em .5em;float:none}.ui.card:after,.ui.cards:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.cards~.ui.cards{margin-top:.875em}.ui.card>:first-child,.ui.cards>.card>:first-child{border-radius:.28571429rem .28571429rem 0 0!important;border-top:none!important}.ui.card>:last-child,.ui.cards>.card>:last-child{border-radius:0 0 .28571429rem .28571429rem!important}.ui.card>:only-child,.ui.cards>.card>:only-child{border-radius:.28571429rem!important}.ui.card>.image,.ui.cards>.card>.image{position:relative;display:block;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;background:rgba(0,0,0,.05)}.ui.card>.image>img,.ui.cards>.card>.image>img{display:block;width:100%;height:auto;border-radius:inherit}.ui.card>.image:not(.ui)>img,.ui.cards>.card>.image:not(.ui)>img{border:none}.ui.card>.content,.ui.cards>.card>.content{-ms-flex-positive:1;flex-grow:1;border:none;border-top:1px solid rgba(34,36,38,.1);background:0 0;margin:0;padding:1em;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border-radius:0}.ui.card>.content:after,.ui.cards>.card>.content:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.card>.content>.header,.ui.cards>.card>.content>.header{display:block;margin:"";font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;color:rgba(0,0,0,.85)}.ui.card>.content>.header:not(.ui),.ui.cards>.card>.content>.header:not(.ui){font-weight:700;font-size:1.28571429em;margin-top:-.21425em;line-height:1.28571429em}.ui.card>.content>.header+.description,.ui.card>.content>.meta+.description,.ui.cards>.card>.content>.header+.description,.ui.cards>.card>.content>.meta+.description{margin-top:.5em}.ui.card [class*="left floated"],.ui.cards>.card [class*="left floated"]{float:left}.ui.card [class*="right floated"],.ui.cards>.card [class*="right floated"]{float:right}.ui.card [class*="left aligned"],.ui.cards>.card [class*="left aligned"]{text-align:left}.ui.card [class*="center aligned"],.ui.cards>.card [class*="center aligned"]{text-align:center}.ui.card [class*="right aligned"],.ui.cards>.card [class*="right aligned"]{text-align:right}.ui.card .content img,.ui.cards>.card .content img{display:inline-block;vertical-align:middle;width:""}.ui.card .avatar img,.ui.card img.avatar,.ui.cards>.card .avatar img,.ui.cards>.card img.avatar{width:2em;height:2em;border-radius:500rem}.ui.card>.content>.description,.ui.cards>.card>.content>.description{clear:both;color:rgba(0,0,0,.68)}.ui.card>.content p,.ui.cards>.card>.content p{margin:0 0 .5em}.ui.card>.content p:last-child,.ui.cards>.card>.content p:last-child{margin-bottom:0}.ui.card .meta,.ui.cards>.card .meta{font-size:1em;color:rgba(0,0,0,.4)}.ui.card .meta *,.ui.cards>.card .meta *{margin-right:.3em}.ui.card .meta :last-child,.ui.cards>.card .meta :last-child{margin-right:0}.ui.card .meta [class*="right floated"],.ui.cards>.card .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.card>.content a:not(.ui),.ui.cards>.card>.content a:not(.ui){color:"";-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.card>.content a:not(.ui):hover,.ui.cards>.card>.content a:not(.ui):hover{color:""}.ui.card>.content>a.header,.ui.cards>.card>.content>a.header{color:rgba(0,0,0,.85)}.ui.card>.content>a.header:hover,.ui.cards>.card>.content>a.header:hover{color:#1e70bf}.ui.card .meta>a:not(.ui),.ui.cards>.card .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.card .meta>a:not(.ui):hover,.ui.cards>.card .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.card>.button,.ui.card>.buttons,.ui.cards>.card>.button,.ui.cards>.card>.buttons{margin:0 -1px;width:calc(100% + 2px)}.ui.card .dimmer,.ui.cards>.card .dimmer{background-color:"";z-index:10}.ui.card>.content .star.icon,.ui.cards>.card>.content .star.icon{cursor:pointerLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Comment
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment .comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment .comments:before{position:absolute;top:0;left:0}.ui.comments .comment .comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment .comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;-webkit-box-shadow:-1px 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;-o-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.mini.comments{font-size:.78571429rem}.ui.tiny.comments{font-size:.85714286rem}.ui.small.comments{font-size:.92857143rem}.ui.comments{font-size:1rem}.ui.large.comments{font-size:1.14285714rem}.ui.big.comments{font-size:1.28571429rem}.ui.huge.comments{font-size:1.42857143rem}.ui.massive.comments{font-size:1.71428571rem}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Feed
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;font-weight:400;font-size:1em;font-style:normal;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:"";color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:"";-webkit-transition:color .2s ease;-o-transition:.2s color ease;transition:color .2s ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#ff2733}.ui.feed>.event>.content .meta .active.like .icon{color:#ef404a}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child:after{display:none}.ui.feed>.event>.content .meta>.icon,.ui.feed>.event>.content .meta a{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta>.icon:hover,.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon{color:rgba(0,0,0,.95)}.ui.small.feed{font-size:.92857143rem}.ui.feed{font-size:1rem}.ui.large.feed{font-size:1.14285714rem}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Item
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.items>.item{display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:box-shadow .1s ease;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;-o-transition:box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-box-shadow .1s ease;z-index:""}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:"";-ms-flex-item-align:top;-ms-grid-row-align:top;align-self:top}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-ms-flex-item-align:top;-ms-grid-row-align:top;align-self:top;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*="left floated"]{float:left}.ui.items>.item [class*="right floated"]{float:right}.ui.items>.item .content img{-ms-flex-item-align:middle;-ms-grid-row-align:middle;align-self:middle;width:""}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:"";height:"";border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:"";-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:""}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#ffb70a}.ui.items>.item>.content .active.favorite.icon{color:#ffe623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.items>.item>.content .active.like.icon{color:#ff2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*="right floated"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767px){.ui.items:not(.unstackable)>.item{-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-ms-flex-item-aligLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Statistic
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.statistic{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;margin:1em 0;max-width:auto}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-ms-inline-flexbox;display:inline-flex;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 2em;max-width:auto}.ui.statistics{display:-ms-flexbox;display:flex;margin:1em -1.5em -2em}.ui.statistics:after{display:block;content:" ";height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistics:last-child{margin-bottom:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:4rem;font-weight:400;line-height:1em;color:#1b1c1d;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistic>.value~.label,.ui.statistics .statistic>.label~.value,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value .icon,.ui.statistics .statistic>.value .icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -2em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 2em}.ui.nine.statistics{margin:0 0 -2em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 2em}.ui.eight.statistics{margin:0 0 -2em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 2em}.ui.seven.statistics{margin:0 0 -2em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 2em}.ui.six.statistics{margin:0 0 -2em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 2em}.ui.five.statistics{margin:0 0 -2em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 2em}.ui.four.statistics{margin:0 0 -2em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 2em}.ui.three.statistics{margin:0 0 -2em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 2em}.ui.two.statistics{margin:0 0 -2em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 2em}.ui.one.statistics{margin:0 0 -2em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 2em}.ui.horizontal.statistic{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.ui.horizontal.statistics{-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value .icon,.ui.horizontal.statistics .statistic>.value .icon{width:1.18em}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#db2828}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#f2711c}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#fbbd08}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#b5cc18}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21ba45}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00b5ad}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185d0}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435c9}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#a333c8}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#e03997}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#a5673f}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statisticLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Accordion
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.accordion,.ui.accordion .accordion{max-width:100%}.ui.accordion .accordion{margin:1em 0 0;padding:0}.ui.accordion .accordion .title,.ui.accordion .title{cursor:pointer}.ui.accordion .title:not(.ui){padding:.5em 0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:1em;color:rgba(0,0,0,.87)}.ui.accordion .accordion .title~.content,.ui.accordion .title~.content{display:none}.ui.accordion:not(.styled) .accordion .title~.content:not(.ui),.ui.accordion:not(.styled) .title~.content:not(.ui){margin:"";padding:.5em 0 1em}.ui.accordion:not(.styled) .title~.content:not(.ui):last-child{padding-bottom:0}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{display:inline-block;float:none;opacity:1;width:1.25em;height:1em;margin:0 .25rem 0 0;padding:0;font-size:1em;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;-o-transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;vertical-align:baseline;-webkit-transform:none;-ms-transform:none;transform:none}.ui.accordion.menu .item .title{display:block;padding:0}.ui.accordion.menu .item .title>.dropdown.icon{float:right;margin:.21425em 0 0 1em;-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ui.accordion .ui.header .dropdown.icon{font-size:1em;margin:0 .25rem 0 0}.ui.accordion .accordion .active.title .dropdown.icon,.ui.accordion .active.title .dropdown.icon,.ui.accordion.menu .item .active.title>.dropdown.icon{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ui.styled.accordion{width:600px}.ui.styled.accordion,.ui.styled.accordion .accordion{border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15)}.ui.styled.accordion .accordion .title,.ui.styled.accordion .title{margin:0;padding:.75em 1em;color:rgba(0,0,0,.4);font-weight:700;border-top:1px solid rgba(34,36,38,.15);-webkit-transition:background .1s ease,color .1s ease;-o-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.styled.accordion .accordion .title:first-child,.ui.styled.accordion>.title:first-child{border-top:none}.ui.styled.accordion .accordion .content,.ui.styled.accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .content{padding:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover,.ui.styled.accordion .active.title,.ui.styled.accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.accordion .accordion .active.content,.ui.accordion .active.content{display:block}.ui.fluid.accordion,.ui.fluid.accordion .accordion{width:100%}.ui.inverted.accordion .title:not(.ui){color:hsla(0,0%,100%,.9)}@font-face{font-family:Accordion;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format("truetype"),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAALine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Checkbox
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1rem;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox .box,.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox .box:before,.ui.checkbox label:before{content:"";background:#fff;border-radius:.21428571rem;border:1px solid #d4d4d5}.ui.checkbox .box:after,.ui.checkbox .box:before,.ui.checkbox label:after,.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;-webkit-transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;-o-transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease}.ui.checkbox .box:after,.ui.checkbox label:after{font-size:14px;text-align:center;opacity:0;color:rgba(0,0,0,.87)}.ui.checkbox+label,.ui.checkbox label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox .box:hover:before,.ui.checkbox label:hover:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox+label:hover,.ui.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.checkbox .box:active:before,.ui.checkbox label:active:before{background:#f9fafb;border-color:rgba(34,36,38,.35)}.ui.checkbox .box:active:after,.ui.checkbox input:active~label,.ui.checkbox label:active:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~.box:before,.ui.checkbox input:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:focus~.box:after,.ui.checkbox input:focus~label,.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~.box:before,.ui.checkbox input:checked~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~.box:before,.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~.box:after,.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:checked:focus~.box:before,.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:checked:focus~.box:after,.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~.box:after,.ui.checkbox input[disabled]~label,.ui.disabled.checkbox .box:after,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox .box,.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox .box:before,.ui.radio.checkbox label:before{content:"";-webkit-transform:none;-ms-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{border:none;content:""!important;line-height:15px;top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);-ms-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~.box:before,.ui.radio.checkbox input:focus~label:before{background-color:#fff}.ui.radio.checkbox input:focus~.box:after,.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~.box:after,.ui.radio.checkbox input:indeterminate~Line truncated
|
||||||
|
* # Semantic UI 2.2.12 - Dimmer
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.dimmable:not(body){position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;-o-transition:background-color .5s linear;transition:background-color .5s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{width:100%;height:100%;display:table;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.dimmer>.content>*{display:table-cell;vertical-align:middle;color:#fff}.ui.segment>.ui.dimmer{border-radius:inherit!important}.ui.dimmer:not(.inverted)::-webkit-scrollbar-track{background:hsla(0,0%,100%,.1)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.25)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive{background:hsla(0,0%,100%,.15)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover{background:hsla(0,0%,100%,.35)}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:block;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.ui.page.dimmer{position:fixed;-webkit-transform-style:"";transform-style:"";-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:blur(0) grayscale(0);filter:blur(0) grayscale(0);-webkit-transition:-webkit-filter .8s ease;-o-transition:.8s -webkit-filter ease;transition:-webkit-filter .8s ease;-webkit-transition:filter .8s ease;-o-transition:.8s filter ease;transition:filter .8s ease;-webkit-transition:filter .8s ease,-webkit-filter .8s ease;-o-transition:.8s filter ease,.8s -webkit-filter ease;transition:filter .8s ease,-webkit-filter .8s ease}.blurring.dimmed.dimmable>:not(.dimmer){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:hsla(0,0%,100%,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.ui.inverted.dimmer{background-color:hsla(0,0%,100%,.85)}.ui.inverted.dimmer>.content>*{color:#fff}.ui.simple.dimmer{display:block;overflow:hidden;opacity:1;width:0;height:0%;z-index:-100;background-color:transparent}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:hsla(0,0%,100%,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:hsla(0,0%,100%,.85)}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Dropdown
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:box-shadow .1s ease,width .1s ease;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;-o-transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent}.ui.dropdown .menu{cursor:auto;position:absolute;display:none;outline:0;top:100%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;padding:0;background:#fff;font-size:1em;text-shadow:none;text-align:left;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:opacity .1s ease;-o-transition:opacity .1s ease;transition:opacity .1s ease;z-index:11;will-change:transform,opacity}.ui.dropdown .menu>*{white-space:nowrap}.ui.dropdown>input:not(.search):first-child,.ui.dropdown>select{display:none!important}.ui.dropdown>.dropdown.icon{position:relative;font-size:.85714286em;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon{width:auto;float:right;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon+.text{margin-right:1em}.ui.dropdown>.text{display:inline-block;-webkit-transition:none;-o-transition:none;transition:none}.ui.dropdown .menu>.item{position:relative;cursor:pointer;display:block;border:none;height:auto;text-align:left;border-top:none;line-height:1em;color:rgba(0,0,0,.87);padding:.78571429rem 1.14285714rem!important;font-size:1rem;text-transform:none;font-weight:400;-webkit-box-shadow:none;box-shadow:none;-webkit-touch-callout:none}.ui.dropdown .menu>.item:first-child{border-top-width:0}.ui.dropdown .menu .item>[class*="right floated"],.ui.dropdown>.text>[class*="right floated"]{float:right!important;margin-right:0!important;margin-left:1em!important}.ui.dropdown .menu .item>[class*="left floated"],.ui.dropdown>.text>[class*="left floated"]{float:left!important;margin-left:0!important;margin-right:1em!important}.ui.dropdown .menu .item>.flag.floated,.ui.dropdown .menu .item>.icon.floated,.ui.dropdown .menu .item>.image.floated,.ui.dropdown .menu .item>img.floated{margin-top:0}.ui.dropdown .menu>.header{margin:1rem 0 .75rem;padding:0 1.14285714rem;color:rgba(0,0,0,.85);font-size:.78571429em;font-weight:700;text-transform:uppercase}.ui.dropdown .menu>.divider{border-top:1px solid rgba(34,36,38,.1);height:0;margin:.5em 0}.ui.dropdown .menu>.input{width:auto;display:-ms-flexbox;display:flex;margin:1.14285714rem .78571429rem;min-width:10rem}.ui.dropdown .menu>.header+.input{margin-top:0}.ui.dropdown .menu>.input:not(.transparent) input{padding:.5em 1em}.ui.dropdown .menu>.input:not(.transparent) .button,.ui.dropdown .menu>.input:not(.transparent) .icon,.ui.dropdown .menu>.input:not(.transparent) .label{padding-top:.5em;padding-bottom:.5em}.ui.dropdown .menu>.item>.description,.ui.dropdown>.text>.description{float:right;margin:0 0 0 1em;color:rgba(0,0,0,.4)}.ui.dropdown .menu>.message{padding:.78571429rem 1.14285714rem;font-weight:400}.ui.dropdown .menu>.message:not(.ui){color:rgba(0,0,0,.4)}.ui.dropdown .menu .menu{top:0!important;left:100%;right:auto;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-left:0;float:none;margin-right:.78571429rem}.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image,.ui.dropdown>.text>img{display:inline-block;vertical-align:top;width:auto;margin-top:-.5em;margin-bottom:-.5em;max-height:2em}.ui.dropdown .ui.menu>.item:before,.ui.menu .ui.dropdown .menu>.item:before{display:none}.ui.menu .ui.dropdown .menu .active.item{border-left:none}.ui.buttons>.ui.dropdown:last-child .menu,.ui.menu .right.dropdown.item .menu,.ui.menu .right.menu .dropdown:last-child .menu{left:auto;right:0}.ui.label.dropdown .menu{min-width:100%}.ui.dropdown.icon.button>.dropdown.icon{margin:0}.ui.button.dropdown .menu{min-width:100%}.ui.selection.dropdown{cursor:pointer;word-wrap:break-word;line-height:1em;white-space:normal;outline:0;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);min-width:14em;min-height:2.71428571em;background:#fff;display:inline-block;padding:.78571429em 2.Line truncated
|
||||||
|
* # Semantic UI 2.2.12 - Video
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#dcddde;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.embed>.embed{display:none}.ui.embed>.placeholder{display:block;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon,.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;width:100%;height:100%}.ui.embed>.icon{z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:"";background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:-o-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;-o-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;z-index:4;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#fff;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;-o-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:-o-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#fff}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*="4:3"].embed{padding-bottom:75%}.ui[class*="16:9"].embed{padding-bottom:56.25%}.ui[class*="21:9"].embed{padding-bottom:42.85714286%}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Modal
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.modal{display:none;position:fixed;z-index:1001;top:50%;left:50%;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;-ms-transform-origin:50% 25%;transform-origin:50% 25%;border-radius:.28571429rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.icon:first-child+*,.ui.modal>:first-child:not(.icon){border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#fff;width:2.25rem;height:2.25rem;padding:.625rem 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;background:#fff;margin:0;padding:1.25rem 1.5rem;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.28571429em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#fff}.ui.modal>.image.content{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-ms-flex:0 1 auto;flex:0 1 auto;width:""}.ui.modal>.content>.image,.ui.modal>[class*="top aligned"]{-ms-flex-item-align:top;-ms-grid-row-align:top;align-self:top}.ui.modal>[class*="middle aligned"]{-ms-flex-item-align:middle;-ms-grid-row-align:middle;align-self:middle}.ui.modal>[class*=stretched]{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-ms-flex-item-align:top;-ms-grid-row-align:top;align-self:top}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{-ms-flex:0 1 auto;flex:0 1 auto;min-width:"";width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#f9fafb;padding:1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button{margin-left:.75em}@media only screen and (max-width:767px){.ui.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.modal{width:88%;margin:0 0 0 -44%}}@media only screen and (min-width:992px){.ui.modal{width:850px;margin:0 0 0 -425px}}@media only screen and (min-width:1200px){.ui.modal{width:900px;margin:0 0 0 -450px}}@media only screen and (min-width:1920px){.ui.modal{width:950px;margin:0 0 0 -475px}}@media only screen and (max-width:991px){.ui.modal>.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767px){.ui.modal>.header{padding:.75rem 1rem!important;padding-right:2.25rem!important}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{-ms-flex-direction:column;flex-direction:column}.ui.modal .content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal .content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;-webkit-box-shadow:none;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{border:none;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.basic.modal,.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#fff}.ui.basic.modal>.close{top:1rem;right:1.5rem}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}@media only screen and (max-width:991px){.ui.basic.modal>.close{color:#fff}}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.dimmable>.dimmer{position:fixed}.modals.dimmer .ui.scrolling.modal{position:static!important;margin:3.5rem auto!important}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal{position:absolute;left:Line truncated
|
||||||
|
* # Semantic UI 2.2.12 - Nag
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:background .2s ease;-o-transition:.2s background ease;transition:background .2s ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#fff}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#fff;-webkit-transition:opacity .2s ease;-o-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#f3f4f5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Popup
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #d4d4d5;line-height:1.4285em;max-width:250px;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:"";width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{content:"";width:.71428571em;height:.71428571em;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;position:absolute;font-size:1rem;background:#fff}[data-tooltip]:after{content:attr(data-tooltip);text-transform:none;text-align:left;white-space:nowrap;border:1px solid #d4d4d5;line-height:1.4285em;max-width:none;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden}[data-tooltip]:before{opacity:0;-webkit-transform:rotate(45deg) scale(0)!important;-ms-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;-ms-transform-origin:center top;transform-origin:center top}[data-tooltip]:after,[data-tooltip]:before{-webkit-transition:all .1s ease;-o-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:after{opacity:1;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;-ms-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important;opacity:1}[data-tooltip]:after,[data-tooltip][data-position="bottom center"]:after,[data-tooltip][data-position="top center"]:after{-webkit-transform:translateX(-50%) scale(0)!important;-ms-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position="bottom center"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;-ms-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position="left center"]:after,[data-tooltip][data-position="right center"]:after{-webkit-transform:translateY(-50%) scale(0)!important;-ms-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position="left center"]:hover:after,[data-tooltip][data-position="right center"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;-ms-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important}[data-tooltip][data-position="bottom left"]:after,[data-tooltip][data-position="bottom right"]:after,[data-tooltip][data-position="top left"]:after,[data-tooltip][data-position="top right"]:after{-webkit-transform:scale(0)!important;-ms-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position="bottom left"]:hover:after,[data-tooltip][data-position="bottom right"]:hover:after,[data-tooltip][data-position="top left"]:hover:after,[data-tooltip][data-position="top right"]:hover:after{-webkit-transform:scale(1)!important;-ms-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important;background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background-color:none;color:#fff}[data-position="top center"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Progress Bar
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;-o-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease}.ui.progress .bar>.progress{white-space:nowrap;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;color:hsla(0,0%,100%,.7);margin-top:-.5em;text-align:left}.ui.progress .bar>.progress,.ui.progress>.label{position:absolute;bottom:auto;text-shadow:none;font-weight:700}.ui.progress>.label{width:100%;font-size:1em;top:100%;right:auto;left:0;color:rgba(0,0,0,.87);margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;-o-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^="1"] .bar,.ui.indicating.progress[data-percent^="2"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent^="3"] .bar{background-color:#efbc72}.ui.indicating.progress[data-percent^="4"] .bar,.ui.indicating.progress[data-percent^="5"] .bar{background-color:#e6bb48}.ui.indicating.progress[data-percent^="6"] .bar{background-color:#ddc928}.ui.indicating.progress[data-percent^="7"] .bar,.ui.indicating.progress[data-percent^="8"] .bar{background-color:#b4d95c}.ui.indicating.progress[data-percent^="9"] .bar,.ui.indicating.progress[data-percent^="100"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^="1"] .label,.ui.indicating.progress[data-percent^="2"] .label,.ui.indicating.progress[data-percent^="3"] .label,.ui.indicating.progress[data-percent^="4"] .label,.ui.indicating.progress[data-percent^="5"] .label,.ui.indicating.progress[data-percent^="6"] .label,.ui.indicating.progress[data-percent^="7"] .label,.ui.indicating.progress[data-percent^="8"] .label,.ui.indicating.progress[data-percent^="9"] .label,.ui.indicating.progress[data-percent^="100"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent="1"] .bar,.ui.indicating.progress[data-percent="2"] .bar,.ui.indicating.progress[data-percent="3"] .bar,.ui.indicating.progress[data-percent="4"] .bar,.ui.indicating.progress[data-percent="5"] .bar,.ui.indicating.progress[data-percent="6"] .bar,.ui.indicating.progress[data-percent="7"] .bar,.ui.indicating.progress[data-percent="8"] .bar,.ui.indicating.progress[data-percent="9"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent="1"] .label,.ui.indicating.progress[data-percent="2"] .label,.ui.indicating.progress[data-percent="3"] .label,.ui.indicating.progress[data-percent="4"] .label,.ui.indicating.progress[data-percent="5"] .label,.ui.indicating.progress[data-percent="6"] .label,.ui.indicating.progress[data-percent="7"] .label,.ui.indicating.progress[data-percent="8"] .label,.ui.indicating.progress[data-percent="9"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress.success .label{color:#1a531b}.ui.progress.success .bar{background-color:#21ba45!important}.ui.progress.success .bar,.ui.progress.success .bar:after{-webkit-animation:none!important;animation:none!important}.ui.progress.success>.label{color:#1a531b}.ui.progress.warning .bar{background-color:#f2c037!important}.ui.progress.warning .bar,.ui.progress.warning .bar:after{-webkit-animation:none!important;animation:none!important}.ui.progress.warning>.label{color:#794b02}.ui.progress.error .bar{background-color:#db2828!important}.ui.progress.error .bar,.ui.progress.error .bar:after{-webkit-animation:none!important;animation:none!important}.ui.progress.error>.label{color:#912d2b}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar:after{content:"";opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite}@-webkit-keyframes progress-active{0%{opacity:.3;width:0}to{opacity:0;width:100%}}@keyframes progress-active{0%{opacity:.3;width:0}to{opacity:0;width:100%}}.ui.disabled.progress{opacity:.35}.ui.disabled.progress .bar,.ui.disabled.progress .bar:after{-webkit-animation:none!important;animation:none!important}.ui.inverted.progress{background:hsla(0,0%,100%,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#f9fafb}.ui.inverted.progress>.label{color:#fff}.ui.inverted.progress.success>.label{color:#21ba45}.ui.inverted.progress.warning>.label{color:#f2c037}.ui.inverted.progress.error>.label{color:#db2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{display:block;height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429reLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Rating
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.rating{display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;-ms-flex:1 0 auto;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;-o-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;background:0 0;color:rgba(0,0,0,.15)}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.selected,.ui.rating .icon.selected.active{background:0 0;color:rgba(0,0,0,.87)}.ui.star.rating .icon{width:1.25em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none}.ui.star.rating .active.icon{background:0 0!important;color:#ffe623!important;text-shadow:0 -1px 0 #ddc507,-1px 0 0 #ddc507,0 1px 0 #ddc507,1px 0 0 #ddc507!important}.ui.star.rating .icon.selected,.ui.star.rating .icon.selected.active{background:0 0!important;color:#fc0!important;text-shadow:0 -1px 0 #e6a200,-1px 0 0 #e6a200,0 1px 0 #e6a200,1px 0 0 #e6a200!important}.ui.heart.rating .icon{width:1.4em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none!important}.ui.heart.rating .active.icon{background:0 0!important;color:#ff6d75!important;text-shadow:0 -1px 0 #cd0707,-1px 0 0 #cd0707,0 1px 0 #cd0707,1px 0 0 #cd0707!important}.ui.heart.rating .icon.selected,.ui.heart.rating .icon.selected.active{background:0 0!important;color:#ff3000!important;text-shadow:0 -1px 0 #aa0101,-1px 0 0 #aa0101,0 1px 0 #aa0101,1px 0 0 #aa0101!important}.ui.disabled.rating .icon{cursor:default}.ui.rating .icon.selected,.ui.rating.selected .active.icon,.ui.rating.selected .icon.selected{opacity:1}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.rating{font-size:1rem}.ui.large.rating{font-size:1.14285714rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}@font-face{font-family:Rating;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjCBsAAAC8AAAAYGNtYXCj2pm8AAABHAAAAKRnYXNwAAAAEAAAAcAAAAAIZ2x5ZlJbXMYAAAHIAAARnGhlYWQBGAe5AAATZAAAADZoaGVhA+IB/QAAE5wAAAAkaG10eCzgAEMAABPAAAAAcGxvY2EwXCxOAAAUMAAAADptYXhwACIAnAAAFGwAAAAgbmFtZfC1n04AABSMAAABPHBvc3QAAwAAAAAVyAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADxZQHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEAJAAAAAgACAABAAAAAEAIOYF8AbwDfAj8C7wbvBw8Irwl/Cc8SPxZf/9//8AAAAAACDmAPAE8AzwI/Au8G7wcPCH8JfwnPEj8WT//f//AAH/4xoEEAYQAQ/sD+IPow+iD4wPgA98DvYOtgADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAIAAP/tAgAB0wAKABUAAAEvAQ8BFwc3Fyc3BQc3Jz8BHwEHFycCALFPT7GAHp6eHoD/AHAWW304OH1bFnABGRqgoBp8sFNTsHyyOnxYEnFxElh8OgAAAAACAAD/7QIAAdMACgASAAABLwEPARcHNxcnNwUxER8BBxcnAgCxT0+xgB6enh6A/wA4fVsWcAEZGqCgGnywU1OwfLIBHXESWHw6AAAAAQAA/+0CAAHTAAoAAAEvAQ8BFwc3Fyc3AgCxT0+xgB6enh6AARkaoKAafLBTU7B8AAAAAAEAAAAAAgABwAArAAABFA4CBzEHDgMjIi4CLwEuAzU0PgIzMh4CFz4DMzIeAhUCAAcMEgugBgwMDAYGDAwMBqALEgwHFyg2HhAfGxkKChkbHxAeNigXAS0QHxsZCqAGCwkGBQkLBqAKGRsfEB42KBcHDBILCxIMBxcoNh4AAAAAAgAAAAACAAHAACsAWAAAATQuAiMiDgIHLgMjIg4CFRQeAhcxFx4DMzI+Aj8BPgM1DwEiFCIGMTAmIjQjJy4DNTQ+AjMyHgIfATc+AzMyHgIVFA4CBwIAFyg2HhAfGxkKChkbHxAeNigXBwwSC6AGDAwMBgYMDAwGoAsSDAdbogEBAQEBAaIGCgcEDRceEQkREA4GLy8GDhARCREeFw0EBwoGAS0eNigXBwwSCwsSDAcXKDYeEB8bGQqgBgsJBgUJCwagChkbHxA+ogEBAQGiBg4QEQkRHhcNBAcKBjQ0BgoHBA0XHhEJERAOBgABAAAAAAIAAcAAMQAAARQOAgcxBw4DIyIuAi8BLgM1ND4CMzIeAhcHFwc3Jzc+AzMyHgIVAgAHDBILoAYMDAwGBgwMDAagCxIMBxcoNh4KFRMSCC9wQLBwJwUJCgkFHjYoFwEtEB8bGQqgBgsJBgUJCwagChkbHxAeNigXAwUIBUtAoMBAOwECAQEXKDYeAAABAAAAAAIAAbcAKgAAEzQ3NjMyFxYXFhcWFzY3Njc2NzYzMhcWFRQPAQYjIi8BJicmJyYnJicmNQAkJUARExIQEAsMCgoMCxAQEhMRQCUkQbIGBwcGsgMFBQsKCQkGBwExPyMkBgYLCgkKCgoKCQoLBgYkIz8/QawFBawCBgUNDg4OFRQTAAAAAQAAAA0B2wHSACYAABM0PwI2FzYfAhYVFA8BFxQVFAcGByYvAQcGByYnJjU0PwEnJjUAEI9BBQkIBkCPEAdoGQMDBgUGgIEGBQYDAwEYaAcBIwsCFoEMAQEMgRYCCwYIZJABBQUFAwEBAkVFAgEBAwUFAwOQZAkFAAAAAAIAAAANAdsB0gAkAC4AABM0PwI2FzYfAhYVFA8BFxQVFAcmLwEHBgcmJyY1ND8BJyY1HwEHNxcnNy8BBwAQj0EFCQgGQI8QB2gZDAUGgIEGBQYDAwEYaAc/WBVsaxRXeDY2ASMLAhaBDAEBDIEWAgsGCGSQAQUNAQECRUUCAQEDBQUDA5BkCQURVXg4OHhVEW5uAAABACMAKQHdAXwAGgAANzQ/ATYXNh8BNzYXNh8BFhUUDwEGByYvASY1IwgmCAwLCFS8CAsMCCYICPUIDAsIjgjSCwkmCQEBCVS7CQEBCSYJCg0H9gcBAQePBwwAAAEAHwAfAXMBcwAsAAA3ND8BJyY1ND8BNjMyHwE3NjMyHwEWFRQPARcWFRQPAQYjIi8BBwYjIi8BJjUfCFRUCAgnCAwLCFRUCAwLCCcICFRUCAgnCAsMCFRUCAsMCCcIYgsIVFQIDAsIJwgIVFQICCcICwwIVFQICwwIJwgIVFQICCcIDAAAAAACAAAAJQFJAbcAHwArAAA3NTQ3NjsBNTQ3NjMyFxYdATMyFxYdARQHBiMhIicmNTczNTQnJiMiBwYdAQAICAsKJSY1NCYmCQsICAgIC/7tCwgIW5MWFR4fFRZApQsICDc0JiYmJjQ3CAgLpQsICAgIC8A3HhYVFRYeNwAAAQAAAAcBbgG3ACEAADcRNDc2NzYzITIXFhcWFREUBwYHBiMiLwEHBiMiJyYnJjUABgUKBgYBLAYGCgUGBgUKBQcOCn5+Cg4GBgoFBicBcAoICAMDAwMICAr+kAoICAQCCXl5CQIECAgKAAAAAwAAACUCAAFuABgAMQBKAAA3NDc2NzYzMhLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Search
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:inset 0 0 0 0 transparent;-webkit-transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-o-transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;-ms-transform-origin:center top;transform-origin:center top;white-space:normal;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #d4d4d5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285714em 0 0;font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21ba45}.ui.search>.results>.message{padding:1em}.ui.search>.results>.message .header{font-family:Lato,Helvetica Neue,Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#f3f4f5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#fff;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after,.ui.loading.search .input>i.icon:before{position:absolute;content:"";top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em}.ui.loading.search .input>i.icon:after{-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#f9fafb}.ui.search .action:hover{background:#e0e0e0}.ui.category.search>.results .category.active{background:#f3f4f5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .description,.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:"";top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;-o-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*="left icon"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#db2828}.ui.category.search .resulLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Shape
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;-o-transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#e6e6e6;color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;-o-transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;-o-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .active.side{display:block}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Sidebar
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.sidebar{position:fixed;top:0;left:0;-webkit-transition:none;-o-transition:none;transition:none;will-change:transform;-webkit-transform:translateZ(0);transform:translateZ(0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar,.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454!important}.pushable:not(body){-webkit-transform:translateZ(0);transform:translateZ(0)}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;will-change:transform;z-index:101}.pushable>.fixed,.pushable>.pusher{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;-o-transition:transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.pushable>.pusher{position:relative;overflow:hidden;min-height:100%;z-index:2}body.pushable>.pusher{background:#fff}.pushable>.pusher{background:inherit}.pushable>.pusher:after{position:fixed;top:0;right:0;content:"";background-color:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translateZ(0);transform:translateZ(0)}.ui.bottom.visible.sidebar,.ui.left.visible.sidebar,.ui.right.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translateZ(0);transform:translateZ(0)}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*="very thin"].left.sidebar,.ui[class*="very thin"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*="very wide"].left.sidebar,.ui[class*="very wide"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*="very thin"].left.sidebar~.fixed,.ui.visible[class*="very thin"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*="very wide"].left.sidebar~.fixed,.ui.visible[class*="very wide"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*="very thin"].right.sidebar~.fixed,.ui.visible[class*="very thin"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*="very wide"].right.sidebar~.fixed,.ui.visible[class*="very wide"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);tLine truncated
|
||||||
|
* # Semantic UI 2.2.12 - Sticky
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.sticky{position:static;-webkit-transition:none;-o-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Tab
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:"";top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:"";top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}/*!
|
||||||
|
* # Semantic UI 2.2.12 - Transition
|
||||||
|
* http://github.com/semantic-org/semantic-ui/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Released under the MIT license
|
||||||
|
* http://opensource.org/licenses/MIT
|
||||||
|
*
|
||||||
|
*/.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}to{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}to{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}to{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}to{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}to{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}to{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*="fade upLine truncated
|
||||||
|
/*# sourceMappingURL=main.b7f40099.css.map*/
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["App.css","Navigation/NavBar.css","Home/Masthead.css","Home/HomeIconLink.css","Home/PamphletCard.css","Home/PamphletList.css","Auth/Login.css","../node_modules/rc-datepicker/lib/style.css","Dialog/ProgressDialog.css","Dialog/YesNoMessageDialog.css","Auth/ResetPassword.css","Auth/ForgotPassword.css","Auth/ConfirmEmail.css","Dashboard/ProjectCard.css","Dashboard/ProjectList.css","FilePicker/FilePicker.css","BrokerDashboard/BrokerDashboard.css","Forms/FormSetTable.css","Forms/FormDialog.css","Forms/Forms.css","Profile/ProfileForm.css","Corporations/Styling/LevelItem.css","Corporations/LevelHeader.css","Corporations/Projects/ProjectPageTabs/Packages/Packages.css","Corporations/Projects/ProjectPageTabs/ProjectForm.css","Corporations/Projects/ProjectPageTabs/BrokerDialog.css","Corporations/Projects/ProjectPage.css","Corporations/Branches/BranchForm.css","Corporations/Breadcrumbs.css","Corporations/CorporationForm.css","Users/UserList.css","Users/UserForm.css","Users/ValidatedEmailIcon.css","Users/UserFormPlaceholder.css","Footer/Footer.css","../node_modules/semantic-ui-css/semantic.min.css","index.css"],"names":[],"mappings":"mKAAA,KACE,iBAAmB,CAGrB,oCACE,UACE,eAAiB,CAClB,CCLH,SACE,yBACA,qCACQ,4BAA8B,CAGxC,gBACE,WACA,wBACI,mBAAqB,CAG3B,gCACE,yBACA,WAAa,CAGf,6CAAgD,iCAAoC,CACpF,8CAAgD,iCAAoC,CACpF,8CAAgD,iCAAoC,CAEpF,sBAAwB,wBAA0B,CAElD,uBACE,UAAY,CAGd,cAYE,wBAA0B,CAG5B,6BAdE,WACA,oBACA,aACA,0BACI,sBACJ,sBACI,mBACJ,qBACI,uBACJ,cACA,eAAiB,CAiBlB,eADC,uBAAyB,CAG3B,gBACE,oBACA,aACA,uBACI,mBACJ,sBACI,kBAAoB,CAG1B,kBACE,aACA,gBAAkB,CAGpB,wBACE,UAAa,CAGf,2BACE,iBAAoB,CAGtB,WAAa,+BAAiC,CAC9C,WAAa,+BAAiC,CAC9C,WAAa,+BAAiC,CAI9C,eACE,0BACA,yCAA4C,CAG9C,oCACE,WACE,YAAc,CACf,CAKH,oCACE,SACE,aAAe,CAGjB,gBACE,2BAA8B,CAGhC,gBACE,WACA,0BACI,sBACJ,mBACI,oBAAsB,CAI5B,WACE,cAAgB,CAGlB,kBACE,SAAW,CAGb,eACE,UACA,wBAA4B,CAC7B,CC/HH,UACE,+CACA,wBACA,sBACA,YACA,aACA,oBACA,aACA,uBACI,mBACJ,sBACI,kBAAoB,CAG1B,kBACE,oCACA,iBACA,YAAc,CAGhB,0BACE,WACA,iCAAsC,CAGxC,aACE,cACA,mBACA,wBAA0B,CAG5B,aACE,gBACA,mBACA,UAAY,CAGd,oCACE,UAAY,WAAa,CACzB,aAAe,gBAAkB,CACjC,aAAe,aAAe,CAE9B,kBACE,wBACA,oBAAuB,CACxB,CAGH,oCACE,UAAY,WAAa,CAEzB,aACE,kBACA,kBAAoB,CAGtB,aACE,cAAiB,CAClB,CACF,gBC7DD,WACE,oBACA,aACA,kBACA,sBACI,mBACJ,qBACI,uBACJ,0BACI,sBACJ,cACA,qBAA2B,CAG7B,iBACE,aAAe,CAGjB,oCACE,aAAe,yBAA4B,CAC3C,cAAgB,wBAA4B,CAAE,CAGhD,oCACE,aAAe,uBAA0B,CACzC,cAAgB,yBAA6B,CAAE,CCzBjD,eACE,gBACA,cAAgB,CAGlB,6BACE,wCACA,2BAA+B,CAGjC,8BACE,yCACA,iBACA,4BAAgC,CAGlC,WACE,yBACA,eACA,YAAc,CAGhB,aACE,iBACA,kBACA,mBAAqB,CAGvB,uBACE,SACA,gBACA,kBAAoB,CAGtB,aACE,kBAAoB,CCnCtB,mBACE,iBAAmB,CAGrB,gBACE,2BAA8B,CCLhC,sBAAwB,kBAAsB,CAC9C,uBAAyB,eAAiB,CAC1C,uBAAyB,gBAAkB,CCF3C,iBACE,gCACQ,wBACR,YACA,aACA,gBACA,oBACA,aACA,+BACA,4BACA,uBACA,mBACA,6BACA,0BACA,qBACA,iBACA,uBACA,mBACA,4BACA,6BACA,wBACA,mBAAqB,CACrB,6BACE,kCACA,+BACA,0BACA,qBAAuB,CACzB,2BACE,2BACA,wBACA,mBACA,cAAgB,CAClB,qCACE,qBACA,iBACA,+BACA,gCACA,2BACA,sBAAwB,CAC1B,sCACE,sBACA,kBACA,2BACA,4BACA,uBACA,kBAAoB,CACtB,mCACE,mBACA,eACA,6BACA,8BACA,yBACA,oBAAsB,CACxB,uCACE,oBACA,gBACA,mCACA,oCACA,+BACA,0BAA4B,CAC9B,wCACE,qBACA,iBACA,+BACA,gCACA,2BACA,sBAAwB,CAC1B,qCACE,kBACA,cACA,iCACA,kCACA,6BACA,wBAA0B,CAC9B,WACE,0BACA,g8EACA,gBACA,iBAAmB,CAGrB,oBAEE,oCACA,WACA,kBACA,gBACA,oBACA,oBACA,cAEA,mCACA,iCAAmC,CAGrC,iCACE,eAAiB,CAGnB,gCACE,eAAiB,CAGnB,gCACE,eAAiB,CAGnB,oCACE,eAAiB,CAGnB,4BACE,kBACA,eACA,eAAiB,CAGnB,wCACE,oBACA,UAAa,CAGf,8CACE,gBACA,eACA,eAAiB,CAGnB,oDACE,kBACA,gBACA,YACA,gFACA,iDACA,4CACA,yCACA,yBACA,iBAAmB,CAGrB,6DACE,WAAa,CAGf,0DACE,WACA,YACA,uBACA,YACA,8BACQ,sBACR,kBACA,mBACA,eACA,cACA,eAAiB,CAGnB,gEACE,YAAc,CAGhB,qFACE,cACA,eAAiB,CAQnB,uJACE,cACA,eAAiB,CAGnB,gFACE,cACA,eAAiB,CAGnB,oEACE,kBACA,QACA,MACA,WAAa,CAGf,kFACE,cACA,uBACA,eACA,0BACA,eACA,aAAe,CAGjB,wFACE,uBACA,aAAe,CAGjB,kFACE,eACA,eACA,aAAe,CAGjB,wFACE,aAAe,CAGjB,0DACE,gFACA,iDACA,4CACA,yCACA,wBAA0B,CAG5B,gEACE,aAAe,CAGjB,2FACE,aAAe,CAOjB,mKACE,aAAe,CAGjB,sFACE,aAAe,CAGjB,wFACE,aAAe,CAGjB,4DACE,gFACA,iDACA,4CACA,yCACA,wBAA0B,CAG5B,kEACE,aAAe,CAGjB,6FACE,aAAe,CAOjB,uKACE,aAAe,CAGjB,wFACE,aAAe,CAGjB,0FACE,aAAe,CAGjB,oEACE,aAAe,CAGjB,kBACE,2BACA,yBACA,sBACA,qBACA,iBACA,qBACA,eACA,eAAiB,CAGnB,2BACE,kBACA,cACA,kDACQ,yCAA+C,CAGzD,+BACE,SACA,YACA,iBAAmB,CAGrB,mIAEE,SACA,SACA,yBACA,YACA,SACA,QACA,kBACA,mBAAqB,CAGvB,iEACE,yBACA,iBACA,gBAAkB,CAGpB,kEACE,yBACA,iBACA,gBAAkB,CAGpB,2LAEE,YACA,SACA,yBACA,YACA,SACA,QACA,kBACA,mBAAqB,CAGvB,6FACE,4BACA,iBACA,gBAAkB,CAGpB,8FACE,4BACA,iBACA,gBAAkB,CAGpB,8CACE,YACA,iBAAmB,CAGrB,oEACE,kBACA,mFACA,oDACA,+CACA,4CACA,WACA,6BACA,8BACA,+BACA,2BACA,2BAA6B,CAG/B,+EACE,WAAa,CAGf,yFACE,eACA,gBACA,cAAgB,CAGlB,6EACE,WAAa,CAGf,sGACE,qBACA,YACA,kBACA,eACA,oBACA,cAAgB,CAGlB,kHACE,eACA,iBACA,0BAA4B,CAG9B,mHACE,eACA,iBACA,2BAA6B,CAG/B,4GACE,4BACA,iBAAmB,CAGrB,kHACE,uBACA,cAAgB,CAGlB,qEACE,8BACA,+BACA,gCACA,+BACA,6BAA+B,CAGjC,2FACE,aACA,WACA,eAAiB,CAGnB,4GACE,+BAAiC,CAGnC,2IACE,6BAA+B,CAGjC,0IACE,8BAAgC,CAGlC,oHACE,cACA,gBACA,eACA,qBACA,eAAiB,CAGnB,qIACE,8BAAgC,CAGlC,wHACE,eAAiB,CAOnB,mPACE,eAAiB,CAGnB,0HACE,aAALine truncated
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
!function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var n={};t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=1152)}([function(e,t,n){"use strict";e.exports=n(101)},function(e,t,n){"use strict";t.__esModule=!0;var r=n(1064),a=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=a.default||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}},function(e,t,n){"use strict";var r=n(1021);n.d(t,"o",function(){return r.a});var a=n(1024);n.d(t,"d",function(){return a});var o=n(1025);n.d(t,"a",function(){return o.a}),n.d(t,"i",function(){return o.d}),n.d(t,"g",function(){return o.b}),n.d(t,"y",function(){return o.g}),n.d(t,"q",function(){return o.f}),n.d(t,"j",function(){return o.e}),n.d(t,"f",function(){return o.c});var i=(n(1026),n(1027));n.d(t,"m",function(){return i.a});var s=n(1028);n.d(t,"h",function(){return s.a}),n.d(t,"k",function(){return s.b}),n.d(t,"p",function(){return s.c}),n.d(t,"u",function(){return s.d}),n.d(t,"v",function(){return s.e}),n.d(t,"w",function(){return s.f}),n.d(t,"x",function(){return s.g});var c=n(1030);n.d(t,"b",function(){return c.a});var l=n(1029);n.d(t,"c",function(){return l.a});var u=n(1031);n.d(t,"t",function(){return u.a}),n.d(t,"s",function(){return u.b});var p=n(463);n.d(t,"l",function(){return p.a});var d=(n(464),n(1022));n.d(t,"e",function(){return d});var f=(n(1023),n(1032));n.d(t,"n",function(){return f.a});var h=(n(255),n(1033));n.d(t,"r",function(){return h.a})},function(e,t,n){var r,a;!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=typeof r;if("string"===a||"number"===a)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if("object"===a)for(var i in r)o.call(r,i)&&r[i]&&e.push(i)}}return e.join(" ")}var o={}.hasOwnProperty;"undefined"!==typeof e&&e.exports?e.exports=n:(r=[],void 0!==(a=function(){return n}.apply(t,r))&&(e.exports=a))}()},function(e,t,n){e.exports=n(1116)()},function(e,t,n){e.exports=n(873)()},function(e,t,n){"use strict";var r=(n(985),n(169),n(246),n(418),n(419),n(991),n(993));n.d(t,"u",function(){return r.a});var a=(n(420),n(421),n(995));n.d(t,"e",function(){return a.a});var o=(n(422),n(423),n(424),n(63),n(425),n(426),n(427),n(428),n(429),n(997));n.d(t,"b",function(){return o.a});var i=(n(430),n(431),n(998));n.d(t,"v",function(){return i.a});var s=(n(433),n(434),n(435),n(1e3));n.d(t,"r",function(){return s.a});var c=(n(436),n(437),n(247),n(438),n(1002));n.d(t,"s",function(){return c.a});var l=(n(439),n(170),n(440),n(248),n(441),n(442),n(443));n.d(t,"g",function(){return l.a});var u=(n(444),n(445),n(446),n(1004));n.d(t,"a",function(){return u.a});var p=n(1006);n.d(t,"q",function(){return p.a});var d=(n(447),n(1009));n.d(t,"d",function(){return d.a});var f=(n(448),n(449),n(27));n.d(t,"f",function(){return f.a});var h=(n(450),n(103));n.d(t,"p",function(){return h.a});var m=(n(452),n(249));n.d(t,"k",function(){return m.a});var v=(n(173),n(453),n(454),n(1012));n.d(t,"o",function(){return v.a});var y=(n(251),n(174),n(175),n(252),n(455),n(456),n(1014));n.d(t,"n",function(){return y.a});var g=(n(1016),n(1018),n(457),n(1019));n.d(t,"w",function(){return g.a});var b=(n(459),n(1020),n(461),n(253),n(462),n(254),n(1034),n(465),n(466),n(176));n.d(t,"i",function(){return b.a});var w=n(468);n.d(t,"l",function(){return w.a});var E=(n(467),n(256));n.d(t,"j",function(){return E.a});var _=(n(469),n(470),n(471),n(472),n(1039),n(477));n.d(t,"c",function(){return _.a});var k=(n(473),n(474),n(475),n(476),n(1042));n.d(t,"h",function(){return k.a});var C=(n(478),n(479),n(1044));n.d(t,"m",function(){return C.a});var x=(n(1046),n(480),n(1048),n(481),n(482),n(483),n(1050),n(484),n(485),n(1052),n(486),n(1054),n(487));n.d(t,"t",function(){return x.a});n(488),n(257),n(489),n(258),n(259),n(1056),n(490),n(491),n(492),n(493),n(494),n(495),n(496),n(497),n(1058),n(260),n(177),n(498),n(261),n(262),n(263),n(264),n(265),n(266),n(1059),n(500),n(267),n(268),n(501),n(269),n(502),n(270),n(1060),n(504),n(505),n(506)},function(e,t,n){"use strict";function r(e,t,n,r,o,i,s,c){if(a(t),!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,i,s,c],p=0;l=new Error(t.replace(/%s/g,function(){return u[p++]})),l.name="Invariant Violation"}throw l.framesToPop=1,l}}var a=function(e){};e.exports=r},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a functioLine truncated
|
||||||
|
//# sourceMappingURL=main.0feff0e8.js.map
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["../static/js/main.0feff0e8.js","../webpack/bootstrap f222398e3120393327f5","../node_modules/react/react.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/extends.js","../node_modules/classnames/index.js","../node_modules/semantic-ui-react/node_modules/prop-types/index.js","../node_modules/prop-types/index.js","../node_modules/fbjs/lib/invariant.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/classCallCheck.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/createClass.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/inherits.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/possibleConstructorReturn.js","../node_modules/fbjs/lib/warning.js","../node_modules/react-dom/lib/reactProdInvariant.js","../node_modules/lodash/isArray.js","../node_modules/lodash/without.js","../node_modules/object-assign/index.js","../node_modules/lodash/fp/placeholder.js","../node_modules/lodash/fp/convert.js","../node_modules/react-dom/lib/ReactDOMComponentTree.js","../node_modules/tcomb/index.js","../node_modules/tcomb/lib/assert.js","../node_modules/lodash/map.js","../node_modules/tcomb-react/index.js","../node_modules/lodash/invoke.js","../node_modules/warning/browser.js","../node_modules/auto-bind2/dist/index.js","../node_modules/rc-datepicker/lib/utils/index.js","../node_modules/tcomb/lib/getTypeName.js","../node_modules/webpack/buildin/global.js","../node_modules/fbjs/lib/ExecutionEnvironment.js","../node_modules/lodash/_root.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_core.js","../node_modules/tcomb/lib/isFunction.js","../node_modules/tcomb/lib/isType.js","../node_modules/fbjs/lib/emptyFunction.js","../node_modules/lodash/isObject.js","../node_modules/rc-datepicker/lib/utils/model.js","../node_modules/tcomb/lib/irreducible.js","../node_modules/lodash/isNil.js","../node_modules/lodash/keys.js","../node_modules/tcomb/lib/isTypeName.js","../node_modules/debug/src/browser.js","../node_modules/invariant/browser.js","../node_modules/lodash/_baseIteratee.js","../node_modules/lodash/isObjectLike.js","../node_modules/react-dom/lib/ReactInstrumentation.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_wks.js","../node_modules/lodash/isArrayLike.js","../node_modules/lodash/toString.js","../node_modules/react-dom/lib/ReactUpdates.js","../node_modules/tcomb/lib/isNil.js","../node_modules/lodash/_arrayMap.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/fp/_falseOptions.js","../node_modules/lodash/toInteger.js","../node_modules/react-dom/lib/SyntheticEvent.js","../node_modules/react/lib/ReactCurrentOwner.js","../node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js","../node_modules/tcomb/lib/create.js","../node_modules/tcomb/lib/is.js","../node_modules/tcomb/lib/isArray.js","../node_modules/tcomb/lib/isIdentity.js","../node_modules/tcomb/lib/isObject.js","Corporations/LevelHeader.jsx","../node_modules/lodash/_baseRest.js","../node_modules/lodash/_toKey.js","../node_modules/lodash/get.js","../node_modules/lodash/identity.js","../node_modules/lodash/isFunction.js","../node_modules/moment/moment.js","../node_modules/react-flexview/lib/index.js","../node_modules/regexp-pattern/dist/regExpPattern.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_export.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_global.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_object-dp.js","../node_modules/lodash/_castPath.js","../node_modules/lodash/_getNative.js","../node_modules/lodash/includes.js","../node_modules/lodash/isSymbol.js","../node_modules/react-dom/lib/PooledClass.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/toConsumableArray.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_an-object.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_descriptors.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_has.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_to-iobject.js","../node_modules/component-emitter/index.js","../node_modules/engine.io-parser/lib/browser.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_baseEach.js","../node_modules/lodash/_copyObject.js","../node_modules/lodash/has.js","../node_modules/react-dom/lib/DOMLazyTree.js","../node_modules/react-dom/lib/DOMProperty.js","../node_modules/react-dom/lib/ReactReconciler.js","../node_modules/react/lib/React.js","../node_modules/react/lib/ReactElement.js","../node_modules/semantic-ui-react/node_modules/babel-runtime/helpers/typeof.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_fails.js","../node_modules/semantic-ui-react/node_modules/core-js/library/modules/_hide.js","../node_modules/semantic-ui-reacLine truncated
|
||||||
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 434 KiB |