├── .firebase └── hosting.d3d3.cache ├── .firebaserc ├── .gitignore ├── README.md ├── angular.json ├── browserslist ├── e2e ├── protractor.conf.js ├── src │ ├── app.e2e-spec.ts │ └── app.po.ts └── tsconfig.json ├── firebase.json ├── ionic-3 ├── .editorconfig ├── .gitignore ├── .io-config.json ├── README.md ├── config.xml ├── ionic.config.json ├── package.json ├── resources │ ├── android │ │ ├── icon │ │ │ ├── drawable-hdpi-icon.png │ │ │ ├── drawable-ldpi-icon.png │ │ │ ├── drawable-mdpi-icon.png │ │ │ ├── drawable-xhdpi-icon.png │ │ │ ├── drawable-xxhdpi-icon.png │ │ │ └── drawable-xxxhdpi-icon.png │ │ └── splash │ │ │ ├── drawable-land-hdpi-screen.png │ │ │ ├── drawable-land-ldpi-screen.png │ │ │ ├── drawable-land-mdpi-screen.png │ │ │ ├── drawable-land-xhdpi-screen.png │ │ │ ├── drawable-land-xxhdpi-screen.png │ │ │ ├── drawable-land-xxxhdpi-screen.png │ │ │ ├── drawable-port-hdpi-screen.png │ │ │ ├── drawable-port-ldpi-screen.png │ │ │ ├── drawable-port-mdpi-screen.png │ │ │ ├── drawable-port-xhdpi-screen.png │ │ │ ├── drawable-port-xxhdpi-screen.png │ │ │ └── drawable-port-xxxhdpi-screen.png │ ├── icon.png │ ├── ios │ │ ├── icon │ │ │ ├── icon-40.png │ │ │ ├── icon-40@2x.png │ │ │ ├── icon-40@3x.png │ │ │ ├── icon-50.png │ │ │ ├── icon-50@2x.png │ │ │ ├── icon-60.png │ │ │ ├── icon-60@2x.png │ │ │ ├── icon-60@3x.png │ │ │ ├── icon-72.png │ │ │ ├── icon-72@2x.png │ │ │ ├── icon-76.png │ │ │ ├── icon-76@2x.png │ │ │ ├── icon-83.5@2x.png │ │ │ ├── icon-small.png │ │ │ ├── icon-small@2x.png │ │ │ ├── icon-small@3x.png │ │ │ ├── icon.png │ │ │ └── icon@2x.png │ │ └── splash │ │ │ ├── Default-568h@2x~iphone.png │ │ │ ├── Default-667h.png │ │ │ ├── Default-736h.png │ │ │ ├── Default-Landscape-736h.png │ │ │ ├── Default-Landscape@2x~ipad.png │ │ │ ├── Default-Landscape@~ipadpro.png │ │ │ ├── Default-Landscape~ipad.png │ │ │ ├── Default-Portrait@2x~ipad.png │ │ │ ├── Default-Portrait@~ipadpro.png │ │ │ ├── Default-Portrait~ipad.png │ │ │ ├── Default@2x~iphone.png │ │ │ └── Default~iphone.png │ └── splash.png ├── src │ ├── app │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.scss │ │ └── main.ts │ ├── assets │ │ └── icon │ │ │ └── favicon.ico │ ├── declarations.d.ts │ ├── index.html │ ├── manifest.json │ ├── pages │ │ ├── form │ │ │ ├── form.html │ │ │ ├── form.model.ts │ │ │ ├── form.scss │ │ │ └── form.ts │ │ └── user │ │ │ ├── user.html │ │ │ ├── user.scss │ │ │ └── user.ts │ ├── service-worker.js │ ├── theme │ │ └── variables.scss │ └── validators │ │ ├── country.validator.ts │ │ ├── password.validator.ts │ │ ├── phone.validator.ts │ │ ├── username.validator.ts │ │ └── validators.module.ts ├── tsconfig.json └── tslint.json ├── ionic.config.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── form │ │ ├── country-phone.model.ts │ │ ├── form.module.ts │ │ ├── form.page.html │ │ ├── form.page.scss │ │ └── form.page.ts │ ├── user │ │ ├── user.module.ts │ │ ├── user.page.html │ │ ├── user.page.scss │ │ └── user.page.ts │ └── validators │ │ ├── password.validator.ts │ │ ├── phone.validator.ts │ │ └── username.validator.ts ├── assets │ ├── icon │ │ └── favicon.png │ └── shapes.svg ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── global.scss ├── index.html ├── main.ts ├── polyfills.ts ├── test.ts ├── theme │ └── variables.scss └── zone-flags.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json /.firebase/hosting.d3d3.cache: -------------------------------------------------------------------------------- 1 | 100.dd1382e43aab43b581c1.js,1551268014250,fc85fd8ff97aa770ddf2f88a7d2054426a215e2186398b234872cbf776f1e9bc 2 | 1.813fc21f69e50bb1e12d.js,1551268014239,c5bd5f8872cf7c0d2e4508179d05ddd6b182f875e0c905761fd5dabb697d7a51 3 | 101.b061b64c9199a662d96c.js,1551268014251,8f593cc0d00dfdaa7db42e54f15c6a72f3ecdfba65b8c9f3f6695de508145a91 4 | 102.3201e9f25be9f8dad242.js,1551268014251,3cf116ff95a4a3899607e04f31454cf6309cf258529d2478b723b95c29207f00 5 | 103.f6720e4d866faac202d7.js,1551268014251,dc076a4f369082b231fcfb17d638b6e0e61e29a1ef4a83304408365ef6d7f498 6 | 104.1e7139db28be0f70f39a.js,1551268014251,de6d9ef4eb9802998620f869ad15c70ea6179ad05b3cca77b905fc44bb18839c 7 | 105.ec688fd3325880e538b9.js,1551268014251,85402d9f0cd4ee1e86093da0375536c5c451f7d65bcc889726bd81b0a53c715e 8 | 106.484989252d97b2635bf8.js,1551268014251,691f15315ecd361dcd6611e79915edaab28296ac8b91f0edee5e276267e1301c 9 | 107.c6f0579350fd1ddefa47.js,1551268014251,8ae448d3db6a2e2274e4e727cdb03ef68b547f78300f24dd2d1f7b770a925c0e 10 | 108.609d54916b0d315c3927.js,1551268014253,e7a480ab70098b300638f569bcbe15d3e448dd4cccd8ff727ca1aee6c6ce6849 11 | 109.c072fb1d0aadd64b1685.js,1551268014253,5f3c8120a19f95e3f75fd5e216bc09a4b16cf0112f8cad55715e79af76708418 12 | 110.cb18e03749e76f35b547.js,1551268014253,0ec3f3adf733ba64ae4fa070a91902dda1a78a456081416521ad6b4b4c49aec5 13 | 111.ededb1e398ec0e435658.js,1551268014253,318b45ede7cfa4a0b996fd1d184194bf51757339dd7a239e64416cd770d72296 14 | 112.bd227459e1ebdd76d451.js,1551268014253,f38baa6c97df4848b5ca2645524dd1d78514e1e53b4e73134d0ef94d95dcaf17 15 | 113.72f308844586d5e302cb.js,1551268014253,14430fa74d6526877fd241bab8c52566a341bbdf99c0a8460e282e98a754f8d8 16 | 114.8885b88765258835c12a.js,1551268014253,fd18e0b4c9b7ef0a5c5201512df9539f23e1892621ae56425f41da0171298585 17 | 115.7573484a089c75f88bc8.js,1551268014253,70336a3b29df1ddc9b855ad9fdb235cdae2481b94ec2da6867f6fd300ea2d2f8 18 | 116.330c16d20d3f121f611a.js,1551268014253,7eee17f918e7578746fd32d4f4f0633a322c87404b7f6b8e29d0a783adc0632c 19 | 117.61a20eba54f1247a7a79.js,1551268014254,3f709478d6c37335c969c1762f152388387c6731c8b910704f4f562afe15ec7b 20 | 119.d21add952131fbd4547b.js,1551268014254,bd1ac0e1862315db47b448c0585be3aa4b350b1f32c4e1944ce0167a1b8d0651 21 | 118.1d0f72c3809bce652454.js,1551268014253,91745d33ed994d623b836862a6d50ae2947eaf2b20df1c04a213c74a7dabf026 22 | 120.d72b4a1e86aa18ea8909.js,1551268014254,542c54ee2157bbc397fb745e0b70d15f62374a0f91d960530346d72336f9614e 23 | 121.e18853a5458078ed914e.js,1551268014254,35e5f37ddc65ebc03868f50e852c28dd0f52a88c236d20b82d27264b593cc42e 24 | 122.5dc3a7817e51363b101b.js,1551268014254,1ddedc7b3aee720a117d85c5290cb3c6cd0300351dfb8dce5d50000c36975fa9 25 | 123.ce61690865013e01200d.js,1551268014254,2f8caa3bc65bf9873b37073ce781ecb8059c6ea4378fd0933b8cd525cf0bcc29 26 | 124.f5bb1d828b11940aaa63.js,1551268014254,efdb741c24533f222015a9d7679489e2a8c8a8bc42cf1c7d575b3483b2588f2a 27 | 125.c895f89415d4e82d3ee5.js,1551268014254,7322e4ffdef16ebd55cef74513ff4a05dcccd8771a0359a3385bbebdab252157 28 | 127.08c6d3e6fd0f361bcc64.js,1551268014254,94c21f81945d8bb62e76d68de2ecad82fbbd7aaac55f52db938e003bd021371d 29 | 128.2115cf5026ccb376c93b.js,1551268014255,e4b82ded0c65247dcdacfe098630bc22d84ef5af6ece50bf1d98e44ef5406c88 30 | 129.79b119245f6984a3c4de.js,1551268014255,0345185c806c75a60583910291df0514f41481e123981b5e6d779bdaaf60fadf 31 | 126.aa307047f08657721516.js,1551268014254,821cf00e017e9ec31e93a4e0793c0d0eb2b099ab6ebb2d02794f9ba57164d7f5 32 | 131.d7f132e2f83bfae08bfd.js,1551268014255,87e1cd05a45424f3deeed2d3361aceb3baf03f9b81bec17b0d878362cabdd74f 33 | 132.723d865debef735e91c9.js,1551268014255,9742302b293c0ea1c77a29728c85cbfa3ec54249f5b049ec0e5a7736be8035de 34 | 133.61c09b309a81b04c661a.js,1551268014255,0563476dfe5505300c5e8559a4c6cb5368be2d7aab1456cef9518683a6f65e9d 35 | 130.cd27fe63c9a7c9dd44e8.js,1551268014255,b3951eab403dad915c6a6abc138e1862b528c360a9bf4b585e10cc54b3841cd7 36 | 134.e9ca5e9951ab39d15583.js,1551268014255,6bfaae26ced0d39890d7ac31c4891428a6ebef572880d39c29eb7fd2faefd8be 37 | 135.34af87843d53279c1856.js,1551268014255,c4af4b745095e30a834f17427916bc1df99c7f52ad08ff0e73250c5fb1ee97f4 38 | 136.d8fb69fa1ab22a67edcc.js,1551268014255,673fd866318d929471638c406c94cb147d90a761b434a27d7ecc000f7665cd53 39 | 137.15e3c5bae0463998302e.js,1551268014255,72dd99bb6476983a58d6c0e3eea16b944e4e93fc82bf58ebb734d812fcc4d1c6 40 | 138.9fcff0743f86ca809c46.js,1551268014255,a724869662834002feaa11da5029ae9c82087731c35090f983fda4ea1cc3d699 41 | 14.6826aad394bd8f8751e9.js,1551268014241,9156145c7ec6a922589c981c6ca033d88ab4bb690271e2b1dd656d41f06fd3cc 42 | 139.aefbc6a18b41815bcfe6.js,1551268014256,3f0b2dd8b5b934196ec039c80fa4e086bb79336db9e981185e3196411e28c5b5 43 | 141.70e5ee70e21550320526.js,1551268014256,238b7a39644ea63a517b246aa3557bce48d13f04585a861cfa0d246943f7787b 44 | 143.1fc7aa53d7e75e9be97c.js,1551268014256,85e90bb9eb1296838f9626092dada0a011ec558f22eac6f66f22f21e56e9dbf5 45 | 142.0c16286a6e55f00e4e4b.js,1551268014256,e8239ea0143fa479174bd9dd97083a09fd62c08ea4212e6abb5d8ccee8c2cdd0 46 | 144.ec2dd01927cbc2d05785.js,1551268014256,660fd0f295a727bf0ae8fd2f539acda9622d4d089b3bfefeb8e620faf1a34851 47 | 145.e15267c1cb6cd4a31c76.js,1551268014256,62451069ab666a3f06d7b0fdfc283149ab3445c2ee987fbae096821b09a4e85b 48 | 146.04762b0642209a228b80.js,1551268014256,4b2a7171557235d15ca6ed8f57d5a8beda8fef24ab58f90477fb1d99ff6b7bd0 49 | 140.1f6d10aac75f98fc0cb2.js,1551268014256,1887e0ac4b263dd94aa602a3629f91e919c1f0a0754d1077f9038faa27653402 50 | 147.698ef5aa544c57ce3c30.js,1551268014256,7549bf5e2d92be4c0628730a5c3f52b7d4472e8d7f5f7009f774ab12b76d19d9 51 | 148.f2444b1d06f42a8d5f52.js,1551268014256,3c05269c09ef0792b76dc9bd4c9066fa3f2ece46e013f97bfa42fa524c9aa965 52 | 15.ab9c97f05e8ec5b442dc.js,1551268014241,e59e39703148701bf2f01683f14ffc88b409a70593f4e58968b196c6bc64d7df 53 | 151.04e00c641e46fa3f33db.js,1551268014257,218aeb5baa1239a7348b0799aa3310c8006adcaf1433b0ef83cc0a28458b3e09 54 | 152.d1393f93374d0fdcbd9a.js,1551268014257,7f69ceec5af3fa03c7704c7a38914db485658de8ce81eea85aa9bd203cda1d64 55 | 153.d79e1a28adabc5352a34.js,1551268014257,e0a59e1308ef7ba51e88260e79b529d042460f44a65ba712e98517d0cbc059c4 56 | 155.dad16df09e983eb967f1.js,1551268014257,788756666c1d8d55362ffb0baf2248fa4f6150ae8c8f43d1f21895de53532913 57 | 156.2cf2bae54a9bca52f3f9.js,1551268014257,776ada9146cb4cc614bcfbb5ca59dec8c17133bc1d2f8715eaf7bf8d01c3e807 58 | 157.f0ed7de36d76415c0c83.js,1551268014257,de63bc631dad42db7b5eb22d8cec770725388d491f8763663add6a9e90281c10 59 | 150.ddd4f8a0aa624e006001.js,1551268014257,c313dee6a79499e035f7863cfe759bd32913bb7ec04324878a0128c15c243420 60 | 149.8a9db5c3d657b4ae7898.js,1551268014257,6a61499ac1f3ea1bf6ecaf82641a6c481c612b49c8169fbde3e8881dc8ce1e08 61 | 158.975a8319160364c1edba.js,1551268014258,fb817310ba21bb21ba40ebfff9a4500168d81cdae64040c79bd1558630f29c4d 62 | 16.08f5ea48214d9d78aaa3.js,1551268014241,c46aaa7050c8dd6e663c169d6ad563b5e109f7e9171fa90cb6d2632b11ae9e4f 63 | 159.d481135bbf0f365314a3.js,1551268014258,b31c905ae3c75b1d079dd898a1a79c150541ce33f3ead063551a487a3257377c 64 | 160.aca230c4aa2ae8ab8c99.js,1551268014258,c3e0c7ee1c026662d96ffd4cd4065eccbb4cc7a114ba1fbec6caada16b96cf48 65 | 154.d70da2e154b3b29fa698.js,1551268014257,f63317d36c6dbb88cba71ce6fe2c96a1f9d5b40f2e5004c44de0e8a0156aad99 66 | 161.aaf9f0cbd8407c0338b6.js,1551268014258,93eded18cc45d2e6bf547fb1146ab81b118965c00d843427db66a8e6a5ffa7bf 67 | 162.e37d17004ef0c9536c1b.js,1551268014258,31a8f259b7a682e7bcecae230521cf65c5f29ffb58000ee570fb63a924d7c766 68 | 163.358e749b08f255ed64a1.js,1551268014258,55838705f353326212ced6322fbad8702f8d98c2094e3a1940edb073d5c0c16b 69 | 165.c28a34e70d20307ea197.js,1551268014258,0a85fa06d89da4d1fc4b60f3960cf16d723f8bc8e9bc6a168af45a0559076b3c 70 | 166.c20d5583df227aa861c8.js,1551268014258,b14761b43b722bb5cc74b7460fc28df65752394137e726bf3e04638b8292a4bf 71 | 167.4d74c2a5295292beb34f.js,1551268014259,383542df20d6b9f71622bea766ba5341aa27e561a59aa1c6eb37e4251793f866 72 | 168.e28f4c8f7c8098a1e7b7.js,1551268014259,99c6501db36e727bb2ac60fe7cc1edb005f4cd26c3754031fd94f22e7ff7e96e 73 | 17.be23225ca42f93ec0aa4.js,1551268014241,64efc1620f7a6c0966c01359360fb748ba957034820649ffd4db347b738f74a9 74 | 164.ff8813072d2d77bd8d4a.js,1551268014258,1b614cc00668bc0ea8cde7f5293b987af6d46f4e3d54638dbf915c68b5f8c28c 75 | 169.3ba0528e916598cfa597.js,1551268014259,5a0a34e9a265c012ab1f02d30b98f476e36ed44fed16c3c24608509d77ee0ffd 76 | 171.380b4d420591290f67ec.js,1551268014259,4fffbe0c7d57a3a0fbcd6bba5a047dc8aaeb4b1db9994a5122304661c0c2817f 77 | 170.c26d728d24354832566f.js,1551268014259,4f311c4a46c9cfbe02b306362fc659e93202796946cba7b6a91b62182087f6cd 78 | 175.c595cb451441055a1cca.js,1551268014259,85b9d6d7bd398b11951fd71946282a329623fea1fe70c2ca82642f7c73459444 79 | 176.cebccb748332d1531fd3.js,1551268014259,bf0976c71582227f38777cd39f195256dd70e4c947821781b0b8fc3b92f638bf 80 | 177.adea2a84f82a1f6a1ab8.js,1551268014259,2437e32361ec42d114e1d7390f672b287f08180deafbeee05b89398c61c07b72 81 | 174.e7a7ea81787b837aad6b.js,1551268014259,2e39b7c0edc68b96cf08de3f9ffddee32d67a180e69c125c2339f5d83c988fc9 82 | 172.b54d0b6e9f575706cf07.js,1551268014259,b9f142b22d91c4ea4ae668f2fdc9c9cf0d8ac336f059db744be65e55b08cc942 83 | 2.ca67f48772eff7d89bc5.js,1551268014240,50b4fbd0017a927f03118a8a443bc5d3b2f5fc73397631dfd1174bd619866608 84 | 18.adfadd3b49243b69a243.js,1551268014241,8f7138832a83c6e57e4b3e9c73bba5cbe5b36450b1f7a2a9161a22f784fcb4b7 85 | 173.a91e4a77fdbb0a2a6be5.js,1551268014259,abfa304f292379af16415d74d4b7d76f7af66fcdef4da025bad23a5e23939046 86 | 21.bafe3554fd3ecb6fcefb.js,1551268014242,731f2cb63ab518954685f12e30e3df70b5addfb23a571b3b96fc3ede2567fda4 87 | 19.b2f63daccd501fddd297.js,1551268014242,e189362ba1ce507715a3eb704333fafb8f8a914c97e9175c5026f76bb7370351 88 | 20.2c336d439a4af28282f6.js,1551268014242,30bf4068f10072cf037fb1e48b511ce5ea0439698a01f187c96f9cd1763eba0d 89 | 23.5abecc6ac61341ee56b8.js,1551268014242,cdb27ce173df9708773826a77717897be08eff77cf5919a6d7bd78a7f9b0d3b1 90 | 22.a3e76d50e5d0e20ca4b4.js,1551268014242,a4399feaa220b6124f25dfb9dfc18eb8d6faa67ee7589e767547b99abe9ce762 91 | 24.09fec6234e0f575a453e.js,1551268014242,99b62c900f3b0f6a299264e1fbe755d511be193c9da79b9466d878ce9ed9d590 92 | 25.620715aea0af2a6a0812.js,1551268014244,eb8de58983724c2060cf4e19da0da6501ab4c43baff152e155bf547328a3d6c9 93 | 26.43b7c1f35a2b93a60986.js,1551268014242,a9d8ac8e8e1644b17ddb513122ac899bfbd51831019f8a967a8f949c9dbaa6b2 94 | 27.46f35eaaadbcbdf23c1d.js,1551268014243,17341212839e666ee07fb89b3a9e30bfb9561122943e34d5a173f999cfee0d41 95 | 28.c398682f153bc8edf6a9.js,1551268014243,7936a691bf87c7fccbf4cc22b58b72ee95f93828be4545fd376729e83f672bec 96 | 29.86f16dc756057fc1b1cf.js,1551268014243,d711f09812e71660c722e48c9fa3c9caf16e55c0f3abe9cc5f4cea29d096bf1d 97 | 30.023363d3e7c2295394bd.js,1551268014243,49c5eaa37f00c342da46ed3e83f986944f83ec64fb018f34ab8f3bd20f642a71 98 | 3.4bf1e1ca2968e4046cf2.js,1551268014240,f80125c07aabf0528b0bef1c5f7e19974adfc0c84822b0071a1107139aa58a60 99 | 31.9533b170cb2cb1059028.js,1551268014243,58441d945bc21b4f7ccd94e4efcc0bf9c8027eea721ee4234626b9ce6c9a17ad 100 | 33.fb24851775905c3f7323.js,1551268014243,eba1720c35ff4c9916db9e668dce5daa1ab17559fa91d58ef917e90d5c9fda2a 101 | 35.4e7f1ccf475686e855d2.js,1551268014243,1506789f8bead34b9a509498792cf45fe537968a87b2bb124f7c373e8c0a07ee 102 | 37.2817dc5cc4e6a2606c57.js,1551268014244,87642ac670a4b38ce9dc7be0dcfda6f482569a79b5df9912c24c0da3a12e6890 103 | 36.1e656e4a19edc0719e6f.js,1551268014244,446f8a30d1b1815bb13c1b0246f485c721314b393841d9cf01c88df22b6fa70c 104 | 38.6e714ae2ad0b02a8a038.js,1551268014244,5df664c5d9b1c04aa0ab8a84784459e544940394b24bdc9e97860e28e010c817 105 | 39.5759149876ae42d7067a.js,1551268014244,36efe4852d4b6603091176d4c638cc44ea9b5a7ece2e36bb52277c5ca560d20d 106 | 4.32a06422df083f7351d2.js,1551268014240,554748c5a712a27d9310b8039c861e1d5d2d91d4339c84d4a3080ceef0a6b1a9 107 | 40.dcd130c76a0074aa2aec.js,1551268014244,c440e8548a3055d9f18dc6f230d86710bd2a3f0a6af2381e64fcab6d7e1d68f7 108 | 32.9c8e0a28ec8872d84a9b.js,1551268014243,b3da2400e704e2f95ff59776a8db21f63eb3ca6d0e7a3fcc137ca5b1891a14f7 109 | 41.985e24d62e5f41e26a12.js,1551268014244,83aa67f98decf65a52bcdc25dbf67f0cfb94d8c1d08e04caa9faaeb1af373434 110 | 42.3722a5c738e135b194b3.js,1551268014244,60796b81bdf7696c1f7d8019d3a6cc3f32c8d5fa57aeb1890fa30268b92d6c90 111 | 43.63817c4bf590a10f2ca9.js,1551268014245,ce01370b147bf1e8cce457bb85f8a935ebb5248e564c55cd2e9782e8f32f9a88 112 | 44.f51025c6332337ccbebb.js,1551268014245,53ba244bffe6877a0f7c0bf4739b0222f515b11adffcfeded3f01814b128e2c3 113 | 47.64751cafc70f67705c1f.js,1551268014245,3028186bdeb4297f06ddd2287870bdca4eeb0c4081579a5ba6f0df9c5f033e73 114 | 3rdpartylicenses.txt,1551268014239,611b3e26e836e29b415d0defceb4d3930825eee1e2410cfc6f245ab663ef6cd3 115 | 48.218563cf705c1dc12765.js,1551268014245,fed75d3da781e86c30e001b031972a364b8b2168c1b44d58f6d7f8c258325b90 116 | 5.506b9dad58f7a70370e2.js,1551268014240,1d2b082df46a36c4fed7b991f0e9da2b1df539c9dab67db2ad8d428abaa16c14 117 | 34.b42447e6655af2d65788.js,1551268014243,c919cd7e38e33872f859f3f222afb6e5113f9d464a72a265601ea9986e7b4598 118 | 45.5d366123b62aecd02f63.js,1551268014245,eaab016084e7fe6494fb0a4022bd011da75626138f5a23d82715f345bdc1c3ed 119 | 46.ae7936ffc6cb8842ce92.js,1551268014245,a0fc3f0e95584706cdaec7ddde5573709c64805ec70215ba42fd2d6f555c9f79 120 | 51.e4edacd8d6e84c8e15e6.js,1551268014245,d9721e1ff04721a286ec22989ef7e2f489a50f8ce1462efa4caa29175772ec90 121 | 50.af6bbc77e5247b81a076.js,1551268014245,7795a456c3cf343a6b8a01186d058b48b76d8882aa81569a7772d5407900d16b 122 | 55.e84b1c53620b666f883c.js,1551268014246,8dc6d2d4fda4b99a645dac9979496c13cd94f4e5d851819c022a989df5615cd1 123 | 56.1e9d3e070279f10665ef.js,1551268014246,4d43d43f56d4ef2102266b414ae83e2e5c13a197e432cc8c6b2fc50a20cf7b99 124 | 57.f23dea0a4507362e0465.js,1551268014246,b729f81ba54dbccbb87b31980ccfe9ca6b8bd619941969a7f9cb3b6728b2f8c1 125 | 58.c400ca07d35c79df132f.js,1551268014246,de1e7da099cb297276ab8ec9b637e71cade45250be76a12b8e60b3123d4d3c8d 126 | 6.78748e6d59ca37c7ca2e.js,1551268014240,b405fced27b85f0202ba825bbb9ab360b2865710f3e2bc9c541cf96023139148 127 | 59.30999dac11104617fae2.js,1551268014246,6594a6778f097cbff9c3cc1d926eec7dc169fa0f570b9495fa78beb1848e1edd 128 | 60.6a8ce7fb1c2bebcb7fdd.js,1551268014246,dbe73ef95308541d8acb84c17ee075b5869e5a38c515f840becaa16f9d3b90da 129 | 61.b71622c9c1fefb23a4c1.js,1551268014246,2f9b89d7f1e71670af4b38031ea50fec9df9ab46ded07e9822be61e26df037ca 130 | 54.c938e836234e83332ac5.js,1551268014245,ac5a9f08b17312665481d3f203b9812e9244184126029c5383081fa22bb5b0e0 131 | 53.53b0234c1011f37a3cfa.js,1551268014246,b145d0d7f1eac9bda82dc2e904910111a133f9bba8b2bfa69a7197d64ef192d0 132 | 62.2a5f70da53252f9507ef.js,1551268014246,71b51c3858665828ac765fe99c7acaa652295fc252e05379e75bd5f367d5d080 133 | 64.251f3d026e4da4f7a163.js,1551268014247,02c98753dfe450dd99bd5da921d12728623fc64aaf940678e9701ee0c6de70ac 134 | 49.a2a77c070397c35498ed.js,1551268014245,5d1e6e5b03f36298c5da36fa43657435c3db5076be53fb4285fc57d47d6e5eed 135 | 67.4229d33952d22c9676ae.js,1551268014247,b351c8d096164c1b643e958e02df49294111b526faaddf1c44ebc7c91410cbec 136 | 63.aa1cea34d4c975801c10.js,1551268014246,6c770eef8f247e9b2d62ed10fffad89816b1e19de0a64db46cd6a7349dc48afe 137 | 68.784d12cadbd2747b2e15.js,1551268014247,8539c15b4a68bbf19503f9f7928390b291c58aa7cfecf7b6a1e755ceacb08d1d 138 | 7.4e664add1f105eaefae5.js,1551268014240,0e508f3464c6f196bcdf53c46ce7cf1c8fe476df6c54fd408ea0d6b06f0a2137 139 | 65.9b255c56ef6d870e508f.js,1551268014247,f31e01ff327e7c4cafc9643ffdedc102bc5d73c979a19b936d6c4c0fcd177742 140 | 66.712feb64f315af1021d9.js,1551268014247,b6134dce7300883f0f714573cad3514b15d1eb9ebbf2b0aaf4b2e1ad45a5ba1f 141 | 69.7d7bb30915dacd01ed4d.js,1551268014247,2a181234393f65fe7aaf6fffbbef2abf948646c0c9fb68e9c8cb27b3f9f7b85f 142 | 70.3fee9b93b33b876df534.js,1551268014247,417821523be2ad0b418fe155c903f8152b843db722f22685a4e8019c36e61bdf 143 | 73.ea6e844676b1239c2a09.js,1551268014248,84448b48d9c4005b1a5d12ef257f8ca5f9b8502fb6d0e752fe0274b293d0a572 144 | 71.02ed7da8a64029f2cfa4.js,1551268014247,987da66f07e99d6e44a6ac15c608ecd9ba67df03c8c6de73a39ad4febe16e4b5 145 | 72.7b997c6e4df3fb764f2b.js,1551268014247,71a11843bb5d073d1b7c4575bd918d4afac673dd0a1b932bada7ec6373a09d3a 146 | 52.f10be1984d1434bf5f61.js,1551268014245,1ab720dc25886a66606ba08b3fc095279e985cd9d88aeebf964e96e779608047 147 | 74.bada635dda840c9a6b96.js,1551268014248,4c8d47f1a6f484a6361983c59f2432f63a3ea13fbf9c9eefa1fb7e70b97e5c0f 148 | 75.be1d80573f114a5ce053.js,1551268014248,af995b058ce29385cc93a2d2bdc30235bf039d0aca0834f8e8eba7c32651984f 149 | 77.2bef9bf144ac0caaca70.js,1551268014248,9fdd2dbd895f0efa4753d92abb8a9f6b9afb28df9430e342df4559ace17e6a83 150 | 79.7b1024b8e15f44907eb5.js,1551268014248,56a386de1a6aa9b584ac13efd819a7262e64ff04478ed6bb2bb327a884e61daa 151 | 78.7cab2a04c356052ae915.js,1551268014248,60665f04259c9cce20950691c9440711e465aa5415b951f01af613ad322a51d9 152 | 8.5f023a3febe3f217f755.js,1551268014240,257bc3221d1c00cdfcdc584d6fbed66139d7e665c8b8ecf072eab056dcf297fc 153 | 76.6c99d2a1ce4aa3ead7a7.js,1551268014248,7a405d18ac5ae095ddb61ec19cf1131e6ed63a7c9cc2b5ac611e5e5036eff411 154 | 81.8cf36389e4dc24ad7618.js,1551268014248,e5c286937b5dc891c0cabb68256e7ae52b9d652667cf21894dd70fa28f17de0b 155 | 82.57087241623a2f4a73a7.js,1551268014248,e31f049c7a9509f411693c2967e78c54ff92ce7bbb8721677b74b5af3725f339 156 | 83.c735b5c52d34aeb41275.js,1551268014248,035cbb7afd6f4670755bbc210138e5afce1ff823a8b6d9e0f0bc2c935221aa39 157 | 84.ccbc91b9ce8d46f7be68.js,1551268014249,a1f9aa46d068cad82c6e05d639d542d5764e7ec8ba6942f1f8c53012ed125a5e 158 | 85.19e8838bffa287c52092.js,1551268014249,8f72d7bf1abc08a0e96dfefcce3775e7a7c544986dbaf4c2d71a3fae5e3f6c56 159 | 87.071f8595346cdba83935.js,1551268014249,e8c029e755fd6290a868e74a87f36a085af8c05af8ce48177471fe47b2f10c43 160 | 86.d39f15f1fa58769a136f.js,1551268014249,84f838e2e832dee4778e457177a32f703e63345c7ca1f3a9e3386923413691a4 161 | 88.323154592673d46ad937.js,1551268014249,d9577dd20c0ff8cace74fe047ed565911319d0d642b3681a114d2ef22d0c75d3 162 | 89.66efdd2585920d0ec5ca.js,1551268014249,fdeab851f6573ab07b07e1494ffaa4fc7f88b74a1357ea5415aa92d2abb142c4 163 | 90.7c1313d64f49761924ea.js,1551268014249,c87b05a6b6590629fa779efa1a6a2a852bc07c8f8d699ce889d0654e5a759614 164 | 91.bb885e022e5dddd76bd4.js,1551268014249,aaa1f77382971976e78647aa18bb5e49ba588a1c741c1e5034cb29c4a45132d4 165 | 92.cbdaaf23431d6d1c203d.js,1551268014250,eaf722d96394457e0e9a3697624c480bde538410cfe63b90bc857eb21ad1aeeb 166 | 93.a39a5ce6c1b27c93e8a3.js,1551268014250,cd59fa6674a63d789625ecf331162aa860fde9e2202c0ec5bf41d56fb800791f 167 | 94.301bfcf8e13c988fb660.js,1551268014250,b4eab3ab751390f9ccc988d7db0830aa154024301960c7442a1fe999f46181e7 168 | 97.a756ec95c2b23ef43807.js,1551268014250,8104e399d9c19eba979c7fc013a439fed1cfd7d708fcecb3df3a322507902ccf 169 | 98.0920077f22c060edb0af.js,1551268014250,53064365a9a8e4e5a40ef47f6c8093087c31ba5e1eb40fa23693b22eb4432534 170 | 95.0d12ab3b7f95d67084d3.js,1551268014250,556a734e8141b2dfddd20231c5e0e69fe904d1d873e5220388e7d8c311f29f52 171 | 99.87751d030f3765f1959d.js,1551268014250,e6b8cebb164cecf5e035839e11eb6cdf7f531fcf06996c8cf2816042ba03f675 172 | 96.3f1baf4753e0eb30d082.js,1551268014250,29f0936733752ab7f5efba16119ff88518178c83e88d0a0aae1c8e9140fda06b 173 | index.html,1551268014270,6f1a4357dab38b984d24d9d627fc8d2cd3d86c39f705abc6b036f4d0ca0c8eec 174 | runtime.2b563413a05015364125.js,1551268014240,43c4b59be59eae00ba454fd8800950a7a0c1f48c69bf9b1249f614d3578cd8c4 175 | common.e8752ed6998342fe4bb5.js,1551268014239,a0d8bc95daf55bb278b56d89c26121688df5c88d8b53f02a33eea6f181fb0091 176 | assets/shapes.svg,1551268014358,b21e747ee911c1d3f8179a70c8201320f93c4067017e0defa0640e54a689a06c 177 | svg/ios-add-circle-outline.svg,1551268014288,6cf7a70112218e2efc47f87edbf80bc1048623a5db0d07f6fcd65956d1ea9b29 178 | assets/icon/favicon.png,1551268014484,8e68255d734086edf5b43bd7f16d3afc37ef2b9b2a4e8fc385e87a79b665ef3e 179 | svg/ios-add-circle.svg,1551268014358,9f0531aad8c5e10cba0baff2016d810d50d6c5587060f286acf08eac7344df80 180 | svg/ios-add.svg,1551268014358,9738f0129f0682f3749dca29998f010fb06cdcf3fad8ecf5cc20a9ef8c614d7d 181 | svg/ios-airplane.svg,1551268014358,81cdc91f996f66db015f3f7365700fea192d6ff0fb0bd91f2e50c884e0c47001 182 | svg/ios-alarm.svg,1551268014359,3fa3d83316986b851357e31fdc51ecf18eadb2c3082a6f4a9dce3af5b66f0005 183 | 80.149d558f03ce3b88d326.js,1551268014248,5ec7c0acb9673aa79afdc21a116889a205fc942a9842927f6b83ddff131e34f5 184 | svg/ios-albums.svg,1551268014359,1638f7538d885c700c39c6a32d09cde5dad972ed46b3c42451316d5d22526b37 185 | svg/ios-alert.svg,1551268014359,c735329777508a4c184be2045a48549d1c42326b9896f516946885fe2b550eca 186 | svg/ios-american-football.svg,1551268014359,f02d2d305bf4d14a5e2f17d10b033c864df3cf938f58b9d3b0befce4c2b3f5ed 187 | svg/ios-analytics.svg,1551268014359,d62676e5bf3e098f21a8437314f6ee18a0196d674abb87ac450d2e7cfc8665e3 188 | styles.17173b097c24e07a972e.css,1551268014241,19f389b13ca309832da28f2ff0fe7ea978006a058da97a419a338ce64e8eba89 189 | svg/ios-aperture.svg,1551268014359,8f6d78830c0355355efdfdc75703f9ecdc8d5470a82132729c0a9f74f43bdc00 190 | svg/ios-apps.svg,1551268014359,37fce2cf0bd4758ff110976cd2bc12df15ec1514256fe3699d2edd2855218c03 191 | svg/ios-appstore.svg,1551268014359,db06e504999fd2342becd25dff5fedce52ff848dc0a1d95b12cda666dda0e93a 192 | svg/ios-archive.svg,1551268014359,a98fd4cc3b336845d467a023f7013a4c0932d40d6aad90819aecf7148d9fe902 193 | polyfills.24e87a3030fd6ee8b68e.js,1551268014241,858bbe007c6ef0fb3c9e013acc11292b425964855767eeacb023fd503685b0ed 194 | svg/ios-arrow-back.svg,1551268014360,3ae6c6f4f7f6f065927f84382df613b05c8ebb48aba18b0f6ba8e9fc99a3f940 195 | svg/ios-arrow-down.svg,1551268014359,f1639acbe190c72ff1447e3405b385814efae8c7b856ef65f2d2edf59d773fd1 196 | svg/ios-arrow-dropdown-circle.svg,1551268014359,6078d5b56bd7e59b667dab94bced147128a8c26b58e67776c37aac8d42e82574 197 | svg/ios-arrow-dropdown.svg,1551268014360,21cfda13dc61baa8392e3dc589ab85a9e98a547e8dff1fc302946a400043e27b 198 | svg/ios-arrow-dropleft-circle.svg,1551268014360,31e282d4251e151b62f3aae2d2cf5bee220b7be5ddc6079ed755f90c0a6e5df7 199 | svg/ios-arrow-dropleft.svg,1551268014360,8562121eaf4633b02f16d84d392c3ef338d05c950e00a5686700c66058d26392 200 | svg/ios-arrow-dropright-circle.svg,1551268014360,3dd201977dc6ea1f16d4550322455495cec8400e184fe89225b4cfb86fcf647c 201 | svg/ios-arrow-dropright.svg,1551268014360,477167d146093c2837aa532743b4421c0642a6b5e64e3c3be93f09755c81afd6 202 | svg/ios-arrow-dropup-circle.svg,1551268014360,097d28d3667a1dd2d4a2f1a9f82c4b30059991d126241322c55b15a279d6976a 203 | svg/ios-arrow-dropup.svg,1551268014360,159b0e38b4b57c3377bd8f4e01ad148c02cced9a63cdeb2405dec0c41bc9be6a 204 | svg/ios-arrow-forward.svg,1551268014360,9428a4f85e666e57f5d07a999d1282bfe04e0c7f8e9d40e38db695f4475f6f08 205 | svg/ios-arrow-round-back.svg,1551268014360,6ac75346c671c7ae2b1b819ff7872956bd692baccdf6bff69a8e90142845eeab 206 | svg/ios-arrow-round-down.svg,1551268014361,fe3433472568b3ace7567cb64b8d51f3e39f818a0db89c2fd7c703dcc499deb3 207 | svg/ios-arrow-round-forward.svg,1551268014361,ad45b2a890bf53a4da2824f2775769867de8ba13c8a3f02469a25f404b43d45b 208 | svg/ios-arrow-up.svg,1551268014361,1ee5360419d889654a51fb3bd693abf07984b51d282b9a397e3a675fbcef65b3 209 | svg/ios-arrow-round-up.svg,1551268014361,058b3f81be97e30471178ab28d9e714b151d346bb526647d5cca4ce526c8c914 210 | svg/ios-at.svg,1551268014361,639ed5929aa08f579f18993deb26abed699889379d44f589d6a860ba91c6c819 211 | svg/ios-attach.svg,1551268014361,051159472bb7dbc9b95d24551ca823b9e69b639f1acd4da5b34437ab3825cd60 212 | svg/ios-backspace.svg,1551268014361,586a3d32b2e8190aa5fc8b2cee9ed4e9e9fe05620c9f4dc800c56f6d4ea29952 213 | svg/ios-barcode.svg,1551268014362,399e1209cbcf0f638e219ff0ebdf7748d781b5fecb7cf9d9f086aa54fe18f7c7 214 | svg/ios-basket.svg,1551268014362,3157a4f8f712edbd9682cd63701d2b13c7683f0f85928f5ceb8554b87164f6ec 215 | svg/ios-basketball.svg,1551268014362,c6857a914f472590456f57726e40361349ea9c4c5178a0807b8c72b77f3307aa 216 | svg/ios-battery-charging.svg,1551268014362,6f1bea6a04158dad70ec982a4dc340e6c418085802816762b84921919e5d9a2f 217 | svg/ios-baseball.svg,1551268014361,01690b863639a8a61bf83be8a4397e2a44cb3b544a0be4e98da9e93ad592e76b 218 | svg/ios-battery-dead.svg,1551268014362,22acfd04f9cfbc16c6ec5dc37757860bb9c330a30285d4a527299da0e4f62d0f 219 | svg/ios-beaker.svg,1551268014362,bb1aa32c3235e950d780d61b96df89b878e1cd7e47da0e6792e17e5d49440fb0 220 | svg/ios-battery-full.svg,1551268014362,752284388dbc0ab9eca02766eb8552518e85eb85146ce6ebe45d9a562a0b364b 221 | svg/ios-bed.svg,1551268014362,192679bdc02cab8e7f595a72cd925b8754b7d6542d60c7e928e12042631004bf 222 | svg/ios-beer.svg,1551268014362,126bd75ea71f70b256f81ebc9f2094afd0812324ffc7793bf328667a7e844ded 223 | svg/ios-bluetooth.svg,1551268014362,e6acf3ce8ea95b05eaa82e7fa830b5a75b87a0aa2d68dbd9fa7b5e48985d7d56 224 | svg/ios-bicycle.svg,1551268014362,a3e6454487f89b095535dbf8cc643e1a07aa3dfd4ff741fe064f39fe31b2cf83 225 | svg/ios-body.svg,1551268014363,e63da0578dc17005be1d43eb753960e99658bb009d6760e5649c8ee61442c53f 226 | svg/ios-boat.svg,1551268014363,cabf851e8eae40bc44f5a91adeedb79f8b42fd8ed97bb27990a1360b088a1337 227 | svg/ios-bookmark.svg,1551268014363,dc0ffa3e1c103c9422918f56186bd00721d70ea24587501ecd7f20ed313ce082 228 | svg/ios-bonfire.svg,1551268014363,b6c99e369a0f69a5d4673868b60102f2708b89a8c0e3ac6a2257b1e8586b57d0 229 | svg/ios-bookmarks.svg,1551268014363,f43138f9d8e24212a45974591bd58ecc493bfe39eb96e502cf8cbe11f48aef1d 230 | svg/ios-briefcase.svg,1551268014363,4f1f38a5687942719a4fbebbdfb67b31c92ce7ee85353f811ec06e8f067981b1 231 | svg/ios-bowtie.svg,1551268014363,f5a99892fe2811f7fdcfd331228f0de6e32ec4b6986720739c2efafaa5359a4d 232 | svg/ios-browsers.svg,1551268014364,a1089a992110a3e3d24176907cbb8cf9c8c2f104c167f540d84e2dfe564ae603 233 | svg/ios-brush.svg,1551268014363,9a00f61c3d73774dff98b7cff3bba792bbd112be7f47091c4f41f719fd07f27a 234 | svg/ios-build.svg,1551268014364,366619eeb75bd5f83ebd5481deb19abb9001c2da5a07f4a7391276aef9b97782 235 | svg/ios-bug.svg,1551268014364,953537fda3425bfa44d402c889937690630eae02057bb77fead9754296217962 236 | svg/ios-bulb.svg,1551268014364,9fd82e0318a0653020b6a998f4689e41a7fe0dd539887718db019002fb8ff89a 237 | svg/ios-bus.svg,1551268014364,e2ecfe33bb6e46411159f2a989a4e9569d61f9805eaeec9e44f50dc8a9e0122f 238 | svg/ios-business.svg,1551268014364,974b1a926627c216c300a4e6699fab945bad667438d59f09f3f5ecf77a2ef60d 239 | svg/ios-cafe.svg,1551268014364,78bc3a0dd316e77382c54f35f0cbf58b930f94849980b59afc524b5dbac8fdd5 240 | svg/ios-book.svg,1551268014363,69251f087d256712bc485a3af243065464bce824228dd48fd08628124d8d15f4 241 | svg/ios-calculator.svg,1551268014364,e34bb570f2c5c104932dd1e1912ea6df6c873832a96b4ff85cb5dfedb677280d 242 | svg/ios-calendar.svg,1551268014364,132aa0ecf173440c643833fda9ea424e9605412f49d6ef2fe2994fc84f97feff 243 | 13.bd0e5aac931eb0207d1a.js,1551268014242,a1b20240682c90bb0793718a19ee2bfd2f6b00472ab62853e16db05b75d287b0 244 | svg/ios-call.svg,1551268014365,6744634ddba15d5b81da857a8a89a39ab9355bfe072d559bacd86fdf8c1e98c4 245 | svg/ios-camera.svg,1551268014365,883d9f242c82c5c9829e1b6d7026b3474599f49c850d9f7402750e43ee784230 246 | svg/ios-car.svg,1551268014365,f42a24d227c796b201aa521cb6041415479a77d756e26d22d768b96794e1dc3b 247 | svg/ios-card.svg,1551268014365,e982096facf22ea6ee563f846de136eb9eecaf8b6bacf0e531eeb2785cc4275d 248 | svg/ios-cart.svg,1551268014365,48e5d2dee2803c652a281437e947aa362532b4b8e016786dfdae2c2bd702e44e 249 | svg/ios-cash.svg,1551268014366,0d868bc013a3c6c7bf09b16292a770a62032f8e1533a6e93cda44271646188e1 250 | svg/ios-cellular.svg,1551268014366,2de1cb349b91f4924374a9104cc3bc8879bef78f9aa9cf36244a6937affd9d3c 251 | svg/ios-chatboxes.svg,1551268014365,0889f4ca30bae19dd5aa056c5881afb40a52c98a9410b99d41c208ca7c24355b 252 | svg/ios-checkbox-outline.svg,1551268014365,e0b2b91877b2ea71957e91e0f54430a1fac27cfc955ab59ec20233f22681c1ae 253 | svg/ios-chatbubbles.svg,1551268014365,a80be38ac4778ea2338d5ade7c0c60f4cafdecaf3fa01422bba57faf44483b30 254 | svg/ios-checkbox.svg,1551268014366,48ac7ac0dd49d231f6ab13a75c4f2fade30f609dba6b611f437d2a70492158ed 255 | svg/ios-checkmark-circle-outline.svg,1551268014366,8bfd4875cdaaf4bd9b329a765637701785c7cca74f02bff43fab469071a8b2cb 256 | svg/ios-checkmark-circle.svg,1551268014366,a2610b2ee40c86596196a9f3b7deb3e456fd3ffe0d6a6a17ef372daead910415 257 | svg/ios-checkmark.svg,1551268014366,f1048fb0127acc44d37ae36184b4a4ada335b20c8ce29b0a2eec1cb85169cf96 258 | svg/ios-clipboard.svg,1551268014366,6996c470185981bf2ece4943c8d24ac1e9076289ba36249da6f523ef0744041d 259 | svg/ios-clock.svg,1551268014366,89da7caef0e3eddb701076f6ffb2327d7db41b4e52df926853900c44940bb315 260 | svg/ios-close-circle-outline.svg,1551268014366,f1dd948e91351bb1a3c58e36733840fc47d67b3f5b2b2411b6c5b594a1be796f 261 | svg/ios-close-circle.svg,1551268014366,dc7251d915294d1abbe68fed5781220a98914bcbd3537818a15f9cb09ba3228b 262 | svg/ios-close.svg,1551268014366,45e041c4824a9f3a2b27108a14bec1cedeff0bad5a1cb62c0b2cf5b166fe654a 263 | svg/ios-cloud-circle.svg,1551268014367,ab8c5eedd612e12a469c94025b67ff83150de768d1dea3195d003a1de8249e00 264 | svg/ios-cloud-done.svg,1551268014368,9f3d131119d9125270a3ebe335f8048843c97f286e7e39ad5ba06612d654a1ef 265 | svg/ios-cloud-download.svg,1551268014368,9948baa190a75b73ac52ba6ff4f37c9578fb2cddb871c31d33fae35575c58733 266 | svg/ios-cloud-outline.svg,1551268014368,57ff6c3217e53eba7d21367b29b281d6b54b41a9f94fd2f5b263c1e3bcddb5c4 267 | svg/ios-cloud-upload.svg,1551268014367,93b8568041e367bddbfe0f5fb98f71d8f3bff609fe96dfd34da7e84efada4b9a 268 | svg/ios-cloud.svg,1551268014367,369d78e9c0891feb4c2cfac657baa1e44316e8b68674ffdff6910e1e8ad05c82 269 | svg/ios-cloudy-night.svg,1551268014367,329188b5d6fa9a315e4e1517639f48d8c1891ceafed7fe4be05e78cce5a39f2e 270 | svg/ios-cloudy.svg,1551268014367,0d5ef3cf5e997aef14b8502a97c6e296204536548d8bd77b16d45b72b12daa33 271 | svg/ios-code-download.svg,1551268014367,e5a56531a958c929c43fc8b81f91a75e9c84d0c6746eefa76c6f3a037217eeae 272 | svg/ios-code-working.svg,1551268014367,47576594f3a7d9b8ee05a6481262e6524575f3ee2d1f95a5367a6a67b463e668 273 | svg/ios-code.svg,1551268014367,165dfb2f00f0b2aff0a94e2a352d519f90ae4c1e5fb844d3a1669404ad8703d5 274 | svg/ios-color-fill.svg,1551268014368,c5b26a5a96c98791bfaa1f51207f3d76c94b9b7c0777d6db1a41e3034112f7fb 275 | svg/ios-color-palette.svg,1551268014368,8034742a5dd7b39e8a607576e108a7fc7f799eda16ea8e80db0de052319faba3 276 | svg/ios-color-filter.svg,1551268014368,310686e506c90e23d285a06779f2fff9468c69f86fe9e9b86717f0188a7b2436 277 | svg/ios-cog.svg,1551268014368,d0db37f6062f4644da7d89438d8118be6d70df11a36f0c2534763a8485188e0d 278 | svg/ios-color-wand.svg,1551268014368,5ace41373d5b612f1bfffe5385b8793ab23c2aa19eb0511b6192c807c220ec94 279 | svg/ios-compass.svg,1551268014368,c906079abb7665ea6b41f1b4b0bcb1ca18962f4b5b2d767c8a78f9ba7b4d81ab 280 | svg/ios-construct.svg,1551268014369,08366f82f2144b8b471a10b8fce964e0bdb6e58504123d86ad9f32e8ec6b5262 281 | svg/ios-contact.svg,1551268014370,cece93a6b62b9b544fe3fda54ccfdbc11bbde45928e85f5eb9a37fcdb7d60e1b 282 | svg/ios-contacts.svg,1551268014370,478692f979bc08e6fdb1f779a6790e63fba43239418ec484ef40d5f884f46090 283 | svg/ios-contract.svg,1551268014371,b45644f2b0750d54e7638ff5533fcd9ed35131be2670e6b9d33e267d48292007 284 | svg/ios-contrast.svg,1551268014369,f2ddda16b149c0a24fbcea39bc3949adc304a16f3742762720431faa30549271 285 | svg/ios-copy.svg,1551268014369,d10d27d3d2a7467235a98180bf4dd7e7646f8a5b79424a8b23f3227ddd9575b2 286 | svg/ios-create.svg,1551268014369,e2f465a49bd527a3e90cdd5b079d0cb9f5d215d03e9034a3189008d7e598c63a 287 | svg/ios-crop.svg,1551268014369,79193a0284b44887576b9d7a27a34df384effe44beac64d5d5c4a5151a01e2b0 288 | svg/ios-cube.svg,1551268014369,e7970e3ebaf94808fca5531344e6bee468b19b2ba4d971deee70bcca3d8f0747 289 | svg/ios-cut.svg,1551268014369,84054e2533371ccc1d21bce41f8871ee2266d0376a96dbe10bf5ee6a01b23643 290 | svg/ios-desktop.svg,1551268014369,3418f456bc448650acc50c5d4fcf3e82c859fb1c321cb9397e7ef62f9b837748 291 | svg/ios-disc.svg,1551268014369,19a3539d41c218894b2ea6568c6eaeb9c9f74110e8270ef7b7f15f4005ef24ac 292 | svg/ios-document.svg,1551268014369,e9ae2ac51318c83b390ec83570145e5527922ef5f5c9f384776504aa372ead2a 293 | svg/ios-done-all.svg,1551268014369,4ee59ef60c26a4c69915a9b042bea2bbb6d60d1f3fea2d7dfd4c5a231d164fdd 294 | svg/ios-download.svg,1551268014369,7c18407e7ca20784f45d4ef7ca6d2b624c08d8e5b4a8f8a4cb0df08a8b4bed66 295 | svg/ios-easel.svg,1551268014370,2a5837a6054aff606f1fdea6e0537764d6f1acbd4f4705c332288eb8be8d2f7d 296 | svg/ios-egg.svg,1551268014370,8a4cd145bbc922aef4520536e2f3a5e033dfcd0870339efb8e7c1cfbf266b8fe 297 | svg/ios-exit.svg,1551268014370,45dc4a22d153e87419f4c8e583d1fbdd3646d1e33f3e1bcb52811213449f5264 298 | svg/ios-expand.svg,1551268014370,960e7917184d4884687c2ded6071a9abb99d8818acabd5356e57cacdf8c47eb0 299 | svg/ios-eye-off.svg,1551268014370,0ab9f52989eb6a4e154eb2d356d5812e9eac90116d8a57411461dce6b8dc2749 300 | svg/ios-eye.svg,1551268014370,6fad89b4b12a254e824ecab75f9d6661ee79aa0d59d8bb9e5ebefebcd78d0f1a 301 | svg/ios-fastforward.svg,1551268014370,8c98e2ee4c8ef8eecee96572d28d4df7c0db49fd5075d4e031877b0a05b30622 302 | svg/ios-female.svg,1551268014371,674510e8a3e5a1db74070b63a524b15f32431c7c0efa267763eae090809c8955 303 | svg/ios-filing.svg,1551268014371,d46259be0045aaccaf19facb72870bab211b1aaddbe4c1bc2aa204ccdcff6631 304 | svg/ios-film.svg,1551268014371,fd71062575bca9d6e43bda8137b607de081d8541f933531a3d847ba8f58cf473 305 | svg/ios-finger-print.svg,1551268014371,b5d3951d2191a91a7ea0ff791847c66c83d6d83b9b0cf0e2eaf90496837d6ef6 306 | svg/ios-fitness.svg,1551268014371,172b9df1a4d4a17d4e9d33872c9111296ea62c0c6ba82c37346a5382dc6a4d16 307 | svg/ios-flag.svg,1551268014371,0b8d57aea7eaf8d7038c3811fba94658391de4a118a76d58d6e41edc23f0abcb 308 | svg/ios-flame.svg,1551268014371,05b1ef6af06d6a04396addaec33682e2a1e1b7da37c8347b4c11bac8046f7394 309 | svg/ios-flash-off.svg,1551268014371,6178d431db09e07ced8d78091e3bf045c30b3fae9843ca7332d43d635e638fd6 310 | svg/ios-flash.svg,1551268014371,749e7ba29adb1c7599dba4619bb0b949857b07efb7ed44e9a4d78a02893f9c44 311 | svg/ios-flashlight.svg,1551268014372,f9d05be8a8b9cab11b51e3b42db44482e73b7450e56a97a09b99194261e6f7ee 312 | svg/ios-flask.svg,1551268014372,cd3c791784f4475b712d396d4c6fa98fec0c67459e084bbac7ab90ca23ef7a05 313 | svg/ios-flower.svg,1551268014372,07f32d498d994239a7d0a3007be83d51202dc2efe7325adeef10e55ea1dd59a3 314 | svg/ios-folder-open.svg,1551268014372,4f1eaec94c056b22f546dea3ef410eefbd9b31b8ba1c978e187b33b87a7a138f 315 | svg/ios-folder.svg,1551268014372,14cdb2f609b1a40ab0a4a65f1e2011f1de1d72f698d6063a00fe688c7ab47b3d 316 | svg/ios-football.svg,1551268014372,9379d7ee063a6b427d7d812a55ec52495faee6c462820d83ffe2a32f5425e101 317 | svg/ios-funnel.svg,1551268014372,663fc5aad404b53741bb79f2f5e726cb7315a563385c296a8959e5e0475b1dce 318 | svg/ios-gift.svg,1551268014372,08597c84cafcf56d277f524d9e85bf8da4a92bce3bc4c50897764f1ddea8fa05 319 | svg/ios-git-branch.svg,1551268014372,575b3bc9ad707720aab7793a451a8b7a5050531a18cf0583ddda8cbfd80892b2 320 | svg/ios-git-commit.svg,1551268014372,29830686cdc27db8c8ba8091f807f78a658211ccdbbca30480a3f2d3672de314 321 | svg/ios-git-compare.svg,1551268014372,42331c36453d2b16a464a9ce18cfd3e5735f8d71444ac6ab4b3cceb79c1e7650 322 | svg/ios-git-merge.svg,1551268014373,c4398503b44233ce1d1737d03d0e12e7975a2eb3de371b5be5facf818bd24731 323 | svg/ios-git-network.svg,1551268014373,b17b26e99e8202b2b4cae90460d63ea560b8714a72c5368ef16f38594c6842d2 324 | svg/ios-git-pull-request.svg,1551268014373,ef0233220e40cd6e5702078b7d7588ddc710a8db036bfeae809b16bc007702a6 325 | svg/ios-glasses.svg,1551268014373,cc8afbdb699f8886c69ba73df51a2cfb54c017e6294168095e0f0e453d04b411 326 | svg/ios-globe.svg,1551268014373,d7692f13e8cc91fc731c6d10e5d6ee5c00ed854f175a48aa5edce8726f6f0283 327 | svg/ios-grid.svg,1551268014373,8f370574914adb0dc56743af163bd3bf3e8d9d4b5386b6ea4141f419141f5a99 328 | svg/ios-hammer.svg,1551268014373,032fbc1961ce87f28f1b2377b5e838c5e93fdf5868c4a31051f0d319937bc4a3 329 | svg/ios-hand.svg,1551268014373,1657bc3c4b0b4707a88c468e92221c25c9ca6c6d91c89a962c329dffb20816f3 330 | svg/ios-happy.svg,1551268014373,fb672144cade8cea47bdcb2ce003639a4590e9d9e5972b6f321aaf2bd72a195d 331 | svg/ios-headset.svg,1551268014374,bc48f86f1703c12c37a1fd2fde739f3b56d07d7ebdf50cf0774dcd3090ae5bc1 332 | svg/ios-heart-dislike.svg,1551268014374,a8d7577e606c46b5680695178eee18cd692936c9ea6c762adcb31ea93462bf2c 333 | svg/ios-heart-empty.svg,1551268014374,c58509119ef03be69db95266c61736eba4718a1c9127588ca598ffc9216e6421 334 | svg/ios-heart-half.svg,1551268014374,58219aa5a15edeff941a9e452a0c008977d39986fcfa3f4d4b6d7a941801ece6 335 | svg/ios-heart.svg,1551268014374,e50a4b6d709aef6f600a77188a5d5aaa79a36cbce795eccebb290ae128558292 336 | svg/ios-help-buoy.svg,1551268014374,e1ca13525d98e753015d397c62113ffea4d4051d436c83467acc459d90cecb83 337 | svg/ios-help-circle-outline.svg,1551268014374,998549d23f5b470cbaf1af109083209a7b6039a27100a9204d3d8d38df499c8b 338 | svg/ios-help-circle.svg,1551268014374,566b5a858c21ae188a45c1c3018a1512fddf5d5e44832aad1c9ea65583d2b701 339 | svg/ios-help.svg,1551268014374,7d7a44b910490a6232ec216db10e0d9a0d87115112fcf85c4e25bd2208e7bc84 340 | svg/ios-home.svg,1551268014375,5c17dda5af0dceafec6611b3813ff6e7110ed000c33889b9a6f25dcb5475270f 341 | svg/ios-hourglass.svg,1551268014374,796a4e7d02e1a5ee63885f96ce44a7245d72c68bccc819f51ab4e5349b40b3fc 342 | svg/ios-ice-cream.svg,1551268014374,2a827b9e8b93244d457d6a5da6f14c3a132a5e18d0af724463577b9c46013b65 343 | svg/ios-image.svg,1551268014374,5900c8e141b27fb9e1bff2b5b039b349c9f3d94e5363c555a68ecabbb1aebd9f 344 | svg/ios-images.svg,1551268014374,423c2d52c666df0bdb1b453961ded67265b4cd576f8eda332ab8ca328abf4f4c 345 | svg/ios-infinite.svg,1551268014375,debb1f68c5442cf1786d70497c28766001a35a11625d4526893b8a81118260ec 346 | svg/ios-information-circle-outline.svg,1551268014375,ab86d78adeb6f6812ea684ef5c024dfe73db5256200931e0218a2f72174a8303 347 | svg/ios-information-circle.svg,1551268014375,9ede143a2b9e90e834440a1f71431cb0904d9a997de795e0e9017d65fac1ddc7 348 | svg/ios-information.svg,1551268014375,bc0c1ffd42d9e1acf0ccf22eab0d90e012b953a919c52e0ee1ac350e634e0311 349 | svg/ios-jet.svg,1551268014375,15fd62c759da16706ef36badaf6282f947eb606a8a13d2fe79862cb94aac157a 350 | svg/ios-journal.svg,1551268014375,69a6cd3d9df072e450e8bd558e3d2f42400df9c4d871b48d12d237dd825245d9 351 | svg/ios-key.svg,1551268014375,d3b49fe9c43f67f14c1ae33775994d207f89d257bdc597e890538bdbb4426cf7 352 | svg/ios-keypad.svg,1551268014375,0d8c70c813b462abd03094309e94d29224c3346ed967ac732ae5aad755f27e8a 353 | svg/ios-laptop.svg,1551268014375,9870e8c4923772e60d9cd275b0b506000b03abd408d7221b07825974e6431a2b 354 | svg/ios-leaf.svg,1551268014376,cdd49eafe60f0fbb7269f511813b56d31ef7f300066af7787e40e9ca093b865c 355 | svg/ios-list-box.svg,1551268014376,dd731fbcdb13f1e65cdab1626643016d0723cca6efcaa7c6cc85d23144eb56dd 356 | svg/ios-link.svg,1551268014376,5aa63efb1bf6419c4add82a353108aa7e6ea3152b6e2fcbe10cdbf24b04ef579 357 | svg/ios-list.svg,1551268014376,1284672d86a7802bb46ea169a038b77854ed6b14d65b0baea056d4c41bae3077 358 | svg/ios-locate.svg,1551268014376,0cb35f5156a15fed2d06880bb3827d85cfead671a66fddc722b34a6641495fa1 359 | svg/ios-lock.svg,1551268014376,a447e27c14e180f9e6f64f79225cb7a72d3e84d86c656a7f6d2bf919cb4219be 360 | svg/ios-log-in.svg,1551268014376,6c25006505fac6c8e808213da30f9df38eb651b924faf96b56c8ad2988caebbb 361 | svg/ios-log-out.svg,1551268014376,6ddc50ab4814bbde2e64834cd1689d68364681c6e81d7d0bf02fd65b27881677 362 | svg/ios-magnet.svg,1551268014376,6dd2bfe55a6388384ddab473c9b12d2e849b4e5e2a9c8d3b90dc47d3c57c1e88 363 | svg/ios-mail-open.svg,1551268014376,e5bec084949c79f1104e7ba9e52ddc3cbb9a2242d956702805c33f8018720a45 364 | svg/ios-mail-unread.svg,1551268014377,6a0e543c335c28c34a36d7756cfd6ffbea3aa939dca2c32327ec25c7c45da098 365 | svg/ios-mail.svg,1551268014377,d04d7d694add7d06f31551d0ea939bec358378c0209f158cb9f0d2c258828182 366 | svg/ios-male.svg,1551268014377,72ac8f7fe41d922d0eba623d7891bc9345582cd3c8e911d514b028f0dd1b806c 367 | svg/ios-man.svg,1551268014377,60b809fee920a3091d48980cd92b04b4b67b299c6fb380f17881e50ce7a3d7be 368 | svg/ios-map.svg,1551268014377,eb6c474b34d94251b1a465d57d5385600c8cb26908aa8db7df8408369a84fe45 369 | svg/ios-medal.svg,1551268014377,4e7dd22a2c911ec9537f756a35dc8395bb570253f0dd83f3a6bdf15ba7fea810 370 | svg/ios-medical.svg,1551268014377,9044f740c9e45891d47318f8ff3dd82790b6a2a9323f8a2a44eb63f2c8a6408c 371 | svg/ios-medkit.svg,1551268014377,b2e8dae71786a5a4376cae44afdc6a8ba6a7906cf2146eaa5cb8f9b2e5d02405 372 | svg/ios-megaphone.svg,1551268014377,7c2129507dc0d720051ffe7d52f80c1beed0817294c43ff87c6372dd36f5c93c 373 | svg/ios-menu.svg,1551268014377,cd1222ea664aa2ce9b325f50985a222c4e518ccf300319c10575fdfce2479463 374 | svg/ios-mic-off.svg,1551268014377,8bafd70dc47aa13eb98fa881caa010d744ed9eb474248ad7602c7c3b68c39996 375 | svg/ios-mic.svg,1551268014377,cd0a4ae4bd58f48d43894988b887ed2baf6c8a0c2472a93e95e220954b989f7e 376 | svg/ios-microphone.svg,1551268014378,87b2e5bac4dcfbcbd948342dd7b371db3a20ada8a23397409d67fd59100dbca6 377 | svg/ios-moon.svg,1551268014378,a06dbf40ecf25face5517c6d6b2ba147fc19b5007d8bdba054eb06da01acbfa7 378 | svg/ios-more.svg,1551268014378,f18bf122ff1aa689c1a4bf51bd7e3d8893dbfe8fd3f2821a3435d7b3964a1df8 379 | svg/ios-move.svg,1551268014378,1cc9891ad18bb608b6f8fa2229c80957a31d3a3ba28315831667f1f4e45c594d 380 | svg/ios-musical-note.svg,1551268014378,8d77746074437e62150ed4be7c09a398c142fa1703ea961a6c7932d8ddeafd90 381 | svg/ios-musical-notes.svg,1551268014378,668ad8091763e182af75ab3cdb6e6f3744a404dc562a6e0566e67c050450f2ff 382 | svg/ios-navigate.svg,1551268014378,34875afc966061c09c349dfd57a9abe44a387ac0953dd4e36f7f4d2572ef73a3 383 | svg/ios-notifications-off.svg,1551268014378,567cef0fb823adfc8d0b68d5b5674b6253a4613d1d7fd87c01dd155c8e21dfdb 384 | svg/ios-notifications-outline.svg,1551268014378,c65ef0e0c8caf07af569dbfb3c3f0c8531afb6c7771863d1eef263fbce8766da 385 | svg/ios-notifications.svg,1551268014379,864d2c0dd51e2458c15db687c6a7393bb398d7ebd0b137f183e4aeb6b97e24d4 386 | svg/ios-nuclear.svg,1551268014378,f3336fb6da4901afb6f18327a7c7db9511baed42c9d9391a8525f4670c98756e 387 | svg/ios-nutrition.svg,1551268014379,9fa777a57253f220c706e433b1a98dc889592a800e8b560361051a637034241f 388 | svg/ios-open.svg,1551268014379,dfcd23d96c6d42ae3fb55b8d89be29ce885bbb79019ff29969d61b7a2d7d3e6a 389 | svg/ios-options.svg,1551268014379,1411a4ffbfc67669445a2a75824a4d548affeb6098b99bafe531a4ef02593434 390 | main.c78aa60154de0798a603.js,1551268014241,31e7633815fdaf9aa2b193da4050ed87b8c39d492bcd4aebe4ce6621ddb6ca43 391 | svg/ios-outlet.svg,1551268014379,1bd893feeadf6b31974efabb0675f0adb814ae50f8baa4a4ee6fef56aaafb9bf 392 | svg/ios-paper-plane.svg,1551268014379,a1f1e308b6d52d5b1374b95aef19dd27bf9c344f9bffe6a5edef50af3ddd1712 393 | svg/ios-paper.svg,1551268014379,7832c0a9f309adb6573d5b3120ac8564d004b9925d2629fd14f1bc66f30e1aa4 394 | svg/ios-partly-sunny.svg,1551268014379,29356225d38c7a3323dd37d1552aa100a179c0b7c8165270fe94d0bbae82b8e7 395 | svg/ios-pause.svg,1551268014379,709965a14e8e53d01c7662735ed145f9924bd57cd9eb1996e93ce1073362d632 396 | svg/ios-paw.svg,1551268014379,e30be7294a56da1c7728e659ada1e29db33ffd64152f4d7590349714b05c4e57 397 | svg/ios-people.svg,1551268014380,bddae8935052212d85183c197691da264de7f187df00931a07c7eceafa9411c0 398 | svg/ios-person-add.svg,1551268014379,8f610bbc8fe5bf5c2662b787258c1075f385c8178ddf21cb6f2de11499fa7d23 399 | svg/ios-person.svg,1551268014380,9d216c919aa610d856c304d154df0bdf2afeb9dea5e405db427ce1c9e65fbe7a 400 | svg/ios-phone-landscape.svg,1551268014380,fc31a2ec731c58b2f57ceb1410925f85dddf81c8e39d2f748bd902d6c6c496d0 401 | svg/ios-phone-portrait.svg,1551268014380,c1c1241aec4fc30e582d83c3db30d8d72daa6470ababae175753d794ec8bcb54 402 | svg/ios-photos.svg,1551268014380,72c05f3297caaeaf20cfb1a3a301a1585a1fe49cca9df6bef0edb2b9c56acb14 403 | svg/ios-pie.svg,1551268014380,3f2606069642dec6e7cd19224b0561895ca3795984973cf667880beed610380c 404 | svg/ios-pin.svg,1551268014380,b318d75efede37bb7d7255497600f0e1499fbb08f8123ee04a1cad1c25330009 405 | svg/ios-pint.svg,1551268014380,dc9b511f30aea99cf507506a7fee8d445241ad1fdcf80b5d2f529947ea00ac94 406 | svg/ios-pizza.svg,1551268014380,41786a70ba6b32b7ca053db8549feea7347a6155c55667de83510bcd2a93663f 407 | svg/ios-planet.svg,1551268014380,503e4d76127d475d10e1ec5a8c18911ecf66c58c2587712d2a598da3c673cea4 408 | svg/ios-play-circle.svg,1551268014380,bf719d4bc56562b257721b35e03118266dce3cb8fd1d44f5f68124a0c777d520 409 | svg/ios-play.svg,1551268014381,2871a915071152706af1e455dcd1b076ff4236860a34c5d167fe99306f971736 410 | svg/ios-podium.svg,1551268014381,ee31c48b1c042a42aa3057c63604c20f0aad35843a23d2064a22babe8f446a3a 411 | svg/ios-power.svg,1551268014381,26701c7fb395c63f1e40e18d61d64b66604403f71f9ef944d934887e4268be3e 412 | svg/ios-pricetag.svg,1551268014381,86983ff68e49ef9d241c6a445227625923fb912326584792e1f23c614ae515a6 413 | svg/ios-pricetags.svg,1551268014381,94e9e07781249464c1da4a4a5ceaf94dad8784b070245bef051b8f625ea2c7a7 414 | svg/ios-print.svg,1551268014381,510097e339ee1934a8e2dd2559ddd58cad501db080c2d799fe442a83ccb6e054 415 | svg/ios-pulse.svg,1551268014381,8f5b471d7b525979ff6d4ec330bacd9c3444b64f27b81fa1c8cf55c117884fde 416 | svg/ios-qr-scanner.svg,1551268014381,b3e1df339a446a7cc26eda2564cb3c5445d82b807a1e9e354d7f097d802ec56e 417 | svg/ios-quote.svg,1551268014381,6dab90407105ee7de9d983a2f2356282cc846961a93d5be4b650de440847c954 418 | svg/ios-radio-button-off.svg,1551268014382,44cafda8f47eb5104070336a1d5eb6c83b2b43c33364a61e6c00e7ff8a38574b 419 | svg/ios-radio-button-on.svg,1551268014382,f7f0de083018dcfa57cea6f8e7d138321b0c9b34a1ed1a1e8ba05b4a39bd721d 420 | svg/ios-radio.svg,1551268014382,e42617a00930e909a180a9f8ea33b42ef7b3f6e0577dc12e75e29392375376b0 421 | svg/ios-rainy.svg,1551268014382,e915ced9c79300b9b423eba3d71909480af082c84f69f3d3fa38cfd6687cc2df 422 | svg/ios-recording.svg,1551268014382,d6571a9065080e30096b951e2f348eabf73e8b39db88de92b2f271e75fdd1049 423 | svg/ios-redo.svg,1551268014382,cdec27fec27c2d65a408a1ed7ffa1e436b08fbd59ad67b20870ab7e9e153c08d 424 | svg/ios-refresh-circle.svg,1551268014382,df28dbe98a3ac2cd3756dd13db8c867cae9d97d3fbc03897a1ff403b6ad7e4e5 425 | svg/ios-refresh.svg,1551268014382,ea874e96424b0b1c1807c54221495d68a55bb3ed1597840a17b0697f2f0544d6 426 | svg/ios-remove-circle-outline.svg,1551268014382,a08f3535818590f7b7f50216b0b28a53ddea720820070a631c411b8fb49fe4e4 427 | svg/ios-remove-circle.svg,1551268014382,11facfa498510934957ea554bf8a6e8921ebd56afd1aa04e56e3b4056434e2e3 428 | svg/ios-remove.svg,1551268014382,602f5c48f0186c4aa7455308d99df651899a9036e1ddfa87126f22d7c2abd916 429 | svg/ios-reorder.svg,1551268014382,98ae935b91f798eacf7de0045ee0462d01258a498b56a4972fdf59de7229e831 430 | svg/ios-repeat.svg,1551268014383,25cd0fed8aac381ac50beb83d908ea555659c0ec8884a5a23c6b55079e791aed 431 | svg/ios-resize.svg,1551268014383,94955384676f29c3df8336073c31f6708586a7f052c4bed90e95b85997b1e782 432 | svg/ios-restaurant.svg,1551268014383,6055e3722bcdf2febed768aba8a3dcb98d99414685717b820815c1480878326f 433 | svg/ios-return-left.svg,1551268014383,cfa0be54244015f4f0b0b6c357e14e021f2daf249e975c29afaeaa240f62b3e0 434 | svg/ios-return-right.svg,1551268014383,2d03f9526c91997ac6c02eee333e94d6835ffa8e42cbf58dec75af20d823d17f 435 | svg/ios-reverse-camera.svg,1551268014383,f3473ab447f804ee46e6445b0400d2f7f2023f83e242541123fb726aa520751e 436 | svg/ios-rewind.svg,1551268014383,3c0ec9c26c72808fffa78c27cd56c6fe267fba72e91f033f9d1f3e9ab41f6c3c 437 | svg/ios-ribbon.svg,1551268014384,cc5875323e1280690902badb909198931569ad0e49df39553b5693ee7c63e6e1 438 | svg/ios-rocket.svg,1551268014385,04528b5dbe54e8638874c1c36e8bab54ea0bcf2e5e36fa7984d79619d0b11e54 439 | svg/ios-rose.svg,1551268014384,5f99963d3dcfdc84e19ef72865bb30c37e6643d6fad3264561a9015a52c4539c 440 | svg/ios-sad.svg,1551268014385,749347ffaa64b2ff41b17d4386c5648f3001bf0cdf8c56db10dee3215c493bbc 441 | svg/ios-save.svg,1551268014385,efab501d95dcebbf2d474da75400f1c04a23bec58210b2278dc45db7aecebf36 442 | svg/ios-school.svg,1551268014385,9e62c8577d63184786792f0542978e3eb71c47ef27c6f22f87d9a32c45bcaefe 443 | svg/ios-search.svg,1551268014385,0b4d541c861c340a7a93ab55d5f1fc45fa610d0a5e9838c4da0ac74af935f44f 444 | svg/ios-send.svg,1551268014385,1dbe1eb67b638fac9663504cae3623a2ce9522724d0d03d65b11bef97fd3c823 445 | svg/ios-settings.svg,1551268014385,fb269574be45c1995e47ab4aeedc76d3268253e341d400801083b669be92786b 446 | svg/ios-share-alt.svg,1551268014385,a2faf7abf0e8b0431ad57ce3428f8c64d7382e75c6e1f177384c56a61d77a459 447 | svg/ios-share.svg,1551268014385,ed14aa42c7d4676a4cf6b229c72841602a7c6bc538913d5118db6ac8f7d1669d 448 | svg/ios-shirt.svg,1551268014385,7a0d56a6d1cda06f11c64c7431b32e2112f07e24ce5202392e649dd3c4bc01ff 449 | svg/ios-shuffle.svg,1551268014386,258402be440a49ac6decd9e38fa278c31d50cb7f3ea2aee769f5fc2e10e4bd8d 450 | svg/ios-skip-backward.svg,1551268014386,1f4426e956ea755ca6d60b03b8d4dbb6354dd58a117febef495730982b3cdc4f 451 | svg/ios-skip-forward.svg,1551268014386,ef244235a2d7e4b139ad0f3d77464f7682d709ae29981a7c2fdb8fe7a39e9c13 452 | svg/ios-snow.svg,1551268014386,6f3528318887a1eec993ec9fe778d52c7d7acab35247f5c6e69843713abe3810 453 | svg/ios-speedometer.svg,1551268014386,75127ebda0fc42b18ba8b611dd950e56387ee42b38aef464b9cd8c6dace7277c 454 | svg/ios-square-outline.svg,1551268014386,f55e1c7388923f2b9598d9a99ab48deb2e7bb4addcc3243ea824b2a5c15bd3f1 455 | svg/ios-square.svg,1551268014386,c925bfd71a20c3c90cdcc2f2d40c9fa71333f241e2b08c4d8f8b8cb24cd824db 456 | svg/ios-star-half.svg,1551268014386,fd4b6f0fb8b3cab3125acf9463ce67301560a2d8472c3014324af5147d8ea991 457 | svg/ios-star-outline.svg,1551268014386,bd2aa6327f680a721be993b4afb1d3a706e3e49dac6c6fe5dc24abbf881ec3fa 458 | svg/ios-star.svg,1551268014386,3a00fd8877381a09fffbc0414f334fbab3d85e4d1c7eb2101bd1e826e0d6c418 459 | svg/ios-stats.svg,1551268014386,8be057c322316efd9643607454549efa3d15f7fc9e498b4e7d7fecbf07fa33e1 460 | svg/ios-stopwatch.svg,1551268014386,6b756b83bc8867ad93c625d2e69feec39b53829a22e972afc383f605848b5f28 461 | svg/ios-subway.svg,1551268014386,ca98dc64f525651e5de90d272b45c34e84fec53489add9781aede217c0d23265 462 | svg/ios-sunny.svg,1551268014387,3293274254e68ce05ead50720ce22f43fd69ce49926063e96984ca2f4d00a5ef 463 | svg/ios-swap.svg,1551268014387,13c35c1cc48f7b259eab19b62ff558944dd335f8be972e9672c4874faeb3e3b1 464 | svg/ios-switch.svg,1551268014387,8c389ebe4ab27da75401f00acf1c4deb803c181ba7996b1ab446090be2d17f61 465 | svg/ios-sync.svg,1551268014387,c4c1faf36d6c6ab2f30d883aa5de79789a8e0c39e83c5e8795fe897b3312053b 466 | svg/ios-tablet-landscape.svg,1551268014387,5e67df8b7a41a78bbdd09a6e07d554ac7ba33c0034a1c7090169e3fda23648de 467 | svg/ios-tablet-portrait.svg,1551268014387,9d6a002e027db2f8172fc32644c2da628eeeefd2e25fac08d29e178b1906ccc1 468 | svg/ios-tennisball.svg,1551268014387,40a2d542c82c94e26fda65d5d1817995cc1eac00134a815d642658581dadec63 469 | svg/ios-text.svg,1551268014387,9073eab26a6d0db3eb43f0ecb7d247162a045df97887ef409016513f27aa0240 470 | svg/ios-thermometer.svg,1551268014387,a47733d59f3d4ee161bd8527e077ed6b82ed00c5005b4fbdf62d840b43851970 471 | svg/ios-thumbs-down.svg,1551268014387,e4564f56091813ccdfa69dee949d7e07ed9e9a2910fb71ea9e9acc96409782bb 472 | svg/ios-thumbs-up.svg,1551268014388,a48ee91e8ddc8072d804fad10f86ab621ca4afe2ef2275746c83f65e6a2fecbb 473 | svg/ios-thunderstorm.svg,1551268014388,6ce6a4d3a89c8c750659be1d22dc83400bcc1229b2b5c96a372fd4c4cfd18323 474 | svg/ios-time.svg,1551268014388,60a1f1da5843f3f97443634afa3fc0b5be549f61f8dfa0cc0eb5b2f7a0f74eaa 475 | svg/ios-timer.svg,1551268014388,e233cfad35379e4fc525601abc7b52081cb873dd3ef632bbf7eb0148e6ec6555 476 | svg/ios-today.svg,1551268014388,79b33ecafcca3ed239e24afa93a8a323556335b72e593a9d1ce2084872024857 477 | svg/ios-train.svg,1551268014388,d4540f95699431bab985100a3cfa139238aed792a2261ed5619282d6d5707f9b 478 | svg/ios-transgender.svg,1551268014388,836de4e75ee58e184a87855f2b66ed8503a6489eb7e6de27fe5663a0bde6d85d 479 | svg/ios-trash.svg,1551268014388,f13ab3aa4b547702bd56ac8fe93cac5b757fddd7ea96229125f0bcfdcfe2cffb 480 | svg/ios-trending-down.svg,1551268014388,a0c53e7b67e19dd90b3762bbc0e6da2d0d61286c928ee9d55d5a47a09df4962c 481 | svg/ios-trending-up.svg,1551268014388,9e70e1815d8c41058d46ce51437ccb0b0b2f5262a7a7d3b3ee43f73c7e331c25 482 | svg/ios-trophy.svg,1551268014389,9b8b494ad5ec25f2d66468891893af4cf9a955a025a9e780b6be13a00e2baeb6 483 | svg/ios-tv.svg,1551268014388,99b352254d179fdd7a175ad5cea719546c5a09336c973323f2906122f390df1c 484 | svg/ios-umbrella.svg,1551268014389,df27f00b464ca29fc7786a0667c251c10a055dcc0b725c6e336e9b3f9c655a52 485 | svg/ios-undo.svg,1551268014389,1089b68c45b594fe726813b317a1e1c823c487d376c05c965f3fe3b621cd2aca 486 | svg/ios-unlock.svg,1551268014389,7c148ba10d85d1192e7bbbba8a851661309b6da325ac0fc15e7f4bfa81305758 487 | svg/ios-videocam.svg,1551268014389,8ba5e04d358d4851eed4d6f91e3909a8230e6291ac1313bf6c0217099ebdc26f 488 | svg/ios-volume-high.svg,1551268014389,b09040b19870557aa14a6104d1ea45e91ec2cc2e405728cca695db96294733d3 489 | svg/ios-volume-low.svg,1551268014389,9221c1371b31d824598b780e58c28491d522955dbc60fff6f6dba77750fd204c 490 | svg/ios-volume-mute.svg,1551268014389,07c7762f26cd44f1ea024d934738456a50fb1f5982e35b5e3095731e407d2896 491 | svg/ios-volume-off.svg,1551268014389,eb0548fb4860ccc226620181c7fde7cec28d5853c4eaf7487b12aedddd410888 492 | svg/ios-walk.svg,1551268014390,1f864f83d242eaaf54f99565b9d53cf477a8d4e0ce7a8fac9b7299d7b826d4c0 493 | svg/ios-wallet.svg,1551268014390,00fc1e6320990f267d552956ecc9b0fd9805554f656790cf53bdd840c88c3d2e 494 | svg/ios-warning.svg,1551268014390,cf138aebea80d97ad8076de428ef02d14ad06aa7d3d8d4c386e1dd75ad9c9368 495 | svg/ios-watch.svg,1551268014390,cb3c7e932634f6affb0f745d9e3a863c34af3c4a996798b6a6d78d4125d575d0 496 | svg/ios-water.svg,1551268014390,e8ac219c7f5812f77f6e63cf5ff21a3832324a7d597ab6b56021118809f43448 497 | svg/ios-wifi.svg,1551268014390,0922f2ce10e25f660ad981fb5da4165839f923b7c36b71568de151f9e434a076 498 | svg/ios-wine.svg,1551268014390,547c2b9c55a6b4b50706b100ebb3ba7d2bfa646c49b801051df9e3f547bdea56 499 | svg/ios-woman.svg,1551268014390,34da97f4e023a92b2d438fbc54f1cb272e82fb130a7e36488724dad1483565a9 500 | svg/logo-android.svg,1551268014390,62346d07bd276524e6441ee06d5d04cc68e1ac12b9a59ff9889f46262290c515 501 | svg/logo-angular.svg,1551268014390,96cafc1f1dbbd1f019d2c3f1ccceee2a8258e1d6ad048c4d5a059a9e743ee2e6 502 | svg/logo-apple.svg,1551268014391,c5b39dc2d461662f2aa12e49a76bf9ead4badf5221be1409545fa3b72734d856 503 | svg/logo-bitbucket.svg,1551268014391,1687546d23c7a86709536944e6943170b9c5461a1e5251c6cb03a4a9c662d2f7 504 | svg/logo-bitcoin.svg,1551268014391,8d04963b4d191caf34cbee941024227aa2ec604ab0ba49a1b12f9bb752c9d426 505 | svg/logo-buffer.svg,1551268014391,8e3251c5051ec52ddb336d326f8f428a6c80584e4248bce4581596f177342969 506 | svg/logo-chrome.svg,1551268014391,02bed978e3cc70e8d8f27510b15213aec9c25dd2a3d750f84e1a22e87b894f18 507 | svg/logo-closed-captioning.svg,1551268014391,0aafef9ad43ded2eae46155dc2ba158382d24fdfa8244d8903b514cc85611388 508 | svg/logo-codepen.svg,1551268014391,503640a45f1cc37834796ea53b66e14cfce9e2cf60df2312485258bad0e3f35f 509 | svg/logo-css3.svg,1551268014391,8312d290fd1a774a3f97aaa3dceacdd2da00f342174899b5b058f308d9c8b518 510 | svg/logo-designernews.svg,1551268014391,f84e9a0bf4f39ddfd4d9baeb84d23faa953d91216df55a0b120c58365fd62b1f 511 | svg/logo-dribbble.svg,1551268014391,fb5d9e2191811085371234f9188f0bc0c15ab70b4e9bee587c2f622d62b8472b 512 | svg/logo-dropbox.svg,1551268014391,6482d1db49be600dc263a011dd40ad49b83d2cf8882491a6946fa6c8313a3e27 513 | svg/logo-euro.svg,1551268014392,db572c17f57797de0903427aaca32dcccdcf811a1c2a345c9dec00b954cffea1 514 | svg/logo-facebook.svg,1551268014392,9243132b3304fcf978a0ce6e1dea7f3d9fbfc0f449f824822124735a6ce20271 515 | svg/logo-flickr.svg,1551268014392,d1b22bd0c2390d270ddc6ab818b0c92a3e7d5b45b2a11fc6f2a7acac3bd5ee9a 516 | svg/logo-foursquare.svg,1551268014392,d81950922b3e800437617b2124fc896a2f896bedba1bc1a1ca5c558bebb76681 517 | svg/logo-freebsd-devil.svg,1551268014392,fe74c08b9f194bad2b15436d4123e7837013b25d36af6ed37c9bd269cd9a5ddf 518 | svg/logo-game-controller-a.svg,1551268014392,458737ae6bc88b7141d79d7228bb9faabb8e8dec16534e31a89f08dd04a2f675 519 | svg/logo-game-controller-b.svg,1551268014392,a740ff32f5a884801db0914f1c532c3a124d43b3f9bea5df17d0e6597e9d0ded 520 | svg/logo-github.svg,1551268014392,18b1027c61320f9e6316641ff5172f8d5165f7d556c48addccdfb732ede735d1 521 | svg/logo-google.svg,1551268014392,c0975a22f9dca041900b664a1f8bd92cf4769495e88e91ea01284350e1e23d4f 522 | svg/logo-googleplus.svg,1551268014392,aa74def3b91a628a434a3f2ca95f40a4cb2c4c0147f67b7cb062aad52127188a 523 | svg/logo-hackernews.svg,1551268014392,9cf561926a225b162cee362fbe838357c7c350deafb15a48404d557339008b16 524 | svg/logo-html5.svg,1551268014392,99f654eeff26a5c5fef78bb792d76f4e09f39bc24d1eafa46e4a19672d6331b0 525 | svg/logo-instagram.svg,1551268014392,21705de0696097a97697d7c9db517cd6c1c8e73e083a2d9d23dbc0b076e0e160 526 | svg/logo-ionic.svg,1551268014393,29418d0ca6f9dd504fdde36eac19dec61ee1589bc771baad4d56e89c9f20bca1 527 | svg/logo-ionitron.svg,1551268014393,54bb14b344100827248733e2685a25b3100162e33ade68d78092ed88cd9ba521 528 | svg/logo-javascript.svg,1551268014393,9696c4f0db88a42a4244f797db19cbfbc9493bb52883e535e7019d941eefcd5f 529 | svg/logo-linkedin.svg,1551268014393,8348b77f896a6a04f25aa5a59aab8f0b46cfbed0a4793e45c314055e3b488365 530 | svg/logo-markdown.svg,1551268014393,d3b10ff8b5085c5b534bb955715031547405102ffae6fa1b10faa7bcf8ddd6db 531 | svg/logo-model-s.svg,1551268014393,75992d1e400054603630d4909b6e41bc6de514edaa8c920d39daf896bc1c4a1f 532 | svg/logo-no-smoking.svg,1551268014393,62af55079ecccd42081d6a7f2749dd3804a118a204fcdb5651f0d67c03e2820d 533 | svg/logo-nodejs.svg,1551268014393,29cde0f981ac5c12036d37222d771fc1b97967a40d23f795b06757a78ed4e261 534 | svg/logo-npm.svg,1551268014393,b4b1ae91d5a19c7165b74afc8fe2a276cfdaeb05bf961ad610855f6d2380ea40 535 | svg/logo-octocat.svg,1551268014394,209ed01facb978339f399184af0b49be7bc8293eae5adbc03404cc195d1be985 536 | svg/logo-pinterest.svg,1551268014394,487cb3cc5f44d0350c4dee8f3748efad4a4d6c4fcff868b7ff121e92bb626516 537 | svg/logo-playstation.svg,1551268014394,04ddbd09c56f5e8308f48a25309b1281cb9acec93fdc033f98e8e0edc6371b7c 538 | svg/logo-polymer.svg,1551268014394,3397b57c967867dbcab70e1478b952bb4a715fd1f74df3c347941598066cf37f 539 | svg/logo-python.svg,1551268014394,c5f034d5dfb5ee657f88345eb31b779fa2e5a2a7b6a1f60a8b4979c6671580b6 540 | svg/logo-reddit.svg,1551268014394,af8a93019e1942468e845cd14000d7812f7ee39de9b39af9fdcac2ccdfe243f9 541 | svg/logo-rss.svg,1551268014394,0bf1d3dde243cab3ee46e3cec4ff1286bcb3ee0f0cd50014986ba936224bb432 542 | svg/logo-sass.svg,1551268014394,a7d430578f456a05c2d3ff0252cc411fe66c564cccf692a32665c5251da37e31 543 | svg/logo-skype.svg,1551268014394,578f882959a2c069ebe0e50d77dee7f4bdad5c9002e58564d9ed0014e1559650 544 | svg/logo-slack.svg,1551268014394,01da6a1caae396c079cf211e618a2a4b4e53b9cef78db9f46cbf58db0097ea92 545 | svg/logo-snapchat.svg,1551268014394,6ee21d2c3f35f8e4b6aa7c698a6e4255eeb4b5217f7d945e1eada831cc62b976 546 | svg/logo-steam.svg,1551268014394,6f5715f21651cd5cffe611af7e4be8b2c6a07fa10291240cc59ccbff836ed53b 547 | svg/logo-tumblr.svg,1551268014395,6842b6d00ca33234b865747fa0d138d660df19b8f9d7fa306f85dd1bea5f22ea 548 | svg/logo-twitch.svg,1551268014395,961fb90572e9f2d33b51bce8b5fe1a0a528c2a9bbb59ada0f1bfe68364a405e2 549 | svg/logo-tux.svg,1551268014395,f333f6110f575f5e9cf0799ebea0a4ab721377a1ea7c992428346cae39cd88d8 550 | svg/logo-twitter.svg,1551268014395,499662754f409df3d24a3a2dec5b3e51887aee637771883266e130f3d8ed2ae4 551 | svg/logo-usd.svg,1551268014395,8cfea4c4e48b4db665e9dfb46f8df2f45aa795ed290f4d5dab9bd2bfd90d1554 552 | svg/logo-vimeo.svg,1551268014395,6f5a8f6d471dbcac922a38414a5d0519d0bf9f8b5898ff788fee49a6ec073034 553 | svg/logo-vk.svg,1551268014395,64a0a159bb1a76c6a4763630adfbe4371e3fa8c89b6448b8026649ede8bf4cad 554 | svg/logo-whatsapp.svg,1551268014395,91045bbd231791fab89fdb40377a3b24553b9b5d7c6a4e7082d64b4146c0a584 555 | svg/logo-windows.svg,1551268014395,c1684c91e9ee8a4868828b15521f785a6ad594421c90c60c7fbd0b35117e1f63 556 | svg/logo-wordpress.svg,1551268014395,5e93d50743f0ef1c0d07118a4ce274bd8f703d00a75c41466592236501ffffe5 557 | svg/logo-xbox.svg,1551268014395,453d508ff269d9721c2073103fe4fbed578b0173132972e5629b73ee03950295 558 | svg/logo-xing.svg,1551268014396,d93e99294b40c101659f65c87366b854b4587b0d589344af2f311bc9cacc2aae 559 | svg/logo-yahoo.svg,1551268014396,711e6d2c780f7a92d634d7d9116f67f9923e93c14fcc983779e3c70e1fa52f4a 560 | svg/logo-yen.svg,1551268014396,01882e6f31df21758a14d16771ff3e97c572351d630bdc07d978f61767a78347 561 | svg/logo-youtube.svg,1551268014397,d5aabf058aa5b0721789731fed1c8f5f0a5c048d815875f4af364fe8c5e8507d 562 | svg/md-add-circle-outline.svg,1551268014396,07bba22786c63f8331a15f9e544bf94de66b0bb4a1be625a896b604db7012436 563 | svg/md-add-circle.svg,1551268014396,f80b4b1bb3e2a472874716a383831f418ee5f6c697d447365b80addfc74e8c0c 564 | svg/md-add.svg,1551268014396,b6d88d169ab006bd0bf01a662c368ff02e5ba2336d241cd1755cc9557ee841cc 565 | svg/md-airplane.svg,1551268014396,6d95ac8a55ff2d3c8d935e1484ad82a651141a8a24cc05dbf21f2b3009adbd7a 566 | svg/md-alarm.svg,1551268014396,2fb45c5e36e6138d0268e634bb8e3377b740629f67e81915dc44412bf602b39a 567 | svg/md-albums.svg,1551268014396,82b7141ead901e0c20b4f0ce3f4d03dbce88bd72eefdd932555390130b7e4dd1 568 | svg/md-alert.svg,1551268014397,ad58e61f70359003ab7c1ded8b967a99fff8ca53a4699b8b602ded9c0c01716a 569 | svg/md-american-football.svg,1551268014397,beffc31649ffee2fc0d0389fedbe11e448f49277c805cb3f4e6f0e00e10442ef 570 | svg/md-analytics.svg,1551268014397,d7f722a7b262d1a7f5202fa66fa1683e0cebf9d5aae3ce912690d0b9bd2e6a0d 571 | svg/md-aperture.svg,1551268014397,e6c8c6226c99b766dc3beae3839e3ae28fbc2720ac2d67df51cce14322d362c9 572 | svg/md-apps.svg,1551268014397,f3be3aa3a43e4dd1f02465db872f393c422d68fa15f59494985bd52f66c20006 573 | svg/md-appstore.svg,1551268014397,bea564fe899efd15f751d54e9752c3b9e8dbfed84442e1af7fb8a41c80915627 574 | svg/md-archive.svg,1551268014397,8c100ecfd0687117abd57b0d0eefd34058984240c124acf587a2a36a79ffb802 575 | svg/md-arrow-back.svg,1551268014397,8d8a02b3d051e8cbf4699b0f6f370648aff8655a93adba8c17d34fb76adc761c 576 | svg/md-arrow-down.svg,1551268014397,e9baca4f9b7fc676ff546d1dad71e63245408ef8c433cfae7370338fde67e841 577 | svg/md-arrow-dropdown-circle.svg,1551268014397,8e60e374f086db673848d8042718ed0dfb6ec83f262e5f853938e2b4ea96fe62 578 | svg/md-arrow-dropdown.svg,1551268014397,417ee90f6f0534624b18f4c7a2cac26a4521b305d139f4d53c77d3956ee087b4 579 | svg/md-arrow-dropleft-circle.svg,1551268014397,289a7f56f5888d1ebd32377cfd4cb45f522d828ff4a3b678e3dfcea79ce6209f 580 | svg/md-arrow-dropleft.svg,1551268014397,74fa1caa39a379880549b8bd35e6e19978139465fbafc13c642d2c842bb60102 581 | svg/md-arrow-dropright-circle.svg,1551268014398,9ec5b5ae838d7e8d2e3fe3f3e9bccc798d0598f5dec89793e6fcfc3bb685d8f9 582 | svg/md-arrow-dropright.svg,1551268014398,648e1a2b2859e40550823cf6b30ca7847cdb5fcceb4668fe11e24ca0e1791406 583 | svg/md-arrow-dropup-circle.svg,1551268014398,d6a18f67fbb62eacdb8e2b47c2bcff7dd77ca913d4954fc70912424876033bb6 584 | svg/md-arrow-dropup.svg,1551268014398,4303fa50cb289a870905f37574ae4be631e156da3535b7d6d23b21c8bfad1bd7 585 | svg/md-arrow-forward.svg,1551268014398,3c9132004b4d48c9ceae0012eae3e9b22ccaaed398e69c1116abcb8723e53f9b 586 | svg/md-arrow-round-back.svg,1551268014398,c37fce6fb6e8de13ea22762c72369f15e06b8bae99a3782ded80696fd35fc66e 587 | svg/md-arrow-round-down.svg,1551268014398,caefc3cc82b05a265333f9d4da4a977fc5940a633cad394f4ef41954592623d4 588 | svg/md-arrow-round-forward.svg,1551268014398,2855b629b5f2f9d2c3e4da700efb4467e6fb7c545d84b8122e27b9d6d5c21ff9 589 | svg/md-arrow-round-up.svg,1551268014399,62b7b34c9d7384debde1c4584564c2d8b212c91d62121703dc30be08ebf8ffd9 590 | svg/md-arrow-up.svg,1551268014398,12e9149ea346c98d313eb1899915581d8943aa7e5e899955475efa2cc6542826 591 | svg/md-at.svg,1551268014398,ca7ada4733c14158d6a7eef488574427d933c6aca4faee94097d8a9ef0717118 592 | svg/md-attach.svg,1551268014399,c1a25e731f7c42925ba0a805513a219ee5846fca5d8552683fc9611b0d7fd600 593 | svg/md-backspace.svg,1551268014399,2453af73ca1c43a72852e7ef0606dc2051d857a9ea46f84a97119a18f693f6db 594 | svg/md-barcode.svg,1551268014399,9fd1cd9d331f977bdb8277b732873b03a3421f28ffa19a8845c3d50396ab06c9 595 | svg/md-basket.svg,1551268014399,35b837b6e68ffcd765bceb4ec65cf91f30c47ed0f317161ac8f813b6292671ee 596 | svg/md-baseball.svg,1551268014399,2d8e65a232199f039087107f595252162b759ecc3ee3460362d3bd667fbd4275 597 | svg/md-basketball.svg,1551268014399,7b2ae745c88ead60c893cebf34ba8159a1c99813e06f40fa8cdebe103e196e65 598 | svg/md-battery-charging.svg,1551268014400,fb20bcaa994d422f51311c80ed7423fffeec0767f90401994a73d1afba1fa372 599 | svg/md-battery-dead.svg,1551268014399,e97a2ff7772dcd9790aeafeee6cac7dd239b44953f689c4afa3391e7ab0a419c 600 | svg/md-battery-full.svg,1551268014399,b80a0fc08ab33d4b4d375c7454ca42dd8450c6fb60aa3309e84a9fc7a033b16c 601 | svg/md-beaker.svg,1551268014400,854f5738b72877a5f89dd3048de564e2429505e375db790a5730c16decc359fb 602 | svg/md-bed.svg,1551268014399,4e8b19b19d3ed86030e022477000dd8c4b348b3875ebb094d934c7efdfb2ea9c 603 | svg/md-beer.svg,1551268014400,8d7b34d97f81b8870cb9c0f55d6a29c792c47563453fd64d913f953a13fc1dc0 604 | svg/md-bicycle.svg,1551268014400,377b63d174d6961d7306319aa894e059684ddf9f349b4acd493d70011381b8ee 605 | svg/md-bluetooth.svg,1551268014400,13d3633dbc0ff066ef6a77aa34fb1f29afee06ed7bacfb7f6bed5b43d28204e8 606 | svg/md-boat.svg,1551268014400,cc9d09c3ddd5811de9699b6afd0f1923189b990071c34b1090a575d3669f7866 607 | svg/md-body.svg,1551268014400,b316ae5745dff670a2a13a2e65a730d5ea0c68c27431c1d5d11464e8ad856105 608 | svg/md-bonfire.svg,1551268014400,ac29985f599f529a23499057f74047445eac08eb4c1b018cde25e3b1958d7a52 609 | svg/md-book.svg,1551268014400,b045c674b3ad2e66832a1bcebe406cf3fa7bc6945d0f669c0a27986469e965c2 610 | svg/md-bookmark.svg,1551268014400,fe363970b30cccbca19c74eef49114d2b68ba2206415604b609f822ecbc3bd58 611 | svg/md-bookmarks.svg,1551268014400,c1d2734b45c637e125ada2a38776041a20eae31c11284a9e9b272caea393b8c8 612 | svg/md-bowtie.svg,1551268014401,afb5ba9fc2a9e4fdc0933cd3381766a8e0f9cc680ef92db7fbe01cbe75ea459d 613 | svg/md-briefcase.svg,1551268014400,3afe8c7fdc8346b596a1f37fff1f40e953a938d8d3fe19ef4d50d8c42520ccd4 614 | svg/md-browsers.svg,1551268014401,6a4e928ee0b815adc1fa4e96eb60729cccb631826e4400358a1ebd3975fc74f6 615 | svg/md-brush.svg,1551268014401,e9fdb28fbcfd2abd1e7f09c1cba4457f29c188e73d707650e8216760a7fd6b1e 616 | svg/md-bug.svg,1551268014401,c18733408edf69d8338dbce156f6cf65f0a0cbb6b63599cb6871f290ac5a83f9 617 | svg/md-build.svg,1551268014401,43b3ce8d9f55d110a2105ef1df0e053e5773da3d262237b8c3b34b9b78987492 618 | svg/md-bulb.svg,1551268014401,bb57db7e48d827131a287196927f6b01e045334e4bb9f95fc22092f74230ffde 619 | svg/md-bus.svg,1551268014401,e5f55023e68885b72217a5ef7da4b20178a460e86a11680f6b1c87cd0be2cdf5 620 | svg/md-business.svg,1551268014401,4134417c01cd4f591fe4cbf3b76e8cb87f8b91d6fc4465dfe8aff650ff1a8fd9 621 | svg/md-cafe.svg,1551268014401,2be1c0c43e2dffd78ae470b899b38436b844a59f18d2fd162a87a39a69d56da8 622 | svg/md-calculator.svg,1551268014402,b0e582c3d3d8859246ee7f714fe4c3e9e2965aaf841fa191f58d005aee27921d 623 | svg/md-calendar.svg,1551268014402,b863640f04f5ca03b80efe77301ee8550cd8fb0468abddea5e1b68efea7d3685 624 | svg/md-call.svg,1551268014402,09965a2367da8e00c5f7675d2e8154cf8a45af6dca6c9556f456ddde6aebb6a6 625 | svg/md-camera.svg,1551268014402,649eb5393f4a33be4c6d4f7ef2491c8b7294e65c49ed41afed0788fbf3e8fd04 626 | svg/md-car.svg,1551268014402,017f226fc1619b83b03bda9e7fffef5c25eae32e7ce4599170a10ab97703c5f0 627 | svg/md-card.svg,1551268014402,092c676775b02ee4b73059780e38be37b404a4e8e3a3c2dae5fcdccf49732e9f 628 | svg/md-cart.svg,1551268014402,528960a2bae064548a069885f63f8b1432c686320e09953b07fb3112fa094947 629 | svg/md-cash.svg,1551268014402,ed46038e0de0a679f08d0c9ab70e29d47ad1e1c8b813ef81a5fd4956996af327 630 | svg/md-cellular.svg,1551268014402,4a2141130b4df92e5dc88a12b9478df51eabb5a252f7dc7ef43feb0a3b84de46 631 | svg/md-chatboxes.svg,1551268014402,09009dfe3003b74613f65fca24afc9a8b2302743eb98d1f823d674c95659883e 632 | svg/md-chatbubbles.svg,1551268014402,6233bcb8f679b520422e195d1fc01d93f3a0064e1c2f0f4cdd6651f51b08d941 633 | svg/md-checkbox-outline.svg,1551268014402,1720b644baa588672f59fe2dc0554c9ed6984c8cb54b1ad3849ba466e7c0f869 634 | svg/md-checkbox.svg,1551268014403,8133fce39313a0a5fc62796c2d1bf2e9b8fd80c35f56b78f4c0b7ca7a809d71d 635 | svg/md-checkmark-circle-outline.svg,1551268014402,150518a01fa595868765ea761ebfb33915a9a4438f2504b3797fc98a7e25f037 636 | svg/md-checkmark-circle.svg,1551268014403,9c3405e5b7534f13553eb92308f8673f4077799ae322ea66ac3bb42794a30440 637 | svg/md-checkmark.svg,1551268014403,fb8bc3833ed057a8bcc15bf709134c41b18b82da5f4d82e1eb0b0d302f9fa357 638 | svg/md-clipboard.svg,1551268014403,323a36eeae4479dc331d17e54143005f770693a8dacea8e06ff980552f09829d 639 | svg/md-clock.svg,1551268014403,952f8db25cd0ee1111ee7a9e870c64797cb5815d027faa26e13e3703325259d9 640 | svg/md-close-circle-outline.svg,1551268014403,6036a6573203daa19d0441e8c1b1baf4d766d2b7a3e9297f5d7243e324a7e16a 641 | svg/md-close-circle.svg,1551268014403,54f467d2f66a068dd290522283a97f26295ab3c8499951407b8f344872381cd5 642 | svg/md-close.svg,1551268014403,0a6c2d9a4eb952094fcfea0fcc56b776bc9fa4c65344899d06a711ed7d051358 643 | svg/md-cloud-circle.svg,1551268014403,172024df5287bedfd3775925f26d32b77d8ee9c1586161368216f54eae454922 644 | svg/md-cloud-done.svg,1551268014403,cbb9380a73d8305b1ac450ad5e89c6b1bfabb2101b741bd3798649758e208a31 645 | svg/md-cloud-download.svg,1551268014403,f48df2cb0f22f46da1c0ccc0ef528a3fab5b4e65dd3d768c17667e8badccf1b3 646 | svg/md-cloud-outline.svg,1551268014404,90831ea200276555738cdab0efa1a85044ff0da31c58fdd6a6dc55ed933aacc8 647 | svg/md-cloud-upload.svg,1551268014404,0d7755ee5e4aa135b144f568b6846fafbf8ff9838f8af059469630a81c9e3cee 648 | svg/md-cloud.svg,1551268014404,9b61c23e4176790630900da670dc16517a82010bb24602657f595e420d1e68dd 649 | svg/md-cloudy.svg,1551268014404,2740d92f3971b0ab2e99cbaa8c9cb130080e1ca45a7260b5b64cabe3a1f87ba6 650 | svg/md-cloudy-night.svg,1551268014404,fc9e8d29bf8477125b63ebb39002900300dc01997bdbb128e7f45f3790b30719 651 | svg/md-code-download.svg,1551268014404,24d92590c4ecf7ec7aab361f7cad91d11a257a238dab4653fe04650f919a9310 652 | svg/md-code-working.svg,1551268014404,af664224a7922831e767d047dfe82e9cbbd1c140fb1d35c6af776dcf9c12108b 653 | svg/md-code.svg,1551268014405,08acb55f570c9aa0380e65eac2c4d2afffce088cf9430a00f1753e5eb5c9e8f3 654 | svg/md-cog.svg,1551268014404,e4c8fe6db683771ae15cf54f5c656ab27d8b76056ff9faed7f18e64859867cc6 655 | svg/md-color-fill.svg,1551268014404,00730e3a17b6f24429fed358c01d0ab7138b4c5f0c64196c2fc3de9f65d56749 656 | svg/md-color-filter.svg,1551268014404,d6dc62de49f01e69a979ae3b9601c2dbc67f767782976f87bb981303b51b0ef2 657 | svg/md-color-palette.svg,1551268014405,84095f4b342324500a64ddb0cb8d18a1b98836a75ed8944bef3fa399c3414a0d 658 | svg/md-compass.svg,1551268014405,601029cccb67c2e9e9de4e6004aeb423df630213f68ee49a75509950c6a84ce2 659 | svg/md-color-wand.svg,1551268014405,ee9b1f3d5d365f8a842d4b3bc148dd759352cf23575b8be173b14498a3e18055 660 | svg/md-contact.svg,1551268014405,59187f5cfc6642a4475379db18c9b2da180055b55b14b9f80fa5f461917a6a3f 661 | svg/md-construct.svg,1551268014405,1a6bbe17c7a1de928e2ba4380104e535493009f0e0c9ce2c97dbad6cb04dd682 662 | svg/md-contract.svg,1551268014406,80eabad4169b03691572a552db1a51123d98559d96121d2824c2a105e64347ec 663 | svg/md-contrast.svg,1551268014406,467c18b62bd26cfa3baddd6fad7b29d62389aca035154733b767f70abb4b4298 664 | svg/md-copy.svg,1551268014406,4d6fe2d44b64997995d5a9c3ecb0ab7e24aeab827462dd00a5136a90637b1689 665 | svg/md-create.svg,1551268014406,cdbd6ebb2a37ea0b8ac8cc77c1b471a9f58545c459e94271bdc38cd127c0f32a 666 | svg/md-contacts.svg,1551268014405,4e0b13767ac691de9acfba9c9bbc3f338b6ddf3c8db6bd4540f8baff430f5b1b 667 | svg/md-crop.svg,1551268014406,194fcaf6c6705ad053be18bbe013a9cee118e603edbc960688ac09474bf77adc 668 | svg/md-desktop.svg,1551268014407,742327888e65141145c068f90d7f7621b9d43691c93978a21a3ff4662b1bc61f 669 | svg/md-disc.svg,1551268014406,455b593417fbe0bfc8d75699ed2c3f1311a4efb6b116b1c2b91526c829853ac1 670 | svg/md-document.svg,1551268014406,9a423f72cd15029ce7f5ca3e2eee2bfe47ba157a926ddcef5c5c7604006632b8 671 | svg/md-cut.svg,1551268014407,ef0d54267ac28d2037f899dab180ceeaa139934cac00c6edf5b3990a78acee8c 672 | svg/md-done-all.svg,1551268014406,c0625031e380a7cd8fa13eba6bf368e9fb974523b470db533691e3564acaf83a 673 | svg/md-download.svg,1551268014406,93871ad2cdd88772cddeb6a22dc3d061a3c7528272d64a5095ac9b2e71eea1b5 674 | svg/md-egg.svg,1551268014407,328b9461102012f7d19d5c039763f80e54bd51cc67bdbcc43cc8b7e37f10f12a 675 | svg/md-expand.svg,1551268014407,354e3c83cf2a61b908e4a0653510a3ebb80e1aa4d6b0b34340bf035111714583 676 | svg/md-easel.svg,1551268014407,c1369444a77c0ea13155a32894e1fd75c99b98910c46b3861968728ebfea58f6 677 | svg/md-exit.svg,1551268014407,519a8a53e9c48097b2ffb9878ab91ab3505edc0cf770bac27b916caa7ff2da9c 678 | svg/md-eye.svg,1551268014407,f5d5dcb0087144a740e75567f4b0bd139069d463e7f7d7f165292a063f51567b 679 | svg/md-fastforward.svg,1551268014407,e1f4a87228c90219529c20035220ec478904c212afcb79861bc4bda97cfcf146 680 | svg/md-female.svg,1551268014408,1bd6eefe07ec2a93f4c8fbc9c91237c4c17ae33742d49af111ef0f9b4af8f036 681 | svg/md-eye-off.svg,1551268014407,21f659bc2ed2c9a4f58413504d68903b782c011343a2a36c0fee0206d577a7f3 682 | svg/md-cube.svg,1551268014406,e47935fce04a5ab5af0fa24d0b48d6ac0a395a45b4bc755c71a87f5cde453dcc 683 | svg/md-filing.svg,1551268014408,94ffbf0b9270f3ad3be1bb2afc773166f3e372750799b45078cf58f7b9e30473 684 | svg/md-film.svg,1551268014407,c8431229b308d022066ab92148fdf06e7efda1e550116c946bc5600a635ca4ab 685 | svg/md-fitness.svg,1551268014408,922d5e897a16dd5bf2fdfe574a89e46be97d6bde86f589b2302126084efe5ad8 686 | svg/md-finger-print.svg,1551268014408,34bf4c89bad13255dc67f8a28e9a0d57359b16a34007e7c77bc8c64805594f83 687 | svg/md-flag.svg,1551268014408,f49923a7c88a7dae370b368bcfb67ca37a2150c56feea197cb098ca4daf883d1 688 | svg/md-flame.svg,1551268014408,3ee215cc9ed591ae4cde006d49c2cf8b0b52119f721645cbc045318e856cdc38 689 | svg/md-flash-off.svg,1551268014408,d9e80df161cf65f4d279cef943f6a6f7893c071115e6ab68724f0615d27b15c3 690 | svg/md-flash.svg,1551268014408,3e020edf243435f5a57c57eb1713264a2a8a37a1c8567f6c360efc728dd12cd6 691 | svg/md-flashlight.svg,1551268014408,6fbf963c6a402c93483913c2dfc1981673cb62d49cf1b7eea89c7dd9624359c4 692 | svg/md-flask.svg,1551268014408,c20fe9b7a219db58f708a17908abead7bffd5935e68ab6eca4923e1c184ba7d0 693 | svg/md-flower.svg,1551268014408,28b4983f12cb32214f59393ad65fa7cd35404c6e25f705b250a7101dc28728da 694 | svg/md-folder-open.svg,1551268014408,980f91bfce5982e42aa0cab458d39edc94e08c7d940adf56b301146b1a9fbd9d 695 | svg/md-folder.svg,1551268014408,5044c2d38d6157f3f454e69869525ef95e207c672c25d6537b4dc79b2d47beea 696 | svg/md-football.svg,1551268014409,9e366256c93f993c210cbd7328890c5eb8d1c539777e683890f7c5055fa7b315 697 | svg/md-funnel.svg,1551268014410,5e1b42ae13df9be6481a87e28231e63fe756f5b1bb05fc082c2967c6c3c3632c 698 | svg/md-gift.svg,1551268014409,570b794618c697ea50bd6f826a69ed9f2687aaac0628f688bbf94d958ce6122f 699 | svg/md-git-branch.svg,1551268014410,515cd452045109e1e3ff64bc2ac1ff7c83718e5e4ba0e12d19f53566701c8833 700 | svg/md-git-commit.svg,1551268014409,7074633502a3d4fc299a71442f0712f339a290b53e08873ce0c9c818c61c635f 701 | svg/md-git-compare.svg,1551268014410,5379ed5f74234e6f70d0265f7571efe0894f3fac6f04314e8b2a76d8cac3d4e1 702 | svg/md-git-merge.svg,1551268014409,472d4d88572c49f54884cce089767d97883a4f05ac0b50b198548853f64c3df1 703 | svg/md-git-network.svg,1551268014409,792b9551dcfee091d08cc53d8c3b7565089c513b235c8c323350b5345e331f5d 704 | svg/md-git-pull-request.svg,1551268014410,a9fa0296a70bc2056c2385fecb5c5aaa8549085e5d100743b836a533ab6d048c 705 | svg/md-glasses.svg,1551268014410,06f2cb5d98a15c8c3e64104d5f1e935b3ed899943d9527916c9bfd96c9864e3e 706 | svg/md-grid.svg,1551268014410,cc6e94c6b484067817c47c696ab688cbbb8ae7d76464f3bb59c532d358f49e92 707 | svg/md-globe.svg,1551268014410,e0ac437efd853a1c5e1c9f046a61079a1ac7e25fbeabfaa11f4f8f9e728bf500 708 | svg/md-hammer.svg,1551268014411,43fd948b22067ffb543695af4c6596519990fd377cbf80d42e88e5c579b3b9b2 709 | svg/md-hand.svg,1551268014411,3d64de9142338bb2e1c5fd4eb05509e68b8af854a19f502d4c701b56fcd36b9a 710 | svg/md-headset.svg,1551268014411,ac5f2021f4fe9ff860250b32ef49b1528c4047cbc8842771b687f4a18bcc2d87 711 | svg/md-happy.svg,1551268014411,0a76c8f243f3b541c0e0fb28463745887c2f95dd9babec5945b1bdd201db58da 712 | svg/md-heart-dislike.svg,1551268014411,07138a1edee968e6fc930adb00b8244e9295f909801abfc5e4cecd3dacab0b66 713 | svg/md-heart-empty.svg,1551268014411,ef61617b1b3782b3aff4ebb71d87f6983c81a4ea2ae47623472388e91c760640 714 | svg/md-heart-half.svg,1551268014412,7781aa3afe6d53776a418501e78548b257a913fa3fb1d2194c436568d00b26d0 715 | svg/md-heart.svg,1551268014412,b5dd1432035582bb09b7b94382b5308c7b7a3b5e8bc8122f72edbf176d6938f9 716 | svg/md-help-buoy.svg,1551268014412,25acf307dffa5e7f62d7da8b0c52be4e35ae492fece7eae4288e505b6a40c4c6 717 | svg/md-help-circle-outline.svg,1551268014412,b8e6d86f88c20b9bfddc417f1bdea3fb8d64c1adaf3c2589c78f83f95c38a19a 718 | svg/md-help-circle.svg,1551268014412,07ef9bf15d1391e8dc071170611a0ad2530b11d8da71bb8873e5eedd31002cfc 719 | svg/md-help.svg,1551268014412,9accc6b6a118f5f3d81db5c45b22c50d9537bbe0f92095dc4218cb5a002579a7 720 | svg/md-home.svg,1551268014412,c857f435ec573ddc8d80e26a815248cc20ca76437f1a59cbc489ffd8089d535a 721 | svg/md-hourglass.svg,1551268014412,ccfd18167cd0ee4db6a1402aef02a8e961aa26ca16e0e7c9dc68c659469699ab 722 | svg/md-ice-cream.svg,1551268014412,db02964f311ee72564dce673ff40c1e16dfbb2ef0e56582ae0d8f333dd8dffeb 723 | svg/md-image.svg,1551268014412,128a7d3a6a085766afa962c28c8ed161b09cc69119e70273f66b48de3d916039 724 | svg/md-infinite.svg,1551268014412,deda75651ac0bd0a9ed7b916bdf56eb604b5a721380b73940e7a008120bb0541 725 | svg/md-information-circle-outline.svg,1551268014412,f6138fafdd9a68b8ff4f4f199be3a5cc77b295c4065a7211173924317cca39f4 726 | svg/md-images.svg,1551268014412,885d8d5e44f97012c8a91d6a74f358ad6c1691a3e4c338f905632783594cb135 727 | svg/md-information-circle.svg,1551268014413,6e08901227bc4e9253789bc35886585b51e223f9b59358d6102ead6075292b05 728 | svg/md-information.svg,1551268014413,4b85ea046e797981d769d5bb1eaf0a682b2105c1b1488cef3aee0d5b202d0f99 729 | svg/md-jet.svg,1551268014414,669d2556ff12c9a18cc0144b1a78c55b287c539ee24f0ecc379a61abe77d0df8 730 | svg/md-journal.svg,1551268014414,84626f815521f685cada652b969813ede406550d09a7b3518f17c3e21c380e71 731 | svg/md-key.svg,1551268014413,9ee75662d1d3a3026148583089065814ec5d107440b3fdad0fc397d31501a9b7 732 | svg/md-keypad.svg,1551268014413,c1d3a2bb68d99c9389f84f09af2b8d238beb4db82c0df3f3d8450ed787ed257c 733 | svg/md-leaf.svg,1551268014413,fb7526e716510b9dc91f3ad86284da1fb4bc5b3a25ccf50479aa98685fe1633a 734 | svg/md-laptop.svg,1551268014413,ca2f1036db16b0858397e9e51e82cd293b00522864c5b645ea184fc7202e55a7 735 | svg/md-link.svg,1551268014413,9078bfbc09978959f5bf1931c0af830ad4ec1d33ffa0f1b97595e10f8b619e4a 736 | svg/md-list-box.svg,1551268014413,27f6d30a5ee7ebdb451c61e436ac9aca58615e2adad0f847a0f31bedfbe9280c 737 | svg/md-list.svg,1551268014413,254ca3c2fae89888252f96224f652d9d0bb7eeafa156f5df5cfa3ea2e00e26a0 738 | svg/md-locate.svg,1551268014414,d3586105c116819a6f48eb6b6e5ec58e43f9c30c8b2a0f12a8718a604b1eb61a 739 | svg/md-lock.svg,1551268014414,82b9b0d1629006e9437254256689d755d16d37460ebfdf1ab262dd2d6457bebd 740 | svg/md-log-in.svg,1551268014414,701e3606d9b672484f86b0d38a6ee85fc974485a007048eadc7e403b937f99e8 741 | svg/md-log-out.svg,1551268014414,e4076184d560757a149b7194b034ab26c259d16e45b1bebeb78df1a2eaccad04 742 | svg/md-magnet.svg,1551268014414,f21471012cf6940e8ce11d8f7431acfead2bdd16ef835c02468ce9cb3b7c6200 743 | svg/md-mail-open.svg,1551268014415,85423e2c63745422d2de1eacfbaaa13d1cc9dc0cc280fe3a7cc540347f5256e4 744 | svg/md-mail-unread.svg,1551268014414,4e33df423efad390d8983af15ea07d5aac6c193dae7c904d2ea122d19624fd26 745 | svg/md-mail.svg,1551268014415,828c8474a9cb933c16188d25510f969508c9f98f677b7a85c33e82f6efda5bbf 746 | svg/md-male.svg,1551268014415,198d67051880839f16043e9a4168b2c8e7e5a3899256078fd52a3a998cd8dbb5 747 | svg/md-man.svg,1551268014414,1b06e95eca56fbbd01f29cc7fc7f6c2030e77483fda782a2ceff7b6610e8beb0 748 | svg/md-map.svg,1551268014414,f4e6cb89b8807605718d273837cdff052cb2254991401a373194e43a99453103 749 | svg/md-medal.svg,1551268014415,d15c41241b12de0f374cf9d1bb94c66ae52630d49c3ec2ef4b966a131a5a2d2c 750 | svg/md-medical.svg,1551268014415,80db560f97a0283c784af0cfa38227d0a116fa9dc8c37079285728e6cd0128ed 751 | svg/md-medkit.svg,1551268014415,89a88fb4f770a2268b68ccabd5749c5188fa72cd183dd58b4946d72c5e77a2c1 752 | svg/md-megaphone.svg,1551268014415,0b2a38f09a793d90316389d77dc58f5aca22ef0fc238576338f87a5602f06fa6 753 | svg/md-menu.svg,1551268014415,baff87582434108d889ff0f8b0fd3723a04a703874ade979a045741bbc8d5102 754 | svg/md-mic-off.svg,1551268014415,9d208d5006d3173c80fa643652071efca855ae864cc1b9cd653695fa2e317d10 755 | svg/md-mic.svg,1551268014415,3e22c5c31c5f65f2aae5f38217ba44e8b8a46ede57a3099fd50e8cbdd1081b7f 756 | svg/md-microphone.svg,1551268014415,e4871ff95fcd2261ac9004cbc2ca50de1b8ab274f3274650699bb9f98a802d9b 757 | svg/md-moon.svg,1551268014416,a95d9bb9473eae6d40d6b41bb9b7f55b0c86fd15c57034720c35b830f744ba42 758 | svg/md-more.svg,1551268014415,3c84188bcf29e5369233f3fce92e3c2f0b7ff40d32fc568fbd1e66daebef7597 759 | svg/md-move.svg,1551268014416,84375dd81f6376994cef233c6841c8e342df2fc7d6efffaa14a74aa291b9ba0b 760 | svg/md-musical-note.svg,1551268014416,b012ef7781177449e72ce14b90f191aff75ccfe7a976d6ed7e3e71e8c43ff2d6 761 | svg/md-musical-notes.svg,1551268014416,599eba377d51682bb5560d0dde50b379ecc1c9fea496fb8930a5ed094dc2e871 762 | svg/md-navigate.svg,1551268014416,fba61fd9e264be96a3a5780835541dfee386fac569c650b593fed5611b60598e 763 | svg/md-notifications-off.svg,1551268014416,48d033f60f987a348e8166ad1ce66b61359e862da2ec199d704c55be58c95ebf 764 | svg/md-notifications-outline.svg,1551268014416,4f0edb6d48adac6d5f12b16cab9274cec69d7b39ade56136803ae4fd9ee4ab58 765 | svg/md-notifications.svg,1551268014416,b886a35e09868c937bd822a76c92d52bf825fc15651073aa6446fa014314c918 766 | svg/md-nuclear.svg,1551268014417,95f42ae4c9086e1d1a0fce16c4b623a06fdd7625561ad4ac25f6c85500ab7ec1 767 | svg/md-nutrition.svg,1551268014416,6bfad426260b38dfc78f69c0954efc897f80b8670c9c54bc6736e38b2b93a27e 768 | svg/md-open.svg,1551268014417,0eb90cfb2930c3d9ebcf592c9fbd688a4baca1e85d8b8ba59944cc7a668324fc 769 | svg/md-options.svg,1551268014417,3edbbcf513775090753188d8195fdb91c262b2e37b827ae310aa2353f4c5eb1f 770 | svg/md-outlet.svg,1551268014416,c4fa143dcdfa7380654160ac820d163f9cd9ee39a7fc581ac1c71f4717607f6a 771 | svg/md-paper-plane.svg,1551268014417,376247b1749749c93632aa3bab1bf58567160a453b7f051909613bdbf9968874 772 | svg/md-paper.svg,1551268014417,6d3d96a81aa8a53924a074918a56f47857b91b3306ab9c6df69d037b292fc82a 773 | svg/md-partly-sunny.svg,1551268014418,0701ae60a4e7ccc366fb1efadfe31b83be84dc080ea2cd32d2fb890606863043 774 | svg/md-pause.svg,1551268014417,0d94e1455311df225a8d73537c1c4fc579c7db74220803861edf2deba5e08b2e 775 | svg/md-paw.svg,1551268014417,552a8ff2b2506e763bcf4bdd386824a9c11849aa83a0f46818d6a233eedf0df2 776 | svg/md-people.svg,1551268014417,9e0ba4a0aa4e69c7e392b1def5da00646c9900a66db424434b831559d1798171 777 | svg/md-person-add.svg,1551268014417,b940c532ebe80fec8afd241887292885a59dc258271ed9f4e93304d5aad13009 778 | svg/md-person.svg,1551268014417,4c706c5808f81da02812cfc961b20d0faafc851eddbf45c8b148f8e5fe3da9c3 779 | svg/md-phone-landscape.svg,1551268014418,6e81da9c91a9652b4aad23c5d04832a03bbd41b3aa150f24f8cb7039717bd9c5 780 | svg/md-phone-portrait.svg,1551268014418,f98dbcc4b956e2e44c430f59b92fa52441ca6c43790443ac5374ced47cdf47af 781 | svg/md-photos.svg,1551268014417,7c6307ff443b15b7615fdd2a3d84b0ac999147f6c9a8354eaf2725c3cadd58de 782 | svg/md-pie.svg,1551268014418,4cb1a7987340d21ffba27022aa923496a4b4e667ac41246ce4bcd6bec624d21d 783 | svg/md-pin.svg,1551268014418,5881fc8bce5b1f0ba0a1d15e5ba58ff387e1d7ca0d18d60da07f76db77b67d34 784 | svg/md-pint.svg,1551268014418,b633c7850f7575715482b7e8cac25da7b2c0c8a7e5125d4897a488b978b9b76d 785 | svg/md-pizza.svg,1551268014418,ee2f1cde00ce3629a8223173504bb5bf024858e7461487d1d1cf2059930de2fb 786 | svg/md-planet.svg,1551268014418,34aab41cdaca0cb39e196522fe461f317b3f2a80a553f4bd4992bf7cf1d08b24 787 | svg/md-play-circle.svg,1551268014419,d0e56be6b717c3eb3958b8cf7f569fd0de83081fa1ca7336d6e50af0e46b4989 788 | svg/md-play.svg,1551268014419,4619955d192a2c1fdac59068a576cb711538055064307dd5f45b9d9924689f0a 789 | svg/md-podium.svg,1551268014418,52d39d899ef3a0742d7d04f2a2f660482e7dd81367baae9d0d6f98e2a1d63cec 790 | svg/md-power.svg,1551268014419,5fac364bcf3ead204f2af759e28ff605383bdbe2fca8489981c698947e18b7c1 791 | svg/md-pricetag.svg,1551268014419,a511868fd0d8c18827492c4b26a4d9b564cbe48d5c4dd0806b7c75f73d650a8a 792 | svg/md-pricetags.svg,1551268014419,32c0830af509ec8a63aa2caa7b7577d25cf31541583867526d83b086fd70a0ea 793 | svg/md-print.svg,1551268014419,1a7740bfefd96e41ad8b626e9248608dc261302b12c9eead3c68ba42f5fbb9c6 794 | svg/md-pulse.svg,1551268014419,793af7f9c30a4da202a1821707eaed457207643fb4bfcddb804a9f1be1d83369 795 | svg/md-qr-scanner.svg,1551268014419,b9dfc4ad80caf6299d489152e427276999fd7f3d41ea6c8602fca2fa24322c32 796 | svg/md-quote.svg,1551268014419,d761903da0b88246f6fab8d56539418eac6a166ff32d62768b3daef2097be534 797 | svg/md-radio-button-off.svg,1551268014420,d4c58d3d8a46c0e5b4dda62483f30a7592ac51096954658b26382cdb2e1fd0c5 798 | svg/md-radio-button-on.svg,1551268014420,c29fa78841e284ecc2d47f14a9f0a8b913997bde76b2409c5bb19d24c569f2f5 799 | svg/md-radio.svg,1551268014420,2f8f51d92a311e2bd25368ae08b264bc409d8cc4908258e0a7a77b3aae3f11b3 800 | svg/md-rainy.svg,1551268014420,674bb1d7071a9806e0e6cf9c9af4cf3149c47be329456ed6991515d20a6047e2 801 | svg/md-recording.svg,1551268014420,ebf9012c9c4ec3f2cc86367a116bd36cc51e3de3ecd821d7df97679c00889d01 802 | svg/md-redo.svg,1551268014420,7b7ac5d20d6f3e2bf79ade2d892fbfcc7ce6253a8d711d9d02911d69040ed6b8 803 | svg/md-refresh-circle.svg,1551268014420,5d9338f4654fc274ab27b38912bb12c67fe1a7b37bc61ec83aa230b8f12205b1 804 | svg/md-refresh.svg,1551268014420,72c8c348c9391c4d1b2fd197a43ded45062b92fc11876bf2340c6d68f90045f7 805 | svg/md-remove-circle-outline.svg,1551268014420,0fc8c62efda05866baae1a5c9662413e8f9e796ffda563ff98b54af36407b440 806 | svg/md-remove-circle.svg,1551268014420,586b09387ed5061c3af4cc9cb8b4a1ec1ce76749459f3db9de2f1830ea1763a3 807 | svg/md-reorder.svg,1551268014421,acc222cf096debfb5f1de47f25fb79794ae696ff0bfec41d42a7efdd414833bc 808 | svg/md-remove.svg,1551268014421,6d07da7e419918bfe19e5a24af39448dfccb06d11fadbc289ebe6d9dd08e6a5e 809 | svg/md-repeat.svg,1551268014421,f23f169b2b2e529930cf8e6abcbfcacd413b8a56952b84bd5f882058bc43f5bb 810 | svg/md-resize.svg,1551268014420,e7eaa1eea25a32364ac8350bba02312240aa3f8e45e21e09bc7c7d5de1359a0d 811 | svg/md-restaurant.svg,1551268014421,5f02bfac620a9ad45e03e1d90a6554b771d5a0f401b8da71e1353f21d6d7b803 812 | svg/md-return-left.svg,1551268014421,d87c56fb851b9edc85a2a333694657ba963a11ee793b315fcd53f1dc4739c0f6 813 | svg/md-return-right.svg,1551268014421,bfe28a5109eda704b781694a3117c249723901d2698feab8e6bbd29d81cddc0c 814 | svg/md-reverse-camera.svg,1551268014421,be8fcb6ff1f1ae54bbfb4a91c75fbde2e926a5324d4610bd43b704b2cc5b5d5b 815 | svg/md-rewind.svg,1551268014421,4e677b9c82daf76c168f859fd33831e07cfa6d3cace0fcf8529c8321468f9c97 816 | svg/md-ribbon.svg,1551268014421,131509f9656ff8cfa8531177251fa1abf956681988d39057d2a645cf79030d0b 817 | svg/md-rocket.svg,1551268014421,7a30d6a5671112ef4969d775c70bf5dccd86675c3bf7b22ddcca89e213ea6457 818 | svg/md-rose.svg,1551268014422,6091c827962dbfb685b2ccb7a854fdacee97cee16614f63dfb5f4b910f912ba3 819 | svg/md-sad.svg,1551268014421,8144b89fcf732f54fc45691c44439fa76ed7f93c5f11a35b906b51770adbc860 820 | svg/md-save.svg,1551268014421,bfd3399e7673330274118445996a0a44fe209715022ad271c561dcfead93ce9b 821 | svg/md-school.svg,1551268014422,64e8e220384f65374aea5d6ca848af6d9b7f69c36e93b35f15a63b70aa0adf9b 822 | svg/md-search.svg,1551268014422,77f534239a88aa05b11f504ab932735b5c41def82544d933b6b3612a008043e4 823 | svg/md-send.svg,1551268014422,43cb0c18fa65757c33bd9fb933d1e9e49c33f1271ba0798232e4f17f1d098071 824 | svg/md-settings.svg,1551268014422,cf978fdfc7b8975e6ac09b5e24475351705525d885d397687a02f6be6852504b 825 | svg/md-share-alt.svg,1551268014422,deedc3b78c424d89807df7d91389197f1f96df6158dbe8e4f6e5792599e93e7a 826 | svg/md-share.svg,1551268014422,2de6ec7e56ad8aa503918550f5a48903cf088a752bba6882ca98f958828aeb54 827 | svg/md-shirt.svg,1551268014423,f63a65e83c1706f3ed6f5b0d8e5541dbe8fbc203e1e60471f5888c6137601b82 828 | svg/md-shuffle.svg,1551268014422,2791855bfa937cad38f2d1ad4f44d7291421b776d5e6c677632350912d45873b 829 | svg/md-skip-backward.svg,1551268014423,550abc584f99d47c82974cd89c5e0bc3374dd65818ffa1ae9dacffc0e7ed0ef5 830 | svg/md-skip-forward.svg,1551268014423,c07848003ccfa66958ddc7b3f9d74527b68cc0cbf400eccd8dd167eb6d5a0444 831 | svg/md-snow.svg,1551268014422,76f416dd2c15e05863cdbd310bff3f264f33da639c07e6f0e61d0337d37f1f3f 832 | svg/md-speedometer.svg,1551268014422,52d5c30a974b3d5092d2aaf11641d2512ccfd950d101c8ad005e67cdc3f7d9e5 833 | svg/md-square-outline.svg,1551268014423,8a6301130332762840a6e0eb8a5300340a22c82e26a9834a75286cb5f64fa770 834 | svg/md-square.svg,1551268014423,877270fe3dc9970e6a4b60ec0d0bf21f0fd38646d9415bce8b6b0cd817554191 835 | svg/md-star-half.svg,1551268014423,178ddb0b9894394ccfaed395ffd2ad9bedc55aa4b4c0f5076066e005e4b53702 836 | svg/md-star-outline.svg,1551268014423,68454e4138ff43d688cdad844bc9fbf5a0533e4d8aef5b7029882cb370819134 837 | svg/md-star.svg,1551268014424,a88ec9ccb666cad2db92530ef28bd568484e639805242c52ec41bb65684796d6 838 | svg/md-stats.svg,1551268014423,180af4824fb8f195e9cd82c8cb4d45353ccaf8a5252c1ac8d6bda9b462095d9a 839 | svg/md-stopwatch.svg,1551268014423,654cc449cc18230d37904f1b8ec43ed9d188dd37368e3c441e29d603e6ca4a1f 840 | svg/md-subway.svg,1551268014423,304207f3c637e0bc83e40340742c78390c667f0fd2958d157ce46a339aa884fd 841 | svg/md-sunny.svg,1551268014423,ebae4b97889c557e245d15111437f1deb257f234dda02d55b7723427611e4fd6 842 | svg/md-swap.svg,1551268014423,bd195800d55827d4dba8581dd3b6f6428ea770fcc3fdd4d79a326bf6ccf0d5ec 843 | svg/md-switch.svg,1551268014424,1856ebbb5632aece7d3c95f7194736029e53a39667f7d62fddb8c2be6952b06f 844 | svg/md-sync.svg,1551268014424,987b08b84d0bc19443768f5d2a0492571ac07a60c8f9c709afd02cf4878c3b21 845 | svg/md-tablet-landscape.svg,1551268014424,34a0240f7a1299dce19e30d4e16e8538a061343e68bbb6553bed8f013691b8bf 846 | svg/md-tablet-portrait.svg,1551268014424,5c82af65a91d8b2f832bd76f2d3e896526f1e97c3614796325b2848502965241 847 | svg/md-tennisball.svg,1551268014424,949305e9de6e4b8a2a47dda73e35b9f1299c04aac5ea69e4f9b7f4797bc76a0c 848 | svg/md-text.svg,1551268014424,a40d202df4335861371b6257253f276f9dbd5f65fb7908ead7c2159407f66c85 849 | svg/md-thermometer.svg,1551268014424,960c5ba5a04dceb66f5be02bef306a3f0b307cd40d3a050c34e7204fcec3f339 850 | svg/md-thumbs-down.svg,1551268014425,0b25b103ab5d9b8a5953ace78e227729a9021d715f6f6cbad3927eddcab6ab8b 851 | svg/md-thumbs-up.svg,1551268014424,a5b544ec0325eae199fd0f9aab2a34664a339d57425909ce8551caadc49b9da5 852 | svg/md-thunderstorm.svg,1551268014424,c09b5fd44bc15f2d89b7d2d0b80b3c46aef78c8215885cfccd885c4acf142cfd 853 | svg/md-time.svg,1551268014425,d1e605b30dd792d78ec6e8b18f0228eb004d6cacdb6b1acbc17e2698c8e689b3 854 | svg/md-timer.svg,1551268014424,5c348373eaa98af197dee8e7bd4698459a565f6bebd66bad0d5690ca9eee01b0 855 | svg/md-today.svg,1551268014425,aec65f2124885071a3468b9a8b26407ed053893b1e82735500b91300386fd9b4 856 | svg/md-train.svg,1551268014425,f3092e15140cd6fd099bc10aa9dcf8077b0f6abe2a2b2b91154b9bdf16fd7f43 857 | svg/md-transgender.svg,1551268014425,aca2f63ab204af82b80530b0c0b94c2589f03b06998a084a752c4f772b4fc36e 858 | svg/md-trash.svg,1551268014425,2e6bf27e7497950c9e6aaf0ce6cc84c15fc0b5447330aa0c315c0399a9578047 859 | svg/md-trending-down.svg,1551268014425,7227b7f98d2f1d0333cf4614774b03d890ad01e1c6816960fb7f6d335cd1b9b3 860 | svg/md-trending-up.svg,1551268014425,9251f2f4cd7633025cd95dde0017d8dd5b04ae0176c78ef33f70c18c02173abe 861 | svg/md-trophy.svg,1551268014425,ce6aeae493c31e324d0f25b5920cdfb03c3a180f4b723ff8aab90a1ae64307cd 862 | svg/md-tv.svg,1551268014425,e39703cf9ef9be5fdb8b9c3c40c7f3ae92ff4cb34af1a1af939526400375d541 863 | svg/md-umbrella.svg,1551268014426,7429149076c0bd0196d59f17d791d66361804ada87162110f44d120e6a616ce2 864 | svg/md-undo.svg,1551268014425,d82192d14de7e2613e73b2b92b70695cee58d71cb14969461165d892355f2a29 865 | svg/md-unlock.svg,1551268014426,3dbce5971ac525de345d386022fd0d5a4a3081fcc5bd0ccf6bbd0cdbeae5209f 866 | svg/md-videocam.svg,1551268014426,f172c97efe8d49987db729567b292d799e62b947508f993b583317a993a776d9 867 | svg/md-volume-high.svg,1551268014426,6c8ce75977611061dcfb47454ae17471c660c7615cc385bee4a9b23bfbab05f2 868 | svg/md-volume-low.svg,1551268014426,2657310fc8f4a8322df4930904ff0c9742449932eef3a734c012631270702269 869 | svg/md-volume-mute.svg,1551268014426,1f336a3dfa734cfee664086fe83f8e3de709669d298b2667ff7daf079f29cf65 870 | svg/md-volume-off.svg,1551268014426,16721f54d04ecdec03c6e39228df22f5118234876e54f4a6c0a2f62f021dc375 871 | svg/md-walk.svg,1551268014426,8f584515d337ff4665c94793a3d573e421f1049672633ec7b33639e2a3ef27f6 872 | svg/md-wallet.svg,1551268014426,e89a7e63860a26c5e80c03bbf6869557bd8d6da4f4b9d35347c8703dea7fed06 873 | svg/md-warning.svg,1551268014426,743c74c2fddc670b2fa1d8c953138414841351753458c2c58f85b6ebc93b8331 874 | svg/md-watch.svg,1551268014427,c525979d8ed5d9b54090defabfad47fb266ce20809a550585b3217b247879dd4 875 | svg/md-water.svg,1551268014427,7e15371397ff6f6bd008f9326c732694f54bdf5105955816dadbdd7d3f26348b 876 | svg/md-wifi.svg,1551268014427,c5a2ec2f33e8db18a1a320bb0e5a5f24f68517087155edef348b924953cf374a 877 | svg/md-wine.svg,1551268014427,2a44b87c7d0c7283ea685625174ed36d71d38f373b3399dc29865fbfc22b6593 878 | svg/md-woman.svg,1551268014427,f5f61f82a9a554c845f07fa1d62285433bb32771b4ac0c791e78112b9761d70d 879 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "ionic4-forms-tutorial": "ionic4-forms-tutorial" 4 | } 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | .tmp 7 | *.tmp 8 | *.tmp.* 9 | *.sublime-project 10 | *.sublime-workspace 11 | .DS_Store 12 | Thumbs.db 13 | UserInterfaceState.xcuserstate 14 | $RECYCLE.BIN/ 15 | 16 | *.log 17 | log.txt 18 | npm-debug.log* 19 | 20 | /.idea 21 | /.ionic 22 | /.sass-cache 23 | /.sourcemaps 24 | /.versions 25 | /.vscode 26 | /coverage 27 | /dist 28 | /node_modules 29 | /platforms 30 | /plugins 31 | /www 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ionic Forms Tutorial 2 | 3 | This repo is part of an Ionic 5 tutorial where you will learn everything about [Ionic forms and input validations in Ionic Framework Apps](https://ionicthemes.com/tutorials/about/forms-and-validation-in-ionic). 4 | 5 | **Please support this project by simply putting a Github star ⭐** 6 | 7 | ### Demo 8 | - [Online demo](https://ionic4-forms-tutorial.firebaseapp.com) 9 | 10 | ### Screenshots 11 |
12 | 13 | 14 | 15 |
16 | 17 | ## Install this Ionic 5 Forms Demo App 18 | ``` 19 | npm install 20 | ``` 21 | ### Browse the app 22 | ``` 23 | ionic serve 24 | ``` 25 | 26 | ## About this ionic 5 forms tutorial 27 | We will discuss the best practices for designing user-friendly forms with ionic 5. Then we will go through the differences between Angular template driven and reactive forms. 28 | 29 | For this ionic tutorial we created a mobile app example with lots of forms and validations to help you master data collection using angular reactive forms and also some techniques to excel the user experience. 30 | 31 | We will explain you the core concepts of: FormControl, FormGroup, FormBuilder and Validators and show you examples so you can learn to use them properly. 32 | 33 | We want this to be the best ionic 4 forms tutorial, so we created advanced custom validators to show you how to validate passwords, phone numbers and unique usernames. 34 | 35 | Learn more in https://ionicthemes.com/tutorials/about/forms-and-validation-in-ionic 36 | 37 | 38 | ### Get a premium Ionic 5 Starter App 39 | Did you know that we recently released [Ionic 5 Full Starter App](https://ionicthemes.com/product/ionic5-full-starter-app-pro-version)? It's an ionic 5 template that you can use to jump start your Ionic app development and save yourself hundreds of hours of design and development. 40 | 41 | It is also a Progressive Web App and has lots of beautiful forms and validations examples. 42 | Try it on your phone to see how it works! 43 | 44 | 45 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "defaultProject": "app", 5 | "newProjectRoot": "projects", 6 | "projects": { 7 | "app": { 8 | "root": "", 9 | "sourceRoot": "src", 10 | "projectType": "application", 11 | "prefix": "app", 12 | "schematics": {}, 13 | "architect": { 14 | "build": { 15 | "builder": "@angular-devkit/build-angular:browser", 16 | "options": { 17 | "outputPath": "www", 18 | "index": "src/index.html", 19 | "main": "src/main.ts", 20 | "polyfills": "src/polyfills.ts", 21 | "tsConfig": "tsconfig.app.json", 22 | "assets": [ 23 | { 24 | "glob": "**/*", 25 | "input": "src/assets", 26 | "output": "assets" 27 | }, 28 | { 29 | "glob": "**/*.svg", 30 | "input": "node_modules/ionicons/dist/ionicons/svg", 31 | "output": "./svg" 32 | } 33 | ], 34 | "styles": [ 35 | { 36 | "input": "src/theme/variables.scss" 37 | }, 38 | { 39 | "input": "src/global.scss" 40 | } 41 | ], 42 | "scripts": [] 43 | }, 44 | "configurations": { 45 | "production": { 46 | "fileReplacements": [ 47 | { 48 | "replace": "src/environments/environment.ts", 49 | "with": "src/environments/environment.prod.ts" 50 | } 51 | ], 52 | "optimization": true, 53 | "outputHashing": "all", 54 | "sourceMap": false, 55 | "extractCss": true, 56 | "namedChunks": false, 57 | "aot": true, 58 | "extractLicenses": true, 59 | "vendorChunk": false, 60 | "buildOptimizer": true, 61 | "budgets": [ 62 | { 63 | "type": "initial", 64 | "maximumWarning": "2mb", 65 | "maximumError": "5mb" 66 | } 67 | ] 68 | }, 69 | "ci": { 70 | "progress": false 71 | } 72 | } 73 | }, 74 | "serve": { 75 | "builder": "@angular-devkit/build-angular:dev-server", 76 | "options": { 77 | "browserTarget": "app:build" 78 | }, 79 | "configurations": { 80 | "production": { 81 | "browserTarget": "app:build:production" 82 | }, 83 | "ci": { 84 | "progress": false 85 | } 86 | } 87 | }, 88 | "extract-i18n": { 89 | "builder": "@angular-devkit/build-angular:extract-i18n", 90 | "options": { 91 | "browserTarget": "app:build" 92 | } 93 | }, 94 | "test": { 95 | "builder": "@angular-devkit/build-angular:karma", 96 | "options": { 97 | "main": "src/test.ts", 98 | "polyfills": "src/polyfills.ts", 99 | "tsConfig": "tsconfig.spec.json", 100 | "karmaConfig": "karma.conf.js", 101 | "styles": [], 102 | "scripts": [], 103 | "assets": [ 104 | { 105 | "glob": "favicon.ico", 106 | "input": "src/", 107 | "output": "/" 108 | }, 109 | { 110 | "glob": "**/*", 111 | "input": "src/assets", 112 | "output": "/assets" 113 | } 114 | ] 115 | }, 116 | "configurations": { 117 | "ci": { 118 | "progress": false, 119 | "watch": false 120 | } 121 | } 122 | }, 123 | "lint": { 124 | "builder": "@angular-devkit/build-angular:tslint", 125 | "options": { 126 | "tsConfig": [ 127 | "tsconfig.app.json", 128 | "tsconfig.spec.json", 129 | "e2e/tsconfig.json" 130 | ], 131 | "exclude": ["**/node_modules/**"] 132 | } 133 | }, 134 | "e2e": { 135 | "builder": "@angular-devkit/build-angular:protractor", 136 | "options": { 137 | "protractorConfig": "e2e/protractor.conf.js", 138 | "devServerTarget": "app:serve" 139 | }, 140 | "configurations": { 141 | "production": { 142 | "devServerTarget": "app:serve:production" 143 | }, 144 | "ci": { 145 | "devServerTarget": "app:serve:ci" 146 | } 147 | } 148 | }, 149 | "ionic-cordova-build": { 150 | "builder": "@ionic/angular-toolkit:cordova-build", 151 | "options": { 152 | "browserTarget": "app:build" 153 | }, 154 | "configurations": { 155 | "production": { 156 | "browserTarget": "app:build:production" 157 | } 158 | } 159 | }, 160 | "ionic-cordova-serve": { 161 | "builder": "@ionic/angular-toolkit:cordova-serve", 162 | "options": { 163 | "cordovaBuildTarget": "app:ionic-cordova-build", 164 | "devServerTarget": "app:serve" 165 | }, 166 | "configurations": { 167 | "production": { 168 | "cordovaBuildTarget": "app:ionic-cordova-build:production", 169 | "devServerTarget": "app:serve:production" 170 | } 171 | } 172 | } 173 | } 174 | } 175 | }, 176 | "cli": { 177 | "defaultCollection": "@ionic/angular-toolkit" 178 | }, 179 | "schematics": { 180 | "@ionic/angular-toolkit:component": { 181 | "styleext": "scss" 182 | }, 183 | "@ionic/angular-toolkit:page": { 184 | "styleext": "scss" 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /browserslist: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # You can see what browsers were selected by your queries by running: 6 | # npx browserslist 7 | 8 | > 0.5% 9 | last 2 versions 10 | Firefox ESR 11 | not dead 12 | not IE 9-11 # For IE 9-11 support, remove 'not'. 13 | -------------------------------------------------------------------------------- /e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // Protractor configuration file, see link for more information 2 | // https://github.com/angular/protractor/blob/master/lib/config.ts 3 | 4 | const { SpecReporter } = require('jasmine-spec-reporter'); 5 | 6 | exports.config = { 7 | allScriptsTimeout: 11000, 8 | specs: [ 9 | './src/**/*.e2e-spec.ts' 10 | ], 11 | capabilities: { 12 | 'browserName': 'chrome' 13 | }, 14 | directConnect: true, 15 | baseUrl: 'http://localhost:4200/', 16 | framework: 'jasmine', 17 | jasmineNodeOpts: { 18 | showColors: true, 19 | defaultTimeoutInterval: 30000, 20 | print: function() {} 21 | }, 22 | onPrepare() { 23 | require('ts-node').register({ 24 | project: require('path').join(__dirname, './tsconfig.json') 25 | }); 26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('new App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should be blank', () => { 11 | page.navigateTo(); 12 | expect(page.getParagraphText()).toContain('Start with Ionic UI Components'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getParagraphText() { 9 | return element(by.deepCss('app-root ion-content')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "www", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "**", 12 | "destination": "/index.html" 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ionic-3/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | # We recommend you to keep these unchanged 11 | end_of_line = lf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /ionic-3/.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | *~ 5 | *.sw[mnpcod] 6 | *.log 7 | *.tmp 8 | *.tmp.* 9 | log.txt 10 | *.sublime-project 11 | *.sublime-workspace 12 | .vscode/ 13 | npm-debug.log* 14 | 15 | .idea/ 16 | .sass-cache/ 17 | .tmp/ 18 | .versions/ 19 | coverage/ 20 | dist/ 21 | node_modules/ 22 | tmp/ 23 | temp/ 24 | hooks/ 25 | platforms/ 26 | plugins/ 27 | plugins/android.json 28 | plugins/ios.json 29 | www/ 30 | $RECYCLE.BIN/ 31 | 32 | .DS_Store 33 | Thumbs.db 34 | UserInterfaceState.xcuserstate 35 | -------------------------------------------------------------------------------- /ionic-3/.io-config.json: -------------------------------------------------------------------------------- 1 | {"app_id":"6e8c940e","api_key":"ccc6d03303fdd396acfdf57b29e065529cba9d6615ae38f0"} -------------------------------------------------------------------------------- /ionic-3/README.md: -------------------------------------------------------------------------------- 1 | ## Ionic 3 Forms 2 | 3 | ### Complete Tutorial in: https://ionicthemes.com/tutorials/about/forms-and-validation-in-ionic 4 | 5 | **Please support this project by simply putting a Github star ⭐. Share this library with friends on Twitter and everywhere else you can. 🙏** 6 | 7 | This repo is part of an Ionic 3 tutorial where you will learn everything about Ionic forms and input validations in Ionic apps. 8 | 9 | We will discuss the best practices for designing user-friendly forms with ionic. Then we will go through the differences between Angular template driven and reactive forms. 10 | 11 | For this ionic tutorial we created a mobile app example with lots of forms and validations to help you master data collection using angular reactive forms and also some techniques to excel the user experience. 12 | 13 | We will explain you the core concepts of: FormControl, FormGroup, FormBuilder and Validators and show you examples so you can learn to use them properly. 14 | 15 | We want this to be the best ionic forms tutorial, so we created advanced custom validators to show you how to validate passwords, phone numbers and unique usernames. 16 | 17 | Learn more in https://ionicthemes.com/tutorials/about/forms-and-validation-in-ionic 18 | -------------------------------------------------------------------------------- /ionic-3/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | formValidatios 4 | An awesome Ionic/Cordova app. 5 | Ionic Framework Team 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /ionic-3/ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "formValidatios", 3 | "app_id": "6e8c940e", 4 | "type": "ionic-angular", 5 | "integrations": { 6 | "cordova": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /ionic-3/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "formvalidatios", 3 | "author": "Ionic Framework", 4 | "homepage": "http://ionicframework.com/", 5 | "private": true, 6 | "scripts": { 7 | "build": "ionic-app-scripts build", 8 | "watch": "ionic-app-scripts watch", 9 | "serve:before": "watch", 10 | "emulate:before": "build", 11 | "deploy:before": "build", 12 | "build:before": "build", 13 | "run:before": "build" 14 | }, 15 | "dependencies": { 16 | "@angular/common": "4.1.0", 17 | "@angular/compiler": "4.1.0", 18 | "@angular/compiler-cli": "4.1.0", 19 | "@angular/core": "4.1.0", 20 | "@angular/forms": "4.1.0", 21 | "@angular/http": "4.1.0", 22 | "@angular/platform-browser": "4.1.0", 23 | "@angular/platform-browser-dynamic": "4.1.0", 24 | "@ionic-native/core": "3.6.1", 25 | "@ionic-native/splash-screen": "3.6.1", 26 | "@ionic-native/status-bar": "3.6.1", 27 | "@ionic/storage": "2.0.1", 28 | "angular2-text-mask": "8.0.1", 29 | "cordova-ios": "^4.4.0", 30 | "cordova-plugin-console": "^1.0.7", 31 | "cordova-plugin-device": "^1.1.6", 32 | "cordova-plugin-splashscreen": "^4.0.3", 33 | "cordova-plugin-statusbar": "^2.2.3", 34 | "cordova-plugin-whitelist": "^1.3.2", 35 | "google-libphonenumber": "2.0.15", 36 | "ionic-angular": "3.2.1", 37 | "ionic-plugin-keyboard": "^2.2.1", 38 | "ionicons": "3.0.0", 39 | "rxjs": "5.1.1", 40 | "sw-toolbox": "3.6.0", 41 | "text-mask-addons": "3.5.1", 42 | "zone.js": "0.8.10" 43 | }, 44 | "devDependencies": { 45 | "@ionic/app-scripts": "1.3.7", 46 | "typescript": "2.2.1" 47 | }, 48 | "description": "formValidatios: An Ionic project", 49 | "cordovaPlugins": [ 50 | "cordova-plugin-device", 51 | "cordova-plugin-console", 52 | "cordova-plugin-whitelist", 53 | "cordova-plugin-splashscreen", 54 | "cordova-plugin-statusbar", 55 | "ionic-plugin-keyboard" 56 | ], 57 | "cordovaPlatforms": [], 58 | "cordova": { 59 | "plugins": { 60 | "cordova-plugin-console": {}, 61 | "cordova-plugin-device": {}, 62 | "cordova-plugin-splashscreen": {}, 63 | "cordova-plugin-statusbar": {}, 64 | "cordova-plugin-whitelist": {}, 65 | "ionic-plugin-keyboard": {} 66 | }, 67 | "platforms": [ 68 | "ios" 69 | ] 70 | } 71 | } -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /ionic-3/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/icon.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /ionic-3/resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /ionic-3/resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/resources/splash.png -------------------------------------------------------------------------------- /ionic-3/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Platform } from 'ionic-angular'; 3 | import { StatusBar} from "@ionic-native/status-bar"; 4 | 5 | import { FormPage } from '../pages/form/form'; 6 | 7 | 8 | @Component({ 9 | template: `` 10 | }) 11 | 12 | export class MyApp { 13 | 14 | rootPage: any = FormPage; 15 | 16 | constructor( 17 | platform: Platform, 18 | public statusBar: StatusBar) { 19 | platform.ready().then(() => { 20 | // Okay, so the platform is ready and our plugins are available. 21 | // Here you can do any higher level native things you might need. 22 | this.statusBar.styleDefault(); 23 | }) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ionic-3/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { IonicApp, IonicModule } from 'ionic-angular'; 3 | import { MyApp } from './app.component'; 4 | import { FormPage } from '../pages/form/form'; 5 | import { UserPage } from '../pages/user/user'; 6 | import { StatusBar} from "@ionic-native/status-bar"; 7 | import { BrowserModule } from '@angular/platform-browser'; 8 | import { ValidatorsModule } from '../validators/validators.module'; 9 | 10 | @NgModule({ 11 | declarations: [ 12 | MyApp, 13 | FormPage, 14 | UserPage 15 | ], 16 | imports: [ 17 | BrowserModule, 18 | IonicModule.forRoot(MyApp), 19 | ValidatorsModule 20 | ], 21 | bootstrap: [IonicApp], 22 | entryComponents: [ 23 | MyApp, 24 | FormPage, 25 | UserPage 26 | ], 27 | providers: [ 28 | StatusBar 29 | ] 30 | }) 31 | export class AppModule {} 32 | -------------------------------------------------------------------------------- /ionic-3/src/app/app.scss: -------------------------------------------------------------------------------- 1 | // http://ionicframework.com/docs/v2/theming/ 2 | 3 | 4 | // App Global Sass 5 | // -------------------------------------------------- 6 | // Put style rules here that you want to apply globally. These 7 | // styles are for the entire app and not just one component. 8 | // Additionally, this file can be also used as an entry point 9 | // to import other Sass files to be included in the output CSS. 10 | // 11 | // Shared Sass variables, which can be used to adjust Ionic's 12 | // default Sass variables, belong in "theme/variables.scss". 13 | // 14 | // To declare rules for a specific mode, create a child rule 15 | // for the .md, .ios, or .wp mode classes. The mode class is 16 | // automatically applied to the element in the app. 17 | -------------------------------------------------------------------------------- /ionic-3/src/app/main.ts: -------------------------------------------------------------------------------- 1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 2 | 3 | import { AppModule } from './app.module'; 4 | 5 | platformBrowserDynamic().bootstrapModule(AppModule); 6 | -------------------------------------------------------------------------------- /ionic-3/src/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/ionic-3/src/assets/icon/favicon.ico -------------------------------------------------------------------------------- /ionic-3/src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Declaration files are how the Typescript compiler knows about the type information(or shape) of an object. 3 | They're what make intellisense work and make Typescript know all about your code. 4 | 5 | A wildcard module is declared below to allow third party libraries to be used in an app even if they don't 6 | provide their own type declarations. 7 | 8 | To learn more about using third party libraries in an Ionic app, check out the docs here: 9 | http://ionicframework.com/docs/v2/resources/third-party-libs/ 10 | 11 | For more info on type definition files, check out the Typescript docs here: 12 | https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html 13 | */ 14 | declare module '*'; -------------------------------------------------------------------------------- /ionic-3/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ionic App 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /ionic-3/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ionic", 3 | "short_name": "Ionic", 4 | "start_url": "index.html", 5 | "display": "standalone", 6 | "icons": [{ 7 | "src": "assets/imgs/logo.png", 8 | "sizes": "512x512", 9 | "type": "image/png" 10 | }], 11 | "background_color": "#4e8ef7", 12 | "theme_color": "#4e8ef7" 13 | } -------------------------------------------------------------------------------- /ionic-3/src/pages/form/form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ionic 3 Forms & Validations 4 | 5 | 6 | 7 | 8 |
9 | 10 | Username 11 | 12 | 13 |
14 | 15 |
16 | {{ validation.message }} 17 |
18 |
19 |
20 | 21 | 22 | Name 23 | 24 | 25 |
26 | 27 |
28 | {{ validation.message }} 29 |
30 |
31 |
32 | 33 | 34 | Last name 35 | 36 | 37 |
38 | 39 |
40 | {{ validation.message }} 41 |
42 |
43 |
44 | 45 | 46 | Email 47 | 48 | 49 |
50 | 51 |
52 | {{ validation.message }} 53 |
54 |
55 |
56 | 57 | 58 | Gender 59 | 60 | {{ gender }} 61 | 62 | 63 | 64 | 65 |
66 | 67 | Country 68 | 69 | {{item.name}} 70 | 71 | 72 | 73 | 74 | 75 |
76 | 77 |
78 | {{ validation.message }} 79 |
80 |
81 |
82 |
83 | 84 | 85 |
86 | 87 | Password 88 | 89 | 90 |
91 | 92 |
93 | {{ validation.message }} 94 |
95 |
96 |
97 | 98 | 99 | Confirm Password 100 | 101 | 102 |
103 | 104 |
105 | {{ validation.message }} 106 |
107 |
108 |
109 |
110 | 111 |
112 | 113 |
114 | {{ validation.message }} 115 |
116 |
117 |
118 | 119 | 120 | I accept terms and conditions 121 | 122 | 123 |
124 | 125 |
126 | {{ validation.message }} 127 |
128 |
129 |
130 | 131 | 132 |
133 |
134 | -------------------------------------------------------------------------------- /ionic-3/src/pages/form/form.model.ts: -------------------------------------------------------------------------------- 1 | import libphonenumber from 'google-libphonenumber'; 2 | 3 | export class Country { 4 | iso: string; 5 | name: string; 6 | code: string; 7 | sample_phone: string; 8 | phone_mask: Array; 9 | 10 | constructor (iso: string, name: string) { 11 | this.iso = iso; 12 | this.name = name; 13 | 14 | let phoneUtil = libphonenumber.PhoneNumberUtil.getInstance(), 15 | PNF = libphonenumber.PhoneNumberFormat, 16 | PNT = libphonenumber.PhoneNumberType, 17 | country_example_number = phoneUtil.getExampleNumberForType(this.iso, PNT.MOBILE), 18 | // We need to define what kind of country phone number type we are going to use as a mask. 19 | // You can choose between many types including: 20 | // - FIXED_LINE 21 | // - MOBILE 22 | // - For more types please refer to google libphonenumber repo (https://github.com/googlei18n/libphonenumber/blob/f9e9424769964ce1970c6ed2bd60b25b976dfe6f/javascript/i18n/phonenumbers/phonenumberutil.js#L913) 23 | example_number_formatted = phoneUtil.format(country_example_number, PNF.NATIONAL); 24 | // We need to define how are we going to format the phone number 25 | // You can choose between many formats including: 26 | // - NATIONAL 27 | // - INTERNATIONAL 28 | // - E164 29 | // - RFC3966 30 | 31 | this.sample_phone = example_number_formatted; 32 | this.code = "+" + country_example_number.getCountryCode(); 33 | 34 | // Now let's transform the formatted example number into a valid text-mask 35 | // Inspired in text-mask example (https://github.com/text-mask/text-mask/blob/master/componentDocumentation.md#included-conformtomask) 36 | this.phone_mask = this.getMaskFromString(example_number_formatted); 37 | } 38 | 39 | getMaskFromString(string: string): Array { 40 | let _string_chars = string.split(''), 41 | _digit_reg_exp = new RegExp(/\d/), 42 | _mask = _string_chars.map((char) => { 43 | // Replace any digit with a digit RegExp 44 | return (_digit_reg_exp.test(char)) ? _digit_reg_exp : char; 45 | }); 46 | 47 | return _mask; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /ionic-3/src/pages/form/form.scss: -------------------------------------------------------------------------------- 1 | page-form { 2 | 3 | .term 4 | { 5 | padding-top: 20px; 6 | } 7 | 8 | .terms-checkbox-label 9 | { 10 | overflow: visible; 11 | text-overflow: initial; 12 | white-space: initial; 13 | opacity: 0.5; 14 | font-size: 14px; 15 | font-weight: bold; 16 | } 17 | 18 | .error-message 19 | { 20 | color: red; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ionic-3/src/pages/form/form.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms'; 3 | import { NavController } from 'ionic-angular'; 4 | import { UserPage } from '../../pages/user/user'; 5 | 6 | import { UsernameValidator } from '../../validators/username.validator'; 7 | import { PasswordValidator } from '../../validators/password.validator'; 8 | import { PhoneValidator } from '../../validators/phone.validator'; 9 | 10 | import { Country } from './form.model'; 11 | 12 | import emailMask from 'text-mask-addons/dist/emailMask'; 13 | 14 | @Component({ 15 | selector: 'page-form', 16 | templateUrl: 'form.html' 17 | }) 18 | 19 | export class FormPage { 20 | 21 | validations_form: FormGroup; 22 | matching_passwords_group: FormGroup; 23 | country_phone_group: FormGroup; 24 | 25 | emailMask = emailMask; 26 | 27 | countries: Array; 28 | genders: Array; 29 | 30 | constructor(public navCtrl: NavController, public formBuilder: FormBuilder) { } 31 | 32 | ionViewWillLoad() { 33 | this.countries = [ 34 | new Country('UY', 'Uruguay'), 35 | new Country('US', 'United States'), 36 | new Country('AR', 'Argentina') 37 | ]; 38 | 39 | this.genders = [ 40 | "Male", 41 | "Female" 42 | ]; 43 | 44 | this.matching_passwords_group = new FormGroup({ 45 | password: new FormControl('', Validators.compose([ 46 | Validators.minLength(5), 47 | Validators.required, 48 | Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$') 49 | ])), 50 | confirm_password: new FormControl('', Validators.required) 51 | }, (formGroup: FormGroup) => { 52 | return PasswordValidator.areEqual(formGroup); 53 | }); 54 | 55 | let country = new FormControl(this.countries[0], Validators.required); 56 | let phone = new FormControl('', Validators.compose([ 57 | Validators.required, 58 | PhoneValidator.validCountryPhone(country) 59 | ])); 60 | this.country_phone_group = new FormGroup({ 61 | country: country, 62 | phone: phone 63 | }); 64 | 65 | this.validations_form = this.formBuilder.group({ 66 | username: new FormControl('', Validators.compose([ 67 | UsernameValidator.validUsername, 68 | Validators.maxLength(25), 69 | Validators.minLength(5), 70 | Validators.pattern('^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$'), 71 | Validators.required 72 | ])), 73 | name: new FormControl('', Validators.required), 74 | lastname: new FormControl('', Validators.required), 75 | email: new FormControl('', Validators.compose([ 76 | Validators.required, 77 | Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$') 78 | ])), 79 | gender: new FormControl(this.genders[0], Validators.required), 80 | country_phone: this.country_phone_group, 81 | matching_passwords: this.matching_passwords_group, 82 | terms: new FormControl(true, Validators.pattern('true')) 83 | }); 84 | } 85 | 86 | validation_messages = { 87 | 'username': [ 88 | { type: 'required', message: 'Username is required.' }, 89 | { type: 'minlength', message: 'Username must be at least 5 characters long.' }, 90 | { type: 'maxlength', message: 'Username cannot be more than 25 characters long.' }, 91 | { type: 'pattern', message: 'Your username must contain only numbers and letters.' }, 92 | { type: 'validUsername', message: 'Your username has already been taken.' } 93 | ], 94 | 'name': [ 95 | { type: 'required', message: 'Name is required.' } 96 | ], 97 | 'lastname': [ 98 | { type: 'required', message: 'Last name is required.' } 99 | ], 100 | 'email': [ 101 | { type: 'required', message: 'Email is required.' }, 102 | { type: 'pattern', message: 'Enter a valid email.' } 103 | ], 104 | 'phone': [ 105 | { type: 'required', message: 'Phone is required.' }, 106 | { type: 'validCountryPhone', message: 'Phone incorrect for the country selected' } 107 | ], 108 | 'password': [ 109 | { type: 'required', message: 'Password is required.' }, 110 | { type: 'minlength', message: 'Password must be at least 5 characters long.' }, 111 | { type: 'pattern', message: 'Your password must contain at least one uppercase, one lowercase, and one number.' } 112 | ], 113 | 'confirm_password': [ 114 | { type: 'required', message: 'Confirm password is required' } 115 | ], 116 | 'matching_passwords': [ 117 | { type: 'areEqual', message: 'Password mismatch' } 118 | ], 119 | 'terms': [ 120 | { type: 'pattern', message: 'You must accept terms and conditions.' } 121 | ], 122 | }; 123 | 124 | onSubmit(values){ 125 | this.navCtrl.push(UserPage); 126 | } 127 | 128 | } 129 | -------------------------------------------------------------------------------- /ionic-3/src/pages/user/user.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Ionic 3 Forms & Validations 5 | 6 | 7 | 8 | 9 | 10 |

Thanks for submiting your info!

11 |

Check more awesome tutorials in ionicthemes.com/tutorials

12 |
13 | -------------------------------------------------------------------------------- /ionic-3/src/pages/user/user.scss: -------------------------------------------------------------------------------- 1 | page-contact { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /ionic-3/src/pages/user/user.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { NavController } from 'ionic-angular'; 3 | 4 | @Component({ 5 | selector: 'page-user', 6 | templateUrl: 'user.html' 7 | }) 8 | export class UserPage { 9 | 10 | constructor(public navCtrl: NavController) { 11 | 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /ionic-3/src/service-worker.js: -------------------------------------------------------------------------------- 1 | // tick this to make the cache invalidate and update 2 | const CACHE_VERSION = 1; 3 | const CURRENT_CACHES = { 4 | 'read-through': 'read-through-cache-v' + CACHE_VERSION 5 | }; 6 | 7 | self.addEventListener('activate', (event) => { 8 | // Delete all caches that aren't named in CURRENT_CACHES. 9 | // While there is only one cache in this example, the same logic will handle the case where 10 | // there are multiple versioned caches. 11 | const expectedCacheNames = Object.keys(CURRENT_CACHES).map((key) => { 12 | return CURRENT_CACHES[key]; 13 | }); 14 | 15 | event.waitUntil( 16 | caches.keys().then((cacheNames) => { 17 | return Promise.all( 18 | cacheNames.map((cacheName) => { 19 | if (expectedCacheNames.indexOf(cacheName) === -1) { 20 | // If this cache name isn't present in the array of "expected" cache names, then delete it. 21 | console.log('Deleting out of date cache:', cacheName); 22 | return caches.delete(cacheName); 23 | } 24 | }) 25 | ); 26 | }) 27 | ); 28 | }); 29 | 30 | // This sample illustrates an aggressive approach to caching, in which every valid response is 31 | // cached and every request is first checked against the cache. 32 | // This may not be an appropriate approach if your web application makes requests for 33 | // arbitrary URLs as part of its normal operation (e.g. a RSS client or a news aggregator), 34 | // as the cache could end up containing large responses that might not end up ever being accessed. 35 | // Other approaches, like selectively caching based on response headers or only caching 36 | // responses served from a specific domain, might be more appropriate for those use cases. 37 | self.addEventListener('fetch', (event) => { 38 | 39 | event.respondWith( 40 | caches.open(CURRENT_CACHES['read-through']).then((cache) => { 41 | return cache.match(event.request).then((response) => { 42 | if (response) { 43 | // If there is an entry in the cache for event.request, then response will be defined 44 | // and we can just return it. 45 | 46 | return response; 47 | } 48 | 49 | // Otherwise, if there is no entry in the cache for event.request, response will be 50 | // undefined, and we need to fetch() the resource. 51 | console.log(' No response for %s found in cache. ' + 52 | 'About to fetch from network...', event.request.url); 53 | 54 | // We call .clone() on the request since we might use it in the call to cache.put() later on. 55 | // Both fetch() and cache.put() "consume" the request, so we need to make a copy. 56 | // (see https://fetch.spec.whatwg.org/#dom-request-clone) 57 | return fetch(event.request.clone()).then((response) => { 58 | 59 | // Optional: add in extra conditions here, e.g. response.type == 'basic' to only cache 60 | // responses from the same domain. See https://fetch.spec.whatwg.org/#concept-response-type 61 | if (response.status < 400 && response.type === 'basic') { 62 | // We need to call .clone() on the response object to save a copy of it to the cache. 63 | // (https://fetch.spec.whatwg.org/#dom-request-clone) 64 | cache.put(event.request, response.clone()); 65 | } 66 | 67 | // Return the original response object, which will be used to fulfill the resource request. 68 | return response; 69 | }); 70 | }).catch((error) => { 71 | // This catch() will handle exceptions that arise from the match() or fetch() operations. 72 | // Note that a HTTP error response (e.g. 404) will NOT trigger an exception. 73 | // It will return a normal response object that has the appropriate error code set. 74 | console.error(' Read-through caching failed:', error); 75 | 76 | throw error; 77 | }); 78 | }) 79 | ); 80 | }); -------------------------------------------------------------------------------- /ionic-3/src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/v2/theming/ 3 | @import "ionic.globals"; 4 | 5 | 6 | // Shared Variables 7 | // -------------------------------------------------- 8 | // To customize the look and feel of this app, you can override 9 | // the Sass variables found in Ionic's source scss files. 10 | // To view all the possible Ionic variables, see: 11 | // http://ionicframework.com/docs/v2/theming/overriding-ionic-variables/ 12 | 13 | $text-color: #000; 14 | $background-color: #fff; 15 | 16 | 17 | // Named Color Variables 18 | // -------------------------------------------------- 19 | // Named colors makes it easy to reuse colors on various components. 20 | // It's highly recommended to change the default colors 21 | // to match your app's branding. Ionic uses a Sass map of 22 | // colors so you can add, rename and remove colors as needed. 23 | // The "primary" color is the only required color in the map. 24 | 25 | $colors: ( 26 | primary: #387ef5, 27 | secondary: #32db64, 28 | danger: #f53d3d, 29 | light: #f4f4f4, 30 | dark: #222, 31 | favorite: #69BB7B 32 | ); 33 | 34 | 35 | // App iOS Variables 36 | // -------------------------------------------------- 37 | // iOS only Sass variables can go here 38 | 39 | 40 | 41 | 42 | // App Material Design Variables 43 | // -------------------------------------------------- 44 | // Material Design only Sass variables can go here 45 | 46 | 47 | 48 | 49 | // App Windows Variables 50 | // -------------------------------------------------- 51 | // Windows only Sass variables can go here 52 | 53 | 54 | 55 | 56 | // App Theme 57 | // -------------------------------------------------- 58 | // Ionic apps can have different themes applied, which can 59 | // then be future customized. This import comes last 60 | // so that the above variables are used and Ionic's 61 | // default are overridden. 62 | 63 | @import "ionic.theme.default"; 64 | 65 | 66 | // Ionicons 67 | // -------------------------------------------------- 68 | // The premium icon font for Ionic. For more info, please see: 69 | // http://ionicframework.com/docs/v2/ionicons/ 70 | 71 | $ionicons-font-path: "../assets/fonts"; 72 | @import "ionicons"; 73 | -------------------------------------------------------------------------------- /ionic-3/src/validators/country.validator.ts: -------------------------------------------------------------------------------- 1 | import { Directive, forwardRef, Input } from '@angular/core'; 2 | import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; 3 | 4 | export const COUNTRY_VALIDATOR: any = { 5 | provide: NG_VALIDATORS, 6 | useExisting: forwardRef(() => CountryValidator), 7 | multi: true 8 | }; 9 | 10 | @Directive({ 11 | selector: '[validateCountry][formControlName],[validateCountry][formControl],[validateCountry][ngModel]', 12 | providers: [COUNTRY_VALIDATOR] 13 | }) 14 | 15 | export class CountryValidator implements Validator { 16 | @Input() validateCountry: string; 17 | 18 | validate(c: AbstractControl): { [key: string]: any } { 19 | // self value 20 | // let country = c.value; 21 | let phone = c.root.get(this.validateCountry); 22 | phone.updateValueAndValidity(); 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ionic-3/src/validators/password.validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl, FormGroup } from '@angular/forms'; 2 | 3 | export class PasswordValidator { 4 | 5 | // Inspired on: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview 6 | static areEqual(formGroup: FormGroup) { 7 | let val; 8 | let valid = true; 9 | 10 | for (let key in formGroup.controls) { 11 | if (formGroup.controls.hasOwnProperty(key)) { 12 | let control: FormControl = formGroup.controls[key]; 13 | 14 | if (val === undefined) { 15 | val = control.value 16 | } else { 17 | if (val !== control.value) { 18 | valid = false; 19 | break; 20 | } 21 | } 22 | } 23 | } 24 | 25 | if (valid) { 26 | return null; 27 | } 28 | 29 | return { 30 | areEqual: true 31 | }; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ionic-3/src/validators/phone.validator.ts: -------------------------------------------------------------------------------- 1 | import { AbstractControl, ValidatorFn } from '@angular/forms'; 2 | import libphonenumber from 'google-libphonenumber'; 3 | 4 | export class PhoneValidator { 5 | 6 | // Inspired on: https://github.com/yuyang041060120/ng2-validation/blob/master/src/equal-to/validator.ts 7 | static validCountryPhone = (countryControl: AbstractControl): ValidatorFn => { 8 | let subscribe: boolean = false; 9 | 10 | return (phoneControl: AbstractControl): {[key: string]: boolean} => { 11 | if (!subscribe) { 12 | subscribe = true; 13 | countryControl.valueChanges.subscribe(() => { 14 | phoneControl.updateValueAndValidity(); 15 | }); 16 | } 17 | 18 | if(phoneControl.value !== ""){ 19 | try{ 20 | const phoneUtil = libphonenumber.PhoneNumberUtil.getInstance(); 21 | let phoneNumber = "" + phoneControl.value + "", 22 | region = countryControl.value.iso, 23 | number = phoneUtil.parse(phoneNumber, region), 24 | isValidNumber = phoneUtil.isValidNumber(number); 25 | 26 | if(isValidNumber){ 27 | return null; 28 | } 29 | }catch(e){ 30 | // console.log(e); 31 | return { 32 | validCountryPhone: true 33 | }; 34 | } 35 | 36 | return { 37 | validCountryPhone: true 38 | }; 39 | } 40 | else{ 41 | return null; 42 | } 43 | }; 44 | }; 45 | } 46 | -------------------------------------------------------------------------------- /ionic-3/src/validators/username.validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl } from '@angular/forms'; 2 | 3 | export class UsernameValidator { 4 | 5 | static validUsername(fc: FormControl){ 6 | 7 | if(fc.value.toLowerCase() === "abc123" || fc.value.toLowerCase() === "123abc"){ 8 | return { 9 | validUsername: true 10 | }; 11 | } else { 12 | return null; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ionic-3/src/validators/validators.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | 3 | import { TextMaskModule } from 'angular2-text-mask'; 4 | 5 | @NgModule({ 6 | exports: [ 7 | TextMaskModule 8 | ] 9 | }) 10 | export class ValidatorsModule {} 11 | -------------------------------------------------------------------------------- /ionic-3/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "declaration": true, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "lib": [ 8 | "dom", 9 | "es2015" 10 | ], 11 | "module": "es2015", 12 | "moduleResolution": "node", 13 | "target": "es5", 14 | "sourceMap": true 15 | }, 16 | "include": [ 17 | "src/**/*.ts" 18 | ], 19 | "exclude": [ 20 | "node_modules" 21 | ], 22 | "compileOnSave": false, 23 | "atom": { 24 | "rewriteTsconfig": false 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ionic-3/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-duplicate-variable": true, 4 | "no-unused-variable": [ 5 | true 6 | ] 7 | }, 8 | "rulesDirectory": [ 9 | "node_modules/tslint-eslint-rules/dist/rules" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /ionic.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-forms-tutorial", 3 | "integrations": {}, 4 | "type": "angular" 5 | } 6 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, '../coverage'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false 30 | }); 31 | }; 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-angular-forms", 3 | "version": "2.0.0", 4 | "author": "IonicThemes Team", 5 | "homepage": "https://ionicthemes.com/", 6 | "scripts": { 7 | "ng": "ng", 8 | "start": "ng serve", 9 | "build": "ng build", 10 | "test": "ng test", 11 | "lint": "ng lint", 12 | "e2e": "ng e2e" 13 | }, 14 | "private": true, 15 | "dependencies": { 16 | "@angular/common": "~9.1.6", 17 | "@angular/core": "~9.1.6", 18 | "@angular/forms": "~9.1.6", 19 | "@angular/platform-browser": "~9.1.6", 20 | "@angular/platform-browser-dynamic": "~9.1.6", 21 | "@angular/router": "~9.1.6", 22 | "@ionic-native/core": "^5.0.7", 23 | "@ionic-native/splash-screen": "^5.0.0", 24 | "@ionic-native/status-bar": "^5.0.0", 25 | "@ionic/angular": "^5.0.0", 26 | "google-libphonenumber": "^3.2.9", 27 | "rxjs": "~6.5.1", 28 | "tslib": "^1.10.0", 29 | "zone.js": "~0.10.2" 30 | }, 31 | "devDependencies": { 32 | "@angular-devkit/build-angular": "~0.901.5", 33 | "@angular/cli": "~9.1.5", 34 | "@angular/compiler": "~9.1.6", 35 | "@angular/compiler-cli": "~9.1.6", 36 | "@angular/language-service": "~9.1.6", 37 | "@ionic/angular-toolkit": "^2.1.1", 38 | "@types/node": "^12.11.1", 39 | "@types/jasmine": "~3.5.0", 40 | "@types/jasminewd2": "~2.0.3", 41 | "codelyzer": "^5.1.2", 42 | "jasmine-core": "~3.5.0", 43 | "jasmine-spec-reporter": "~4.2.1", 44 | "karma": "~5.0.0", 45 | "karma-chrome-launcher": "~3.1.0", 46 | "karma-coverage-istanbul-reporter": "~2.1.0", 47 | "karma-jasmine": "~3.0.1", 48 | "karma-jasmine-html-reporter": "^1.4.2", 49 | "protractor": "~5.4.3", 50 | "ts-node": "~8.3.0", 51 | "tslint": "~6.1.0", 52 | "typescript": "~3.8.3" 53 | }, 54 | "description": "An Ionic project to explain how to use Angular Reactive Forms" 55 | } 56 | -------------------------------------------------------------------------------- /src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; 3 | 4 | const routes: Routes = [ 5 | { 6 | path: 'user', 7 | loadChildren: () => import('./user/user.module').then( m => m.UserPageModule) 8 | }, 9 | { 10 | path: 'form', 11 | loadChildren: () => import('./form/form.module').then( m => m.FormPageModule) 12 | }, 13 | { 14 | path: '', 15 | redirectTo: 'form', 16 | pathMatch: 'full' 17 | } 18 | ]; 19 | 20 | @NgModule({ 21 | imports: [ 22 | RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) 23 | ], 24 | exports: [RouterModule] 25 | }) 26 | export class AppRoutingModule { } 27 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/src/app/app.component.scss -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; 2 | import { TestBed, async } from '@angular/core/testing'; 3 | 4 | import { Platform } from '@ionic/angular'; 5 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 6 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 7 | 8 | import { AppComponent } from './app.component'; 9 | 10 | describe('AppComponent', () => { 11 | 12 | let statusBarSpy, splashScreenSpy, platformReadySpy, platformSpy; 13 | 14 | beforeEach(async(() => { 15 | statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); 16 | splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']); 17 | platformReadySpy = Promise.resolve(); 18 | platformSpy = jasmine.createSpyObj('Platform', { ready: platformReadySpy }); 19 | 20 | TestBed.configureTestingModule({ 21 | declarations: [AppComponent], 22 | schemas: [CUSTOM_ELEMENTS_SCHEMA], 23 | providers: [ 24 | { provide: StatusBar, useValue: statusBarSpy }, 25 | { provide: SplashScreen, useValue: splashScreenSpy }, 26 | { provide: Platform, useValue: platformSpy }, 27 | ], 28 | }).compileComponents(); 29 | })); 30 | 31 | it('should create the app', () => { 32 | const fixture = TestBed.createComponent(AppComponent); 33 | const app = fixture.debugElement.componentInstance; 34 | expect(app).toBeTruthy(); 35 | }); 36 | 37 | it('should initialize the app', async () => { 38 | TestBed.createComponent(AppComponent); 39 | expect(platformSpy.ready).toHaveBeenCalled(); 40 | await platformReadySpy; 41 | expect(statusBarSpy.styleDefault).toHaveBeenCalled(); 42 | expect(splashScreenSpy.hide).toHaveBeenCalled(); 43 | }); 44 | 45 | // TODO: add more tests! 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | import { Platform } from '@ionic/angular'; 4 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 5 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 6 | 7 | @Component({ 8 | selector: 'app-root', 9 | templateUrl: 'app.component.html', 10 | styleUrls: ['app.component.scss'] 11 | }) 12 | export class AppComponent { 13 | constructor( 14 | private platform: Platform, 15 | private splashScreen: SplashScreen, 16 | private statusBar: StatusBar 17 | ) { 18 | this.initializeApp(); 19 | } 20 | 21 | initializeApp() { 22 | this.platform.ready().then(() => { 23 | this.statusBar.styleDefault(); 24 | this.splashScreen.hide(); 25 | }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { BrowserModule } from '@angular/platform-browser'; 3 | import { RouteReuseStrategy } from '@angular/router'; 4 | 5 | import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; 6 | import { SplashScreen } from '@ionic-native/splash-screen/ngx'; 7 | import { StatusBar } from '@ionic-native/status-bar/ngx'; 8 | 9 | import { AppComponent } from './app.component'; 10 | import { AppRoutingModule } from './app-routing.module'; 11 | 12 | @NgModule({ 13 | declarations: [AppComponent], 14 | entryComponents: [], 15 | imports: [ 16 | BrowserModule, 17 | IonicModule.forRoot(), 18 | AppRoutingModule 19 | ], 20 | providers: [ 21 | StatusBar, 22 | SplashScreen, 23 | { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } 24 | ], 25 | bootstrap: [AppComponent] 26 | }) 27 | export class AppModule {} 28 | -------------------------------------------------------------------------------- /src/app/form/country-phone.model.ts: -------------------------------------------------------------------------------- 1 | import libphonenumber from 'google-libphonenumber'; 2 | 3 | export class CountryPhone { 4 | iso: string; 5 | name: string; 6 | code: string; 7 | sample_phone: string; 8 | 9 | constructor (iso: string, name: string) { 10 | this.iso = iso; 11 | this.name = name; 12 | 13 | let phoneUtil = libphonenumber.PhoneNumberUtil.getInstance(), 14 | PNF = libphonenumber.PhoneNumberFormat, 15 | PNT = libphonenumber.PhoneNumberType, 16 | country_example_number = phoneUtil.getExampleNumberForType(this.iso, PNT.MOBILE), 17 | // We need to define what kind of country phone number type we are going to use as a mask. 18 | // You can choose between many types including: 19 | // - FIXED_LINE 20 | // - MOBILE 21 | // - For more types please refer to google libphonenumber repo (https://github.com/googlei18n/libphonenumber/blob/f9e9424769964ce1970c6ed2bd60b25b976dfe6f/javascript/i18n/phonenumbers/phonenumberutil.js#L913) 22 | example_number_formatted = phoneUtil.format(country_example_number, PNF.NATIONAL); 23 | // We need to define how are we going to format the phone number 24 | // You can choose between many formats including: 25 | // - NATIONAL 26 | // - INTERNATIONAL 27 | // - E164 28 | // - RFC3966 29 | 30 | this.sample_phone = example_number_formatted; 31 | this.code = "+" + country_example_number.getCountryCode(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/form/form.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | import { IonicModule } from '@ionic/angular'; 6 | import { FormPage } from './form.page'; 7 | 8 | const routes: Routes = [ 9 | { 10 | path: '', 11 | component: FormPage 12 | } 13 | ]; 14 | 15 | @NgModule({ 16 | imports: [ 17 | CommonModule, 18 | FormsModule, 19 | IonicModule, 20 | ReactiveFormsModule, 21 | RouterModule.forChild(routes) 22 | ], 23 | declarations: [FormPage] 24 | }) 25 | export class FormPageModule {} 26 | -------------------------------------------------------------------------------- /src/app/form/form.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ionic Angular Forms 4 | 5 | 6 | 7 | 8 |
9 | 10 | Username 11 | 12 | 13 |
14 | 15 |
16 | {{ validation.message }} 17 |
18 |
19 |
20 | 21 | 22 | Name 23 | 24 | 25 |
26 | 27 |
28 | {{ validation.message }} 29 |
30 |
31 |
32 | 33 | 34 | Last name 35 | 36 | 37 |
38 | 39 |
40 | {{ validation.message }} 41 |
42 |
43 |
44 | 45 | 46 | Email 47 | 48 | 49 |
50 | 51 |
52 | {{ validation.message }} 53 |
54 |
55 |
56 | 57 | 58 | Gender 59 | 60 | {{gender}} 61 | 62 | 63 | 64 | 65 |
66 | 67 | Country 68 | 69 | {{item.name}} 70 | 71 | 72 | 73 | Phone 74 | 75 | 76 |
77 | 78 |
79 | {{ validation.message }} 80 |
81 |
82 |
83 |
84 | 85 | 86 |
87 | 88 | Password 89 | 90 | 91 |
92 | 93 |
94 | {{ validation.message }} 95 |
96 |
97 |
98 | 99 | 100 | Confirm Password 101 | 102 | 103 |
104 | 105 |
106 | {{ validation.message }} 107 |
108 |
109 |
110 |
111 | 112 |
113 | 114 |
115 | {{ validation.message }} 116 |
117 |
118 |
119 | 120 | 121 | I accept terms and conditions 122 | 123 | 124 |
125 | 126 |
127 | {{ validation.message }} 128 |
129 |
130 |
131 | Submit data 132 |
133 |
134 | -------------------------------------------------------------------------------- /src/app/form/form.page.scss: -------------------------------------------------------------------------------- 1 | ion-content { 2 | .error-message 3 | { 4 | color: red; 5 | font-size: 14px; 6 | margin-left: 10px; 7 | margin-top: 10px; 8 | } 9 | 10 | .submit-btn { 11 | margin: 48px 12px 12px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/form/form.page.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms'; 3 | import { UsernameValidator } from '../validators/username.validator'; 4 | import { PhoneValidator } from '../validators/phone.validator'; 5 | import { PasswordValidator } from '../validators/password.validator'; 6 | import { CountryPhone } from './country-phone.model'; 7 | import { Router } from '@angular/router'; 8 | 9 | @Component({ 10 | selector: 'app-form', 11 | templateUrl: './form.page.html', 12 | styleUrls: ['./form.page.scss'], 13 | }) 14 | export class FormPage implements OnInit { 15 | 16 | validations_form: FormGroup; 17 | matching_passwords_group: FormGroup; 18 | country_phone_group: FormGroup; 19 | 20 | countries: Array; 21 | genders: Array; 22 | 23 | constructor( 24 | public formBuilder: FormBuilder, 25 | private router: Router 26 | ) { } 27 | 28 | ngOnInit() { 29 | // We just use a few random countries, however, you can use the countries you need by just adding them to this list. 30 | // also you can use a library to get all the countries from the world. 31 | this.countries = [ 32 | new CountryPhone('UY', 'Uruguay'), 33 | new CountryPhone('US', 'United States'), 34 | new CountryPhone('BR', 'Brasil') 35 | ]; 36 | 37 | this.genders = [ 38 | "Male", 39 | "Female" 40 | ]; 41 | 42 | this.matching_passwords_group = new FormGroup({ 43 | password: new FormControl('', Validators.compose([ 44 | Validators.minLength(5), 45 | Validators.required, 46 | Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]+$') 47 | ])), 48 | confirm_password: new FormControl('', Validators.required) 49 | }, (formGroup: FormGroup) => { 50 | return PasswordValidator.areEqual(formGroup); 51 | }); 52 | 53 | let country = new FormControl(this.countries[0], Validators.required); 54 | let phone = new FormControl('', Validators.compose([ 55 | Validators.required, 56 | PhoneValidator.validCountryPhone(country) 57 | ])); 58 | this.country_phone_group = new FormGroup({ 59 | country: country, 60 | phone: phone 61 | }); 62 | 63 | this.validations_form = this.formBuilder.group({ 64 | username: new FormControl('', Validators.compose([ 65 | UsernameValidator.validUsername, 66 | Validators.maxLength(25), 67 | Validators.minLength(5), 68 | Validators.pattern('^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$'), 69 | Validators.required 70 | ])), 71 | name: new FormControl('', Validators.required), 72 | lastname: new FormControl('', Validators.required), 73 | email: new FormControl('', Validators.compose([ 74 | Validators.required, 75 | Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$') 76 | ])), 77 | gender: new FormControl(this.genders[0], Validators.required), 78 | country_phone: this.country_phone_group, 79 | matching_passwords: this.matching_passwords_group, 80 | terms: new FormControl(true, Validators.pattern('true')) 81 | }); 82 | } 83 | 84 | validation_messages = { 85 | 'username': [ 86 | { type: 'required', message: 'Username is required.' }, 87 | { type: 'minlength', message: 'Username must be at least 5 characters long.' }, 88 | { type: 'maxlength', message: 'Username cannot be more than 25 characters long.' }, 89 | { type: 'pattern', message: 'Your username must contain only numbers and letters.' }, 90 | { type: 'validUsername', message: 'Your username has already been taken.' } 91 | ], 92 | 'name': [ 93 | { type: 'required', message: 'Name is required.' } 94 | ], 95 | 'lastname': [ 96 | { type: 'required', message: 'Last name is required.' } 97 | ], 98 | 'email': [ 99 | { type: 'required', message: 'Email is required.' }, 100 | { type: 'pattern', message: 'Please enter a valid email.' } 101 | ], 102 | 'phone': [ 103 | { type: 'required', message: 'Phone is required.' }, 104 | { type: 'validCountryPhone', message: 'The phone is incorrect for the selected country.' } 105 | ], 106 | 'password': [ 107 | { type: 'required', message: 'Password is required.' }, 108 | { type: 'minlength', message: 'Password must be at least 5 characters long.' }, 109 | { type: 'pattern', message: 'Your password must contain at least one uppercase, one lowercase, and one number.' } 110 | ], 111 | 'confirm_password': [ 112 | { type: 'required', message: 'Confirm password is required.' } 113 | ], 114 | 'matching_passwords': [ 115 | { type: 'areEqual', message: 'Password mismatch.' } 116 | ], 117 | 'terms': [ 118 | { type: 'pattern', message: 'You must accept terms and conditions.' } 119 | ], 120 | }; 121 | 122 | onSubmit(values){ 123 | console.log(values); 124 | this.router.navigate(["/user"]); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/app/user/user.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { Routes, RouterModule } from '@angular/router'; 5 | 6 | import { IonicModule } from '@ionic/angular'; 7 | 8 | import { UserPage } from './user.page'; 9 | 10 | const routes: Routes = [ 11 | { 12 | path: '', 13 | component: UserPage 14 | } 15 | ]; 16 | 17 | @NgModule({ 18 | imports: [ 19 | CommonModule, 20 | FormsModule, 21 | IonicModule, 22 | RouterModule.forChild(routes) 23 | ], 24 | declarations: [UserPage] 25 | }) 26 | export class UserPageModule {} 27 | -------------------------------------------------------------------------------- /src/app/user/user.page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ionic Angular Forms 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

Thanks for using this tutorial!

12 |

Check more awesome Ionic tutorials in ionicthemes.com/tutorials

13 |
14 | -------------------------------------------------------------------------------- /src/app/user/user.page.scss: -------------------------------------------------------------------------------- 1 | ion-content { 2 | --padding-start: 12px; 3 | --padding-end: 12px; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/user/user.page.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-user', 5 | templateUrl: './user.page.html', 6 | styleUrls: ['./user.page.scss'], 7 | }) 8 | export class UserPage { 9 | 10 | constructor() { } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/app/validators/password.validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl, FormGroup } from '@angular/forms'; 2 | 3 | export class PasswordValidator { 4 | 5 | // Inspired on: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview 6 | static areEqual(formGroup: FormGroup) { 7 | let val; 8 | let valid = true; 9 | 10 | for (let key in formGroup.controls) { 11 | if (formGroup.controls.hasOwnProperty(key)) { 12 | let control: FormControl = formGroup.controls[key]; 13 | 14 | if (val === undefined) { 15 | val = control.value 16 | } else { 17 | if (val !== control.value) { 18 | valid = false; 19 | break; 20 | } 21 | } 22 | } 23 | } 24 | 25 | if (valid) { 26 | return null; 27 | } 28 | 29 | return { 30 | areEqual: true 31 | }; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app/validators/phone.validator.ts: -------------------------------------------------------------------------------- 1 | import { AbstractControl, ValidatorFn } from '@angular/forms'; 2 | import libphonenumber from 'google-libphonenumber'; 3 | 4 | export class PhoneValidator { 5 | 6 | // Inspired on: https://github.com/yuyang041060120/ng2-validation/blob/master/src/equal-to/validator.ts 7 | static validCountryPhone = (countryControl: AbstractControl): ValidatorFn => { 8 | let subscribe: boolean = false; 9 | 10 | return (phoneControl: AbstractControl): {[key: string]: boolean} => { 11 | if (!subscribe) { 12 | subscribe = true; 13 | countryControl.valueChanges.subscribe(() => { 14 | phoneControl.updateValueAndValidity(); 15 | }); 16 | } 17 | 18 | if(phoneControl.value !== ""){ 19 | try{ 20 | const phoneUtil = libphonenumber.PhoneNumberUtil.getInstance(); 21 | let phoneNumber = "" + phoneControl.value + "", 22 | region = countryControl.value.iso, 23 | number = phoneUtil.parse(phoneNumber, region), 24 | isValidNumber = phoneUtil.isValidNumber(number); 25 | 26 | if(isValidNumber){ 27 | return null; 28 | } 29 | }catch(e){ 30 | // console.log(e); 31 | return { 32 | validCountryPhone: true 33 | }; 34 | } 35 | 36 | return { 37 | validCountryPhone: true 38 | }; 39 | } 40 | else{ 41 | return null; 42 | } 43 | }; 44 | }; 45 | } 46 | -------------------------------------------------------------------------------- /src/app/validators/username.validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl } from '@angular/forms'; 2 | 3 | export class UsernameValidator { 4 | 5 | static validUsername(fc: FormControl){ 6 | 7 | if(fc.value.toLowerCase() === "abc123" || fc.value.toLowerCase() === "123abc"){ 8 | return { 9 | validUsername: true 10 | }; 11 | } else { 12 | return null; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/assets/icon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionicthemes/ionic-forms-and-validations/655151600b7d2e4ddbc45196c7b83cfd80ad5258/src/assets/icon/favicon.png -------------------------------------------------------------------------------- /src/assets/shapes.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /src/global.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * App Global CSS 3 | * ---------------------------------------------------------------------------- 4 | * Put style rules here that you want to apply globally. These styles are for 5 | * the entire app and not just one component. Additionally, this file can be 6 | * used as an entry point to import other CSS/Sass files to be included in the 7 | * output CSS. 8 | * For more information on global stylesheets, visit the documentation: 9 | * https://ionicframework.com/docs/layout/global-stylesheets 10 | */ 11 | 12 | /* Core CSS required for Ionic components to work properly */ 13 | @import "~@ionic/angular/css/core.css"; 14 | 15 | /* Basic CSS for apps built with Ionic */ 16 | @import "~@ionic/angular/css/normalize.css"; 17 | @import "~@ionic/angular/css/structure.css"; 18 | @import "~@ionic/angular/css/typography.css"; 19 | @import '~@ionic/angular/css/display.css'; 20 | 21 | /* Optional CSS utils that can be commented out */ 22 | @import "~@ionic/angular/css/padding.css"; 23 | @import "~@ionic/angular/css/float-elements.css"; 24 | @import "~@ionic/angular/css/text-alignment.css"; 25 | @import "~@ionic/angular/css/text-transformation.css"; 26 | @import "~@ionic/angular/css/flex-utils.css"; 27 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Ionic App 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 22 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 23 | 24 | /** 25 | * Web Animations `@angular/platform-browser/animations` 26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 28 | */ 29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 30 | 31 | /** 32 | * By default, zone.js will patch all possible macroTask and DomEvents 33 | * user can disable parts of macroTask/DomEvents patch by setting following flags 34 | * because those flags need to be set before `zone.js` being loaded, and webpack 35 | * will put import in the top of bundle, so user need to create a separate file 36 | * in this directory (for example: zone-flags.ts), and put the following flags 37 | * into that file, and then add the following code before importing zone.js. 38 | * import './zone-flags.ts'; 39 | * 40 | * The flags allowed in zone-flags.ts are listed here. 41 | * 42 | * The following flags will work for all browsers. 43 | * 44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 46 | * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 47 | * 48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 50 | * 51 | * (window as any).__Zone_enable_cross_context_check = true; 52 | * 53 | */ 54 | 55 | import './zone-flags'; 56 | 57 | /*************************************************************************************************** 58 | * Zone JS is required by default for Angular itself. 59 | */ 60 | 61 | import 'zone.js/dist/zone'; // Included with Angular CLI. 62 | 63 | 64 | /*************************************************************************************************** 65 | * APPLICATION IMPORTS 66 | */ 67 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /src/theme/variables.scss: -------------------------------------------------------------------------------- 1 | // Ionic Variables and Theming. For more info, please see: 2 | // http://ionicframework.com/docs/theming/ 3 | 4 | /** Ionic CSS Variables **/ 5 | :root { 6 | /** primary **/ 7 | --ion-color-primary: #3880ff; 8 | --ion-color-primary-rgb: 56, 128, 255; 9 | --ion-color-primary-contrast: #ffffff; 10 | --ion-color-primary-contrast-rgb: 255, 255, 255; 11 | --ion-color-primary-shade: #3171e0; 12 | --ion-color-primary-tint: #4c8dff; 13 | 14 | /** secondary **/ 15 | --ion-color-secondary: #3dc2ff; 16 | --ion-color-secondary-rgb: 61, 194, 255; 17 | --ion-color-secondary-contrast: #ffffff; 18 | --ion-color-secondary-contrast-rgb: 255, 255, 255; 19 | --ion-color-secondary-shade: #36abe0; 20 | --ion-color-secondary-tint: #50c8ff; 21 | 22 | /** tertiary **/ 23 | --ion-color-tertiary: #5260ff; 24 | --ion-color-tertiary-rgb: 82, 96, 255; 25 | --ion-color-tertiary-contrast: #ffffff; 26 | --ion-color-tertiary-contrast-rgb: 255, 255, 255; 27 | --ion-color-tertiary-shade: #4854e0; 28 | --ion-color-tertiary-tint: #6370ff; 29 | 30 | /** success **/ 31 | --ion-color-success: #2dd36f; 32 | --ion-color-success-rgb: 45, 211, 111; 33 | --ion-color-success-contrast: #ffffff; 34 | --ion-color-success-contrast-rgb: 255, 255, 255; 35 | --ion-color-success-shade: #28ba62; 36 | --ion-color-success-tint: #42d77d; 37 | 38 | /** warning **/ 39 | --ion-color-warning: #ffc409; 40 | --ion-color-warning-rgb: 255, 196, 9; 41 | --ion-color-warning-contrast: #000000; 42 | --ion-color-warning-contrast-rgb: 0, 0, 0; 43 | --ion-color-warning-shade: #e0ac08; 44 | --ion-color-warning-tint: #ffca22; 45 | 46 | /** danger **/ 47 | --ion-color-danger: #eb445a; 48 | --ion-color-danger-rgb: 235, 68, 90; 49 | --ion-color-danger-contrast: #ffffff; 50 | --ion-color-danger-contrast-rgb: 255, 255, 255; 51 | --ion-color-danger-shade: #cf3c4f; 52 | --ion-color-danger-tint: #ed576b; 53 | 54 | /** dark **/ 55 | --ion-color-dark: #222428; 56 | --ion-color-dark-rgb: 34, 36, 40; 57 | --ion-color-dark-contrast: #ffffff; 58 | --ion-color-dark-contrast-rgb: 255, 255, 255; 59 | --ion-color-dark-shade: #1e2023; 60 | --ion-color-dark-tint: #383a3e; 61 | 62 | /** medium **/ 63 | --ion-color-medium: #92949c; 64 | --ion-color-medium-rgb: 146, 148, 156; 65 | --ion-color-medium-contrast: #ffffff; 66 | --ion-color-medium-contrast-rgb: 255, 255, 255; 67 | --ion-color-medium-shade: #808289; 68 | --ion-color-medium-tint: #9d9fa6; 69 | 70 | /** light **/ 71 | --ion-color-light: #f4f5f8; 72 | --ion-color-light-rgb: 244, 245, 248; 73 | --ion-color-light-contrast: #000000; 74 | --ion-color-light-contrast-rgb: 0, 0, 0; 75 | --ion-color-light-shade: #d7d8da; 76 | --ion-color-light-tint: #f5f6f9; 77 | } 78 | 79 | @media (prefers-color-scheme: dark) { 80 | /* 81 | * Dark Colors 82 | * ------------------------------------------- 83 | */ 84 | 85 | body { 86 | --ion-color-primary: #428cff; 87 | --ion-color-primary-rgb: 66,140,255; 88 | --ion-color-primary-contrast: #ffffff; 89 | --ion-color-primary-contrast-rgb: 255,255,255; 90 | --ion-color-primary-shade: #3a7be0; 91 | --ion-color-primary-tint: #5598ff; 92 | 93 | --ion-color-secondary: #50c8ff; 94 | --ion-color-secondary-rgb: 80,200,255; 95 | --ion-color-secondary-contrast: #ffffff; 96 | --ion-color-secondary-contrast-rgb: 255,255,255; 97 | --ion-color-secondary-shade: #46b0e0; 98 | --ion-color-secondary-tint: #62ceff; 99 | 100 | --ion-color-tertiary: #6a64ff; 101 | --ion-color-tertiary-rgb: 106,100,255; 102 | --ion-color-tertiary-contrast: #ffffff; 103 | --ion-color-tertiary-contrast-rgb: 255,255,255; 104 | --ion-color-tertiary-shade: #5d58e0; 105 | --ion-color-tertiary-tint: #7974ff; 106 | 107 | --ion-color-success: #2fdf75; 108 | --ion-color-success-rgb: 47,223,117; 109 | --ion-color-success-contrast: #000000; 110 | --ion-color-success-contrast-rgb: 0,0,0; 111 | --ion-color-success-shade: #29c467; 112 | --ion-color-success-tint: #44e283; 113 | 114 | --ion-color-warning: #ffd534; 115 | --ion-color-warning-rgb: 255,213,52; 116 | --ion-color-warning-contrast: #000000; 117 | --ion-color-warning-contrast-rgb: 0,0,0; 118 | --ion-color-warning-shade: #e0bb2e; 119 | --ion-color-warning-tint: #ffd948; 120 | 121 | --ion-color-danger: #ff4961; 122 | --ion-color-danger-rgb: 255,73,97; 123 | --ion-color-danger-contrast: #ffffff; 124 | --ion-color-danger-contrast-rgb: 255,255,255; 125 | --ion-color-danger-shade: #e04055; 126 | --ion-color-danger-tint: #ff5b71; 127 | 128 | --ion-color-dark: #f4f5f8; 129 | --ion-color-dark-rgb: 244,245,248; 130 | --ion-color-dark-contrast: #000000; 131 | --ion-color-dark-contrast-rgb: 0,0,0; 132 | --ion-color-dark-shade: #d7d8da; 133 | --ion-color-dark-tint: #f5f6f9; 134 | 135 | --ion-color-medium: #989aa2; 136 | --ion-color-medium-rgb: 152,154,162; 137 | --ion-color-medium-contrast: #000000; 138 | --ion-color-medium-contrast-rgb: 0,0,0; 139 | --ion-color-medium-shade: #86888f; 140 | --ion-color-medium-tint: #a2a4ab; 141 | 142 | --ion-color-light: #222428; 143 | --ion-color-light-rgb: 34,36,40; 144 | --ion-color-light-contrast: #ffffff; 145 | --ion-color-light-contrast-rgb: 255,255,255; 146 | --ion-color-light-shade: #1e2023; 147 | --ion-color-light-tint: #383a3e; 148 | } 149 | 150 | /* 151 | * iOS Dark Theme 152 | * ------------------------------------------- 153 | */ 154 | 155 | .ios body { 156 | --ion-background-color: #000000; 157 | --ion-background-color-rgb: 0,0,0; 158 | 159 | --ion-text-color: #ffffff; 160 | --ion-text-color-rgb: 255,255,255; 161 | 162 | --ion-color-step-50: #0d0d0d; 163 | --ion-color-step-100: #1a1a1a; 164 | --ion-color-step-150: #262626; 165 | --ion-color-step-200: #333333; 166 | --ion-color-step-250: #404040; 167 | --ion-color-step-300: #4d4d4d; 168 | --ion-color-step-350: #595959; 169 | --ion-color-step-400: #666666; 170 | --ion-color-step-450: #737373; 171 | --ion-color-step-500: #808080; 172 | --ion-color-step-550: #8c8c8c; 173 | --ion-color-step-600: #999999; 174 | --ion-color-step-650: #a6a6a6; 175 | --ion-color-step-700: #b3b3b3; 176 | --ion-color-step-750: #bfbfbf; 177 | --ion-color-step-800: #cccccc; 178 | --ion-color-step-850: #d9d9d9; 179 | --ion-color-step-900: #e6e6e6; 180 | --ion-color-step-950: #f2f2f2; 181 | 182 | --ion-toolbar-background: #0d0d0d; 183 | 184 | --ion-item-background: #000000; 185 | } 186 | 187 | 188 | /* 189 | * Material Design Dark Theme 190 | * ------------------------------------------- 191 | */ 192 | 193 | .md body { 194 | --ion-background-color: #121212; 195 | --ion-background-color-rgb: 18,18,18; 196 | 197 | --ion-text-color: #ffffff; 198 | --ion-text-color-rgb: 255,255,255; 199 | 200 | --ion-border-color: #222222; 201 | 202 | --ion-color-step-50: #1e1e1e; 203 | --ion-color-step-100: #2a2a2a; 204 | --ion-color-step-150: #363636; 205 | --ion-color-step-200: #414141; 206 | --ion-color-step-250: #4d4d4d; 207 | --ion-color-step-300: #595959; 208 | --ion-color-step-350: #656565; 209 | --ion-color-step-400: #717171; 210 | --ion-color-step-450: #7d7d7d; 211 | --ion-color-step-500: #898989; 212 | --ion-color-step-550: #949494; 213 | --ion-color-step-600: #a0a0a0; 214 | --ion-color-step-650: #acacac; 215 | --ion-color-step-700: #b8b8b8; 216 | --ion-color-step-750: #c4c4c4; 217 | --ion-color-step-800: #d0d0d0; 218 | --ion-color-step-850: #dbdbdb; 219 | --ion-color-step-900: #e7e7e7; 220 | --ion-color-step-950: #f3f3f3; 221 | 222 | --ion-item-background: #1e1e1e; 223 | 224 | --ion-toolbar-background: #1f1f1f; 225 | 226 | --ion-tab-bar-background: #1f1f1f; 227 | } 228 | } -------------------------------------------------------------------------------- /src/zone-flags.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Prevents Angular change detection from 3 | * running with certain Web Component callbacks 4 | */ 5 | (window as any).__Zone_disable_customElements = true; 6 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": [ 8 | "src/main.ts", 9 | "src/polyfills.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.ts", 13 | "src/**/*.d.ts" 14 | ], 15 | "exclude": [ 16 | "src/**/*.spec.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "downlevelIteration": true, 9 | "experimentalDecorators": true, 10 | "module": "esnext", 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es2015", 14 | "lib": [ 15 | "es2018", 16 | "dom" 17 | ] 18 | }, 19 | "angularCompilerOptions": { 20 | "fullTemplateTypeCheck": true, 21 | "strictInjectionParameters": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "align": { 5 | "options": [ 6 | "parameters", 7 | "statements" 8 | ] 9 | }, 10 | "array-type": false, 11 | "arrow-return-shorthand": true, 12 | "curly": true, 13 | "deprecation": { 14 | "severity": "warning" 15 | }, 16 | "component-class-suffix": [true, "Page", "Component"], 17 | "contextual-lifecycle": true, 18 | "directive-class-suffix": true, 19 | "directive-selector": [ 20 | true, 21 | "attribute", 22 | "app", 23 | "camelCase" 24 | ], 25 | "component-selector": [ 26 | true, 27 | "element", 28 | "app", 29 | "kebab-case" 30 | ], 31 | "eofline": true, 32 | "import-blacklist": [ 33 | true, 34 | "rxjs/Rx" 35 | ], 36 | "import-spacing": true, 37 | "indent": { 38 | "options": [ 39 | "spaces" 40 | ] 41 | }, 42 | "max-classes-per-file": false, 43 | "max-line-length": [ 44 | true, 45 | 140 46 | ], 47 | "member-ordering": [ 48 | true, 49 | { 50 | "order": [ 51 | "static-field", 52 | "instance-field", 53 | "static-method", 54 | "instance-method" 55 | ] 56 | } 57 | ], 58 | "no-console": [ 59 | true, 60 | "debug", 61 | "info", 62 | "time", 63 | "timeEnd", 64 | "trace" 65 | ], 66 | "no-empty": false, 67 | "no-inferrable-types": [ 68 | true, 69 | "ignore-params" 70 | ], 71 | "no-non-null-assertion": true, 72 | "no-redundant-jsdoc": true, 73 | "no-switch-case-fall-through": true, 74 | "no-var-requires": false, 75 | "object-literal-key-quotes": [ 76 | true, 77 | "as-needed" 78 | ], 79 | "quotemark": [ 80 | true, 81 | "single" 82 | ], 83 | "semicolon": { 84 | "options": [ 85 | "always" 86 | ] 87 | }, 88 | "space-before-function-paren": { 89 | "options": { 90 | "anonymous": "never", 91 | "asyncArrow": "always", 92 | "constructor": "never", 93 | "method": "never", 94 | "named": "never" 95 | } 96 | }, 97 | "typedef-whitespace": { 98 | "options": [ 99 | { 100 | "call-signature": "nospace", 101 | "index-signature": "nospace", 102 | "parameter": "nospace", 103 | "property-declaration": "nospace", 104 | "variable-declaration": "nospace" 105 | }, 106 | { 107 | "call-signature": "onespace", 108 | "index-signature": "onespace", 109 | "parameter": "onespace", 110 | "property-declaration": "onespace", 111 | "variable-declaration": "onespace" 112 | } 113 | ] 114 | }, 115 | "variable-name": { 116 | "options": [ 117 | "ban-keywords", 118 | "check-format", 119 | "allow-pascal-case" 120 | ] 121 | }, 122 | "whitespace": { 123 | "options": [ 124 | "check-branch", 125 | "check-decl", 126 | "check-operator", 127 | "check-separator", 128 | "check-type", 129 | "check-typecast" 130 | ] 131 | }, 132 | "no-conflicting-lifecycle": true, 133 | "no-host-metadata-property": true, 134 | "no-input-rename": true, 135 | "no-inputs-metadata-property": true, 136 | "no-output-native": true, 137 | "no-output-on-prefix": true, 138 | "no-output-rename": true, 139 | "no-outputs-metadata-property": true, 140 | "template-banana-in-box": true, 141 | "template-no-negated-async": true, 142 | "use-lifecycle-interface": true, 143 | "use-pipe-transform-interface": true, 144 | "object-literal-sort-keys": false 145 | }, 146 | "rulesDirectory": [ 147 | "codelyzer" 148 | ] 149 | } 150 | --------------------------------------------------------------------------------